博客所在VPS已成功从洛山基机房搬迁到纽约机房

前天突然接到通知说机房搬迁,然后网站已一起无法访问,明天下午恢复正常。

纽约机房连国内的速度与洛山基机房相差不大

另外,vps软件全部进行不更新

操作系统 ubuntu 8.10 server 32 [9.04在vps面板上只有64位的]

网站运行环境  nginx 0.7 + mysql 5.0 + php 5.2.10 + xcache + memcache + zend

目前vps运行良好

ubuntu下编译安装nginx+php5+mysql5+pdo mysql+xcache+memcache

此方法适用 ubuntu/debian 及centos等相关平台(主要是因为采用lnmp,lnmp目前支持的这些平台)

先采用LNMP自动编译安装好nignx+php+mysql+zend optimizer+eaccelerator

然后编译安装最新版的xcache及memcache软件

因为lnmp安装脚本默认没有安装pdo-mysql模块

所以后面采用编译相关模块的方法添加php5所需的模块

php-pdo、php xcache、php memcache模块

转载请加上文章来源及本博的地址http://www.phpd.cn

安装方法:

(1)下载LNMP自动编译基本服务 详细方法:http://blog.licess.cn/lnmp-debian-ubuntu/

重启nginx : kill -HUP ‘cat /usr/local/nginx/logs/nginx.pid’

重启php-cgi : /usr/local/php/sbin/php-fpm restart      [注start\stop(启动和停止)]

(2)安装memcache

下载

libevent(当前最新稳定版本1.4.13)  wget http://www.monkey.org/~provos/libevent-1.4.13-stable.tar.gz

memcache(当前最新稳定版本 1.4.3)  wget http://memcached.googlecode.com/files/memcached-1.4.3.tar.gz

先安装libevent

tar zxvf libevent-1.4.13-stable.tar.gz

cd libevent-1.4.13-stable

./configure –prefix=/usr

make

make install

再安装memcache

tar zxvf memcached-1.4.3.tar.gz

cd memcached-1.4.3.tar.gz

./configure –with-libevent=/usr

make

make install

安装完成后会把memcached放到 /usr/local/bin/memcached

启动memcache

/usr/local/bin/memcached -d -m 128 -u root -l 192.168.1.9 -p 1111 -c 256 -P /tmp/memcached.pid

-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,
-u是运行Memcache的用户,我这里是root,
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.1.9,
-p是设置Memcache监听的端口,我这里设置了1111,最好是1024以上的端口,
-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,

 关闭memcache

kill ‘cat /tmp/memcached.pid’

(3)安装相关php模块 [pdo-mysql、php xcache模块(二种方式,一是单独运行二是做为zend插件运行)、php memcache客户端模块]

1、下载相关软件

pdo-mysql (当前最新稳定版本1.0.2) wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz

xcache (当前最新稳定版本1.3.0) wget http://xcache.lighttpd.net/pub/Releases/1.3.0/xcache-1.3.0.tar.gz

php-memcache(当前最新稳定版本) wget http://pecl.php.net/get/memcache-2.2.5.tgz

2、安装pdo-mysql

tar zxvf PDO_MYSQL-1.0.2.tgz

cd PDO_MYSQL-1.0.2

/usr/local/php/bin/phpize

./configure –with-php-config=/usr/local/php/bin/php-config

make

make install

安装完成后的最终位置是 /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/pdo_mysql.so

3、安装xcache

tar zxvf xcache-1.3.0.tar.gz

cd xcache-1.3.0.tar.gz

/usr/local/php/bin/phpize

./configure –with-php-config=/usr/local/php/bin/php-config  –enable-xcache –enable-optimizer

安装完成后的最终位置是 /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/xcache.so

4、安装php memcache客户端模块

tar zxvf memcache-2.2.5.tgz

cd memcache-2.2.5.tgz

/usr/local/php/bin/phpize

./configure –enable-memcache –with-php-config=/usr/local/php/bin/php-config –with-zlib-dir

make

make install

安装完成后的最终位置是 /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/memcache.so

5、修改php.ini文件,添加模块支持

vi /usr/local/php/etc/php.ini   在后面添加

extension_dir="/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"

extension=pdo_mysql.so

extension=memcache.so

如果xcache做单独模块的话:

extension=xcache.so

如果xcache做为zend插件的话:

[xcache-common]
zend_extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/xcache.so
[xcache.admin]
; Change xcache.admin.user to your preferred login name
xcache.admin.user = "admin"
; Change xcache.admin.pass to the MD5 fingerprint of your password
; Use md5 -s "your_secret_password" to find the fingerprint
;密码是’123456’的md5
xcache.admin.pass = "e10adc3949ba59abbe56e057f20f883e" 
[xcache]
; Change xcache.size to tune the size of the opcode cache
xcache.size = 16M
xcache.shm_scheme = "mmap"
xcache.count = 2
xcache.slots = 8K
xcache.ttl = 0
xcache.gc_interval = 0
; Change xcache.var_size to adjust the size of variable cache
xcache.var_size = 8M
xcache.var_count = 1
xcache.var_slots = 8K
xcache.var_ttl = 0
xcache.var_maxttl = 0
xcache.var_gc_interval = 300
xcache.test = Off
xcache.readonly_protection = On
xcache.mmap_path = "/tmp/xcache"
xcache.coredump_directory = ""
xcache.cacher = On
xcache.stat = On
xcache.optimizer = Off
[xcache.coverager]
xcache.coverager = On
xcache.coveragedump_directory = ""

6、最后需要重启php-fpm(php-cgi)进程

/usr/local/php/sbin/php-fpm restart

 

ok了,最终环境配置成功,可以上传一个phpinfo();进行测试,看是否软件都全部正常工作

也可以测试一下memcache是否自动工作

vi /home/wwwroot/memcache.php

PHP代码
  1. <?php   
  2. $memcache=new Memcache;   
  3. $memcache->connect("192.168.1.9",1111) or die("Memcache could not connect");   
  4. $v=$memcache->getVersion();   
  5. echo ‘Memcache Version : ‘.$v.‘<br />’;   
  6. echo ‘Memcache set Val<br />’;   
  7. $memcache->set("name","test memcache!");   
  8. echo ‘echo memcache val (name):’.$memcache->get("name");   
  9. ?>  

解决局域网内windows mysql服务器ubuntu端php远程连接迟缓的问题

公司的开发环境是

数据库主服务器 (windows平台 ip 192.168.1.8)

测试服务器         (虚拟机 ubuntu server 安装 nginx、php5、xcache、memcache)

开发平台             (ubuntu 9.04 桌面版、及windows)

碰到的问题是当ubuntu平台php采用远程方法连接到数据库服务器192.168.1.8时,读取数据迟缓严重,可达5秒左右

最后搜索google得知应该是ip解析的问题

试过的方法:

在ubuntu端的mysql中的my.cnf 配置文件中的[mysqld]后面添加skip-name-resolve 此方法无效

最终的解决方法是:在windows端的mysql服务器的配置文件my.cnf [mysqld]后添加skip-name-resolve 完美解决

 

针对Serv-U服务器日志进行监控,获取成功上传的文件信息

最近一项目windows平台,需要针对 Serv-U ftp服务器进行实时监控,从而得知上传的成功后的文件信息,并且通过post提交给php进行分析处理

所以最后决定采用c#编写一个针对ftp日志文件的实时监控的windows服务,通过监控serv-u设置的日志文件大小变化进行分析,并且得到上传成功的文件路径

windows服务编写还好,就是调试有些困难,很少用c#.代码写得还是得简陋了些

主要功能:

xml格式的配置文件,在配置文件中指定ftp日志文件根目录,http请求地址及监控日志存放位置

按日期生成监控系统日志

主要代码

 

C#代码
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Diagnostics;  
  6. using System.Linq;  
  7. using System.ServiceProcess;  
  8. using System.Text;  
  9. using System.Net;  
  10. using System.IO;  
  11. using System.Configuration;  
  12. using System.Collections.Specialized;  
  13.   
  14. namespace ftpScan  
  15. {  
  16.     public partial class Service1 : ServiceBase  
  17.     {  
  18.         System.Timers.Timer timer2 = new System.Timers.Timer(4500);  
  19.   
  20.         public Service1()  
  21.         {  
  22.             InitializeComponent();  
  23.         }  
  24.   
  25.         public static string logpath = SystemConfig.GetConfigData("logpath"string.Empty);  
  26.         public static string httpurl = SystemConfig.GetConfigData("httpurl"string.Empty);  
  27.         public static string ftppath = SystemConfig.GetConfigData("ftppath"string.Empty);  
  28.         public static string ScanLogPath = SystemConfig.GetConfigData("ScanLogPath"string.Empty);  
  29.         public static string s1 = " Received file ";  
  30.         public static string s2 = " successfully ";  
  31.         public static long count = 0;  
  32.         public static long size=0;  
  33.   
  34.         public void log(string msg)  
  35.         {  
  36.             System.DateTime currentTime = new System.DateTime();  
  37.             currentTime = System.DateTime.Now;  
  38.             string strFilePath =ScanLogPath + "ftpScan_" + currentTime.ToString("yyyy_MM_dd") + ".log";  
  39.   
  40.             if (!File.Exists(strFilePath))  
  41.             {  
  42.                 FileStream fs = new FileStream(strFilePath, FileMode.Create);  //实例化一个StreamWriter–>与fs相关联    
  43.                 StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default);  
  44.                 sw.WriteLine(currentTime.ToString() + " | " + msg);  
  45.                 sw.Close();  
  46.                 fs.Close();  
  47.             }  
  48.             else  
  49.             {  
  50.                 FileStream fs = new FileStream(strFilePath, FileMode.Append);  
  51.                 StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default);  
  52.                 sw.WriteLine(currentTime.ToString() + " | " + msg);  
  53.                 sw.Close();  
  54.                 fs.Close();  
  55.             }  
  56.   
  57.         }  
  58.   
  59.         public void http(string dir, string filename)  
  60.         {  
  61.             string url = httpurl + "dir/" + dir + "/file/" + filename;  
  62.             log("提交http处理 目录:" + dir + "  文件名:" + filename);  
  63.             try  
  64.             {  
  65.                 System.Net.WebClient wc = new WebClient();  
  66.                 NameValueCollection na = new NameValueCollection();  
  67.                 na.Add("dir",dir);  
  68.                 na.Add("file",filename);  
  69.                 wc.UploadValues(httpurl, "POST", na);  
  70.                // log(ss.ToString());  
  71.                 //wc.DownloadData(url);  
  72.             }  
  73.             catch  
  74.             {  
  75.                 log("url:" + url + " 无效!");  
  76.             }  
  77.         }  
  78.   
  79.         public void scan()  
  80.         {  
  81.             System.DateTime currentTime = new System.DateTime();  
  82.             currentTime = System.DateTime.Now;  
  83.             char[] s3 = s1.ToCharArray();  
  84.             long count2 = count;  
  85.             string logfile = logpath + "ftp_" + currentTime.ToString("yyyy_MM_dd") + ".log";  
  86.   
  87.             //Console.WriteLine(logfile);  
  88.             if (!File.Exists(logfile))  
  89.             {  
  90.                 log("今日日志文件 " + logfile + " 不存在,已成功创建空的今日日志文件!");  
  91.                 FileStream fs = new FileStream(logfile, FileMode.Create);  //实例化一个StreamWriter–>与fs相关联    
  92.                 fs.Close();  
  93.             }  
  94.             else  
  95.             {  
  96.   
  97.                 System.IO.FileInfo f = new FileInfo(logfile);  
  98.                 //MessageBox.Show(f.Length.ToString());   
  99.                 if (f.Length != size)  
  100.                 {  
  101.                     StreamReader sr = new StreamReader(logfile);  
  102.   
  103.                     string content = sr.ReadToEnd();  
  104.                     string[] arr = content.Split("".ToCharArray());  
  105.                     sr.Close();  
  106.                     if (arr.Length > count)  
  107.                     {  
  108.                         long n = 0;  
  109.                         foreach (string re in arr)  
  110.                         {  
  111.                             string s = re;  
  112.                             if (n >= count)  
  113.                             {  
  114.                                 //Console.WriteLine(s);  
  115.                                 if (s.Contains(s1) && s.Contains(s2))  
  116.                                 {  
  117.                                     s = s.Replace(s1, "|");  
  118.                                     s = s.Replace(s2, "|");  
  119.                                     Console.WriteLine(s);  
  120.                                     string[] ary = s.Split("|".ToCharArray());  
  121.                                     s = ary[1];  
  122.                                     s = s.Replace(ftppath, "");  
  123.                                     string[] ary2 = s.Split("\\".ToCharArray()); 
  124.                                     if (ary2.Length == 2) 
  125.                                     { 
  126.                                         this.http(ary2[0], ary2[1]); 
  127.                                     } 
  128.                                 } 
  129.                             } 
  130.                             n++; 
  131.                         } 
  132.                          
  133.                     } 
  134.                     else  
  135.                     { 
  136.                         long n = 0; 
  137.                         foreach (string re in arr) 
  138.                         { 
  139.                             string s = re; 
  140.  
  141.                                 //Console.WriteLine(s); 
  142.                             if (s.Contains(s1) && s.Contains(s2)) 
  143.                             { 
  144.                                 s = s.Replace(s1, "|");  
  145.                                 s = s.Replace(s2, "|"); 
  146.                                 Console.WriteLine(s); 
  147.                                 string[] ary = s.Split("|".ToCharArray()); 
  148.                                 s = ary[1]; 
  149.                                 s = s.Replace(ftppath, "");  
  150.                                 string[] ary2 = s.Split("\\".ToCharArray()); 
  151.                                 if (ary2.Length == 2) 
  152.                                 { 
  153.                                   this.http(ary2[0], ary2[1]); 
  154.                                 } 
  155.                             } 
  156.                             n++; 
  157.                         } 
  158.                     } 
  159.                     log("监控到了更新,原行:" + count.ToString() + " 原大小:" + size.ToString() + " 【新行:" + arr.Length.ToString() + " 新大小:" + f.Length.ToString() + ""); 
  160.                     count = arr.Length; 
  161.                     size = f.Length; 
  162.                      
  163.                 } 
  164.             } 
  165.             //Contains //查找字符串 
  166.         } 
  167.  
  168.  
  169.         protected override void OnStart(string[] args) 
  170.         { 
  171.             //log("启动监控ftp日志服务!");  
  172.             //Process.Start("D://test//scoutFolder.exe"); 
  173.             log("启动监控ftp日志服务!"); 
  174.  
  175.             timer2.Elapsed += new System.Timers.ElapsedEventHandler(theout); 
  176.             timer2.Enabled = true; 
  177.         } 
  178.  
  179.         protected override void OnStop() 
  180.         { 
  181.             timer2.Enabled = false; 
  182.             log("停止监控ftp日志服务!");  
  183.         }  
  184.   
  185.         public void theout(object source, System.Timers.ElapsedEventArgs e)  
  186.         {  
  187.   
  188.             scan();  
  189.         }  
  190.     }  
  191. }  

android也需要翻墙,汗

htc hero的gmail和菜市场还有联系人同步都不好用,经常连接不上,在网上探索了下,原来android也是要翻墙滴。

 

命令中是否有空格 输入法是否在英文状态下(有时候手机会自己切换到中文输入法)

一。打开手机中的超级终端

二。开始输入命令:    正常情况下命令行前面都会有个 #      我直接写命令 把#省去了~
su
mount -o remount,rw /dev/block/mtdblock3 /system
vi /etc/hosts

三。这时候应该能看到显示出来里面自带的ip地址 和网址
1.按下键盘“  i  ”

2.移动光标到已存在的命令下面    把这行命令添加上去     要注意格式
74.125.93.113 android.clients.google.com

3.按下键盘“  右Alt+1  ”    有的朋友可以按 “    轨迹球+1   ” 这两种效果应该是一样的  哪种好用按哪种

4.按下键盘“  左Alt+H  ”

四。这时候正常情况能看到屏幕最下面出现    :   号

五。输入命令
wq

六。回车    正常还会显示#   

七。重启!!!启动后绑定~

可以绑定了吧~哈哈~菜场也好用了~同步也好用了~我自己试了全都好用~

我的htc hero就快送过来了,有点兴奋了

等啊等啊等………..

HTC Hero主要功能规格:

 

  上市时间: 2009年7月 欧洲 2009年9月 台湾

 

  网络制式: WCDMA HSDPA

 

  手机类型: 直板 智能手机

 

  手机屏幕: 320 x 480 pixel 26万色 3.2英寸

 

  镜头参数: 500万 普通摄像头 CMOS传感器

 

  重量尺寸: 115 x 56.2 x 14.35 mm 135 g

 

  机身内存: 支持microSD记忆卡

 

  操作系统: Android Qualcomm MSM7200A 528MHz

 

  电池: TWIN160 1350mAh

 

  支持GSM850/900/1800/1900MHz,UMTS 900/2100MHz

 

  支持7.2Mbps HSDPA下行,2Mbps HSUPA上行

 

  支持WLAN 802.11 b/g 无线局域网

 

  搭载Android 1.5操作系统

 

  搭载 HTC Sense 使用界面

 

  内置528MHz Qualcomm MSM7200A 处理器

 

  288MB RAM,512MB ROM, micro-SDHC存储卡扩展

 

  配备3.2 英寸HVGA(320×480像素)触控屏

 

  内置500 万像素自动对焦镜头

 

  增加了3.5mm 耳机插孔

 

  内建 GPS导航及电子罗盘

 

  支持Gmail、Google Maps、Google Search

 

  内建 YouTube、twitter,台湾版另外内置Plurk(噗浪)widget。

 

  支持 Android Market 应用程序下载

 

  拥有Trackball 轨迹操控球

 

  内建 G-Sensor 重力感应器

 

  采用特弗龙材质制作机身

 

  支持蓝牙2.0 + EDR

轻量级php5源码加密保护工具PHP Screw1.5

目前最新版本是1.5

目前只不支持windows系统

网址 http://sourceforge.net/projects/php-screw/

1.将获得的php_screw-1.5.tgz文件放到/usr/local目录下,然后用tar解压缩
tar zxvf php_screw-1.5.tgz

2.进入/usr/local/php_screw-1.5目录开始安装
cd /usr/local/php_screw-1.5
phpize
./confiugre

3.设置自己用来加密的密码
vi my_screw.h

    — Please change the encryption SEED key (pm9screw_mycryptkey) into the
      values according to what you like.
      The encryption will be harder to break, if you add more values to the
      encryption SEED array. However, the size of the SEED is unrelated to
      the time of the decrypt processing.

    * If you can read and understand the source code, to modify an original
      encryption logic will be possible. But in general, this should not
      be necessary.

    OPTIONAL: Encrypted scripts get a stamp added to the beginning of the
          file. If you like, you may change this stamp defined by
          PM9SCREW and PM9SCREW_LEN in php_screw.h. PM9SCREW_LEN must
          be less than or equal to the size of PM9SCREW.

4.编译
make

5.拷贝modules目录下的php_screw.so文件到/usr/lib/php/extension目录下
cp modules/php_screw.so /usr/lib/php/extension/

6.编辑php.ini文件
在php.ini文件里,加入如下语句
extension=php_screw.so

7.重新启动Apache
/etc/rc.d/rc.httpd restart

8.编译加密工具
cd tools
make

9.将tools目录下加密用的工具screw拷贝到适当目录
cp screw /usr/bin/

经过以上的10步,就已经把php_screw-1.5全部安装完成了。并且现在的php也已经支持解释加密过的php文件了
使用
1.现写一个要加密的php文件。
我写了如下的一个用来测试php速度的compute.php文件

<?
$a=0;
$t=time();
for($i=0;$i<5000000;$i++)
  {$a=$a*$i;}
$t1=time();
echo "<p>";
echo "It used:";
echo $t1-$t;
echo "seconds";
?>
将上面的compute.php文件放到/var/www/htdocs目录下。通过浏览器访问,将显示出php在大量计算时的速度(只能粗略估计一下)
2.将我们写的php文件加密
cd /var/www/htdocs/
screw compute.php

我们加密后,现在目录下的compute.php文件就是我们已经加密的了。而源文件被改名为compute.php.screw存放了。
我们现在再测试一下compute.php,看看能否正常使用?速度如何?