月度归档:2009年11月

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