其实每一个念头都是一束火焰,倘若你只盯着这些念头,火会把你烧着;当你全方位投入战斗,相当于在火阵里往前冲,反倒不会被烧着了。
我们团队的文化建立得比较彻底,我本人却并没有真正跳进去。我不用去编程,但是至少应该成为技术和产品的疯狂使用者和爱好者,但我并没有。我还处在高高在上的状态。这种状态,如果底下的“将军”很能干,不断向你提出应该做什么,我是可以听进去的。危险的是如果底下没有这样的“将军”,如果自己不是一个技术和产品的疯狂使用者和爱好者,你就判断不清楚。事实上,当主帅首先就必须自己对产品有深刻的理解力。
CBR:互联网界有两个一等一的公关人才,一个是你,一个是周鸿祎先生。你怎么评价此次3Q大战中,周先生的媒介传播表现?
张朝阳:很厉害。
CBR:这种人中国还会有吗?
张朝阳:不会有了。
CBR:中国的土壤里能成长出伟大的企业吗?
张朝阳:做一个伟大企业,赢得尊重,这在美国比较容易。这次我在斯坦福大学演讲,有听众问,你怎么看待乔布斯在斯坦福大学的演讲。我看过他演讲的片段,他说“一定要相信自己的理想,相信就能够实现”。但我说他的演讲在中国实现不了。在中国有这个理想,不一定能实现,甚至要加入一定的邪恶才能实现。要赢得尊重,要创造伟大的企业,在中国很难。中国这个环境,想做一个最成功的企业家,一定会牺牲自己的性格,委屈做人。所以中国做得很大的企业家都阴着脸,活得不畅快。
阅读全文
我们团队的文化建立得比较彻底,我本人却并没有真正跳进去。我不用去编程,但是至少应该成为技术和产品的疯狂使用者和爱好者,但我并没有。我还处在高高在上的状态。这种状态,如果底下的“将军”很能干,不断向你提出应该做什么,我是可以听进去的。危险的是如果底下没有这样的“将军”,如果自己不是一个技术和产品的疯狂使用者和爱好者,你就判断不清楚。事实上,当主帅首先就必须自己对产品有深刻的理解力。
CBR:互联网界有两个一等一的公关人才,一个是你,一个是周鸿祎先生。你怎么评价此次3Q大战中,周先生的媒介传播表现?
张朝阳:很厉害。
CBR:这种人中国还会有吗?
张朝阳:不会有了。
CBR:中国的土壤里能成长出伟大的企业吗?
张朝阳:做一个伟大企业,赢得尊重,这在美国比较容易。这次我在斯坦福大学演讲,有听众问,你怎么看待乔布斯在斯坦福大学的演讲。我看过他演讲的片段,他说“一定要相信自己的理想,相信就能够实现”。但我说他的演讲在中国实现不了。在中国有这个理想,不一定能实现,甚至要加入一定的邪恶才能实现。要赢得尊重,要创造伟大的企业,在中国很难。中国这个环境,想做一个最成功的企业家,一定会牺牲自己的性格,委屈做人。所以中国做得很大的企业家都阴着脸,活得不畅快。
阅读全文
http://www.excms.cn/manual/install-freebsd-nginx.html
安装 mytop
1. 在 /etc/yum.repo.d 新建一个文件 21andy.com.repo
[21Andy.com]
name=21Andy.com Packages for Enterprise Linux 5 - $basearch
baseurl=http://www.21andy.com/centos/5/$basearch/
enabled=1
gpgcheck=0
2. 启用 EPEL 仓库
i386
rpm -ihv http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
x86_64
rpm -ihv http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-3.noarch.rpm
3. 现在可以直接 yum 了
yum -y install mytop
4. 装好了,设置一下配置文件 mytop 的配置文件在 ~/.mytop 自己新建一个
# vim ~/.mytop
输入如下内容,保存
user=你的mysql用户
pass=你的mysql密码
host=localhost
db=你要监控的数据库名
delay=5
port=3306
socket=/var/lib/mysql/mysql.sock
batchmode=0
header=1
color=1
idle=1
注意,socket 设置和 my.cnf 里的路径一样,一般我们是 mytop 和 mysql 在同一台机
本文出处:http://www.21andy.com/blog/
OK,安装都完成了,现在运行 mytop 试一下效果
mytop 命令参数
-u / --user <USERNAME>:指定 username,预设是 root
-p / --pass / --password <PASSWORD>:指定 password,预设是 none
-h / --host <HOSTNAME[:PORT]>:指定 MySQL server 的 hostname,预设是 localhost
-P / --port <PORT>:指定连接 MySQL server 的 port,预设是 3306
-s / --delay <SECONDS>:更新的秒数,预设是 5 秒
-d / --db / --database <DATABASE>:指定连接的资料库,预设是 test
-b / --batch / --batchmode:指定为 batch mode,每次更新不会清除旧的显示结果,会将更新资料显示上最上方,预设是 unset
-S / --socket <PATH_TO_SOCKET>:指定使用 MySQL socket 直接连线,而不使用 TCP/IP 连线,预设是 none (当 mytop 和 MySQL 在同一台时才能使用)
--header or -noheader:是否要显示表头,预设是 header
--color or --nocolor:是否要使用颜色,预设是 color
-i / -idle or -noidle:idle 的 thread 是否要出现在清单上,预设是 idle
[注意] 因 .mytop 内有 MySQL server 的密码,请注意档案权限
mytop 快捷键
s:设定更新时间
p:暂停画面更新
q:离开
u:只看某个使用者的 thread
o:反转排列顺序
mytop 远端监控
若将 mytop 装在另一台机器上时,需要设定 MySQL server 上的权限,才有办法远端监控
(1)在 MySQL server 上新增一个帐号,并给它 process 的权限
mysql -u root -p
mysql> grant process on *.* to <REMOTE_USERNAME>@<REMOTE_IP> identified by '<PASSWORD>';
mysql> flush privileges;
mysql> exit
(2)在安装 mytop 的电脑上,用参数指定或修改配置文件的设定
mytop -u <REMOTE_USERNAME> -p <PASSWORD> -h <MYSQL_SERVER_IP>
或修改 .mytop
user=<REMOTE_USERNAME>
pass=<PASSWORD>
host=<MYSQL_SERVER_IP>
英文参考文档
http://jeremy.zawodny.com/mysql/mytop/mytop.html
1. 在 /etc/yum.repo.d 新建一个文件 21andy.com.repo
[21Andy.com]
name=21Andy.com Packages for Enterprise Linux 5 - $basearch
baseurl=http://www.21andy.com/centos/5/$basearch/
enabled=1
gpgcheck=0
2. 启用 EPEL 仓库
i386
rpm -ihv http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
x86_64
rpm -ihv http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-3.noarch.rpm
3. 现在可以直接 yum 了
yum -y install mytop
4. 装好了,设置一下配置文件 mytop 的配置文件在 ~/.mytop 自己新建一个
# vim ~/.mytop
输入如下内容,保存
user=你的mysql用户
pass=你的mysql密码
host=localhost
db=你要监控的数据库名
delay=5
port=3306
socket=/var/lib/mysql/mysql.sock
batchmode=0
header=1
color=1
idle=1
注意,socket 设置和 my.cnf 里的路径一样,一般我们是 mytop 和 mysql 在同一台机
本文出处:http://www.21andy.com/blog/
OK,安装都完成了,现在运行 mytop 试一下效果
mytop 命令参数
-u / --user <USERNAME>:指定 username,预设是 root
-p / --pass / --password <PASSWORD>:指定 password,预设是 none
-h / --host <HOSTNAME[:PORT]>:指定 MySQL server 的 hostname,预设是 localhost
-P / --port <PORT>:指定连接 MySQL server 的 port,预设是 3306
-s / --delay <SECONDS>:更新的秒数,预设是 5 秒
-d / --db / --database <DATABASE>:指定连接的资料库,预设是 test
-b / --batch / --batchmode:指定为 batch mode,每次更新不会清除旧的显示结果,会将更新资料显示上最上方,预设是 unset
-S / --socket <PATH_TO_SOCKET>:指定使用 MySQL socket 直接连线,而不使用 TCP/IP 连线,预设是 none (当 mytop 和 MySQL 在同一台时才能使用)
--header or -noheader:是否要显示表头,预设是 header
--color or --nocolor:是否要使用颜色,预设是 color
-i / -idle or -noidle:idle 的 thread 是否要出现在清单上,预设是 idle
[注意] 因 .mytop 内有 MySQL server 的密码,请注意档案权限
mytop 快捷键
s:设定更新时间
p:暂停画面更新
q:离开
u:只看某个使用者的 thread
o:反转排列顺序
mytop 远端监控
若将 mytop 装在另一台机器上时,需要设定 MySQL server 上的权限,才有办法远端监控
(1)在 MySQL server 上新增一个帐号,并给它 process 的权限
mysql -u root -p
mysql> grant process on *.* to <REMOTE_USERNAME>@<REMOTE_IP> identified by '<PASSWORD>';
mysql> flush privileges;
mysql> exit
(2)在安装 mytop 的电脑上,用参数指定或修改配置文件的设定
mytop -u <REMOTE_USERNAME> -p <PASSWORD> -h <MYSQL_SERVER_IP>
或修改 .mytop
user=<REMOTE_USERNAME>
pass=<PASSWORD>
host=<MYSQL_SERVER_IP>
英文参考文档
http://jeremy.zawodny.com/mysql/mytop/mytop.html
围绕纯真数据库的一系列小工具
* qqwry.c,qqwry.h。一个c实现的lib,用来从纯真数据库里获取ip地址信息。下载,文档
* nali,一组ip查询工具,包括可以让dig,traceroute显示ip地理信息。下载,文档
* pecl::qqwry,纯真数据库查询的PHP C扩展实现。下载,文档
* 纯真数据库UTF-8版本。转换工具也以开源形式发布,用php实现
nali,名字取自中文“哪里”的拼音。nali包含一组命令行程序,其主要功能就是把一些网络工具的输出的IP字符串,附加上地理位置信息 (使用纯真数据库)。例如218.65.137.1会变成218.65.137.1[广西南宁市 电信]。查询是在本地进行,并不会进行联网查询,所以效率方面不会有什么影响。
目前包含以下几个命令:
nali
nali-dig
nali-nslookup
nali-traceroute
nali-tracepath
nali-ping
使用这些命令的前提是,他们对应的命令必须存在。例如你要用nali-dig,必须保证dig是存在的。他们的用法和原始命令是一样的。例如nali-dig,用法就和dig一样。
大家可能注意到了nali这个命令,它可以对标准输出的IP串附加上地理信息。nali-*系列工具都是基于这个来实现的。
下载:
wget http://qqwry.googlecode.com/files/nali-0.1.tar.gz
安装:
./configure && make && make install
使用:
1、统计apache的访问记录(可以统计哪个ip的访问量最多,并查看是来自哪里的):
命令:
cat /data/log/log_all | awk '{print $1}' | sort | uniq -c | nali | sort -rnk1 | more
输出结果:
2303 203.208.60.43[北京市 谷歌(中国)公司]
1442 61.135.249.210[北京市 联通ADSL]
827 124.207.205.1[北京市 电信通]
607 121.14.53.65[广东省江门市 电信]
493 117.63.249.59[江苏省常州市 电信]
289 203.208.60.5[北京市 谷歌(中国)公司]
272 203.208.60.47[北京市 谷歌(中国)公司]
252 173.66.232.6[北美地区]
240 61.185.198.110[陕西省西安市 电信ADSL]
217 123.127.8.36[北京市 联通ADSL]
217 113.233.255.7[辽宁省 联通]
206 222.76.18.181[福建省福州市 电信ADSL]
196 72.30.81.190[美国 yahoo蜘蛛]
http://www.21andy.com/blog/20100926/1969.html
* qqwry.c,qqwry.h。一个c实现的lib,用来从纯真数据库里获取ip地址信息。下载,文档
* nali,一组ip查询工具,包括可以让dig,traceroute显示ip地理信息。下载,文档
* pecl::qqwry,纯真数据库查询的PHP C扩展实现。下载,文档
* 纯真数据库UTF-8版本。转换工具也以开源形式发布,用php实现
nali,名字取自中文“哪里”的拼音。nali包含一组命令行程序,其主要功能就是把一些网络工具的输出的IP字符串,附加上地理位置信息 (使用纯真数据库)。例如218.65.137.1会变成218.65.137.1[广西南宁市 电信]。查询是在本地进行,并不会进行联网查询,所以效率方面不会有什么影响。
目前包含以下几个命令:
nali
nali-dig
nali-nslookup
nali-traceroute
nali-tracepath
nali-ping
使用这些命令的前提是,他们对应的命令必须存在。例如你要用nali-dig,必须保证dig是存在的。他们的用法和原始命令是一样的。例如nali-dig,用法就和dig一样。
大家可能注意到了nali这个命令,它可以对标准输出的IP串附加上地理信息。nali-*系列工具都是基于这个来实现的。
下载:
wget http://qqwry.googlecode.com/files/nali-0.1.tar.gz
安装:
./configure && make && make install
使用:
1、统计apache的访问记录(可以统计哪个ip的访问量最多,并查看是来自哪里的):
命令:
cat /data/log/log_all | awk '{print $1}' | sort | uniq -c | nali | sort -rnk1 | more
输出结果:
2303 203.208.60.43[北京市 谷歌(中国)公司]
1442 61.135.249.210[北京市 联通ADSL]
827 124.207.205.1[北京市 电信通]
607 121.14.53.65[广东省江门市 电信]
493 117.63.249.59[江苏省常州市 电信]
289 203.208.60.5[北京市 谷歌(中国)公司]
272 203.208.60.47[北京市 谷歌(中国)公司]
252 173.66.232.6[北美地区]
240 61.185.198.110[陕西省西安市 电信ADSL]
217 123.127.8.36[北京市 联通ADSL]
217 113.233.255.7[辽宁省 联通]
206 222.76.18.181[福建省福州市 电信ADSL]
196 72.30.81.190[美国 yahoo蜘蛛]
http://www.21andy.com/blog/20100926/1969.html
BLOB类型的字段用于存储二进制数据
MySQL中,BLOB是个类型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储文件的最大大小上不同。
MySQL的四种BLOB类型
类型 大小(单位:字节)
TinyBlob 最大 255
Blob 最大 65K
MediumBlob 最大 16M
LongBlob 最大 4G
地址: http://www.21andy.com/blog/20100914/1950.html
MySQL中,BLOB是个类型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储文件的最大大小上不同。
MySQL的四种BLOB类型
类型 大小(单位:字节)
TinyBlob 最大 255
Blob 最大 65K
MediumBlob 最大 16M
LongBlob 最大 4G
地址: http://www.21andy.com/blog/20100914/1950.html
MySQL导出的SQL语句在导入时有可能会非常非常慢,在处理百万级数据的时候,可能导入要花几小时。在导出时合理使用几个参数,可以大大加快导 入的速度。
-e 使用包括几个VALUES列表的多行INSERT语法;
--max_allowed_packet=XXX 客户端/服务器之间通信的缓存区的最大大小;
--net_buffer_length=XXX TCP/IP和套接字通信缓冲区大小,创建长度达net_buffer_length的行。
注意:max_allowed_packet 和 net_buffer_length 不能比目标数据库的设定数值 大,否则可能出错。
首先确定目标数据库的参数值
mysql> show variables like 'max_allowed_packet';
mysql> show variables like 'net_buffer_length';
根据参数值书写 mysqldump 命令,如:
# mysqldump -uroot -p123 21andy -e --max_allowed_packet=16777216 --net_buffer_length=16384 > 21andy.sql
OK,现在速度就很快了,主要注意的是导入和导出端的 max_allowed_packet 和 net_buffer_length 这2个参数值设定,弄大点就OK了
其实,最快的方法,是直接COPY数据库目录,不过记得先停止 MySQL 服务。
本文地址: http://www.21andy.com/blog/20100917/1952.html
-e 使用包括几个VALUES列表的多行INSERT语法;
--max_allowed_packet=XXX 客户端/服务器之间通信的缓存区的最大大小;
--net_buffer_length=XXX TCP/IP和套接字通信缓冲区大小,创建长度达net_buffer_length的行。
注意:max_allowed_packet 和 net_buffer_length 不能比目标数据库的设定数值 大,否则可能出错。
首先确定目标数据库的参数值
mysql> show variables like 'max_allowed_packet';
mysql> show variables like 'net_buffer_length';
根据参数值书写 mysqldump 命令,如:
# mysqldump -uroot -p123 21andy -e --max_allowed_packet=16777216 --net_buffer_length=16384 > 21andy.sql
OK,现在速度就很快了,主要注意的是导入和导出端的 max_allowed_packet 和 net_buffer_length 这2个参数值设定,弄大点就OK了
其实,最快的方法,是直接COPY数据库目录,不过记得先停止 MySQL 服务。
本文地址: http://www.21andy.com/blog/20100917/1952.html
刚刚发布《Nginx 0.9.0 开发版发布》 的消息后,Nginx 官方网站已经紧急发布了 Nginx 0.9.1 ,因为在 Nginx 0.9.0 发布不久之后就发现其中的一个 bug。不得不佩服 Nginx 官方修复软件漏洞的效率!我们建议大家不要在生产环境中把 Nginx 升级到最新的版本,因为一个开发版本远不如稳定版本安全可靠。
Nginx 0.9.1 修正了 Nginx 0.9.0 中 “return CODE message” 指命不能正常运行的 Bug。
Bugfix: “return CODE message” directives did not work; the bug had appeared in 0.9.0.
下载 Nginx 0.9.1
http://nginx.org/download/nginx-0.9.1.tar.gz
来源:http://www.oschina.net/news/13445/nginx-0-9-1
主进程和slave进程通讯原理:
http://www.oschina.net/bbs/thread/13663
nginx(发音同engine x)是一款由俄罗斯程序员Igor Sysoev所开发轻量级的网页服务器、反向代理服务器以及电子邮件 (IMAP/POP3)代理服务器。起初是供俄国大型的门户网站及搜索引擎Rambler(俄语:Рамблер)使用。此软件BSD-like协议下发 行,可以在UNIX、GNU/Linux、BSD、Mac OS X、Solaris,以及Microsoft Windows等操作系统中运行。
下载地址:
http://nginx.org/download/nginx-1.2.8.tar.gz
Windows
http://nginx.org/download/nginx-1.2.8.zip
改进内容:
*) Bugfix: new sessions were not always stored if the "ssl_session_cache shared" directive was used and there was no free space in shared memory. Thanks to Piotr Sikora.
*) Bugfix: responses might hang if subrequests were used and a DNS error happened during subrequest processing. Thanks to Lanshun Zhou.
*) Bugfix: in the ngx_http_mp4_module. Thanks to Gernot Vormayr. *) Bugfix: in backend usage accounting.
Nginx 0.9.1 修正了 Nginx 0.9.0 中 “return CODE message” 指命不能正常运行的 Bug。
Bugfix: “return CODE message” directives did not work; the bug had appeared in 0.9.0.
下载 Nginx 0.9.1
http://nginx.org/download/nginx-0.9.1.tar.gz
来源:http://www.oschina.net/news/13445/nginx-0-9-1
主进程和slave进程通讯原理:
http://www.oschina.net/bbs/thread/13663
nginx(发音同engine x)是一款由俄罗斯程序员Igor Sysoev所开发轻量级的网页服务器、反向代理服务器以及电子邮件 (IMAP/POP3)代理服务器。起初是供俄国大型的门户网站及搜索引擎Rambler(俄语:Рамблер)使用。此软件BSD-like协议下发 行,可以在UNIX、GNU/Linux、BSD、Mac OS X、Solaris,以及Microsoft Windows等操作系统中运行。
下载地址:
http://nginx.org/download/nginx-1.2.8.tar.gz
Windows
http://nginx.org/download/nginx-1.2.8.zip
改进内容:
*) Bugfix: new sessions were not always stored if the "ssl_session_cache shared" directive was used and there was no free space in shared memory. Thanks to Piotr Sikora.
*) Bugfix: responses might hang if subrequests were used and a DNS error happened during subrequest processing. Thanks to Lanshun Zhou.
*) Bugfix: in the ngx_http_mp4_module. Thanks to Gernot Vormayr. *) Bugfix: in backend usage accounting.
唐贞观元年,偏将黄裳,出长安击敌,不意陷重围,坠深涧,为虎所救,三载方愈。闲暇伴九虎嬉,悟搏击克敌法,其意博,其理奥,其趣深,意研精,探微隐,不觉神功成。出山觅寇不得,方知隔载四十矣,贼寇皆病卒。感思虎恩,返深山终余生,埋武籍于虎穴。
宋人王重阳,深山习剑偶得,聚太清罡气之威,成金刚不坏之体。邀东邪西毒南帝北丐,论剑于华山,如虎博兔,刚猛无比,不攻自惧,成武林霸业。遂创全真,弘扬道教,藏书终南山,九阴真经是也。
后人金庸,著书记之。鸡毛再线,夜录真经,校阅数载,勘误补阕。感慨世人偏好武功,惘识经文要义,虎恩亦遗矣。功力不济,切勿修习,走火入魔,幻化情糜,转载收藏,当明此意。特记,是为序。
阅读全文
宋人王重阳,深山习剑偶得,聚太清罡气之威,成金刚不坏之体。邀东邪西毒南帝北丐,论剑于华山,如虎博兔,刚猛无比,不攻自惧,成武林霸业。遂创全真,弘扬道教,藏书终南山,九阴真经是也。
后人金庸,著书记之。鸡毛再线,夜录真经,校阅数载,勘误补阕。感慨世人偏好武功,惘识经文要义,虎恩亦遗矣。功力不济,切勿修习,走火入魔,幻化情糜,转载收藏,当明此意。特记,是为序。
阅读全文
可能由于nginx现在太过抢眼或火爆了,现在apache正在孵化新产品以示竞争
Apache基金会近日发布了Traffic Server的最新版本2.1.0-unstable版,新版本带来了一些新的特性和性能方面的优化提升,同时还包括支持FreeBSD和Mac OS x以及Solaris系统。此外,新版Traffic Server还提升了缓存的搜索和读写方面的效率。
Traffic Server是一套快速、模块化的兼容 HTTP/1.1的反向代理服务器,与Nginx和Squid 类似,目前该项目已经转到Apache基金会,暂时还是孵化状态。
目前使用该产品的主要有Yahoo,Traffic Server在Yahoo每日承担超过400TB的正向和反向代理。
Traffic Server下载地址:http://www.apache.org/dyn/closer.cgi/incubator/trafficserver/
介绍:http://trafficserver.apache.org/
参考:http://blog.sina.com.cn/s/blog_502c8cc40100mw7n.html
下载:http://labs.renren.com/apache-mirror//trafficserver/trafficserver-2.0.1.tar.bz2
Apache基金会近日发布了Traffic Server的最新版本2.1.0-unstable版,新版本带来了一些新的特性和性能方面的优化提升,同时还包括支持FreeBSD和Mac OS x以及Solaris系统。此外,新版Traffic Server还提升了缓存的搜索和读写方面的效率。
Traffic Server是一套快速、模块化的兼容 HTTP/1.1的反向代理服务器,与Nginx和Squid 类似,目前该项目已经转到Apache基金会,暂时还是孵化状态。
目前使用该产品的主要有Yahoo,Traffic Server在Yahoo每日承担超过400TB的正向和反向代理。
Traffic Server下载地址:http://www.apache.org/dyn/closer.cgi/incubator/trafficserver/
介绍:http://trafficserver.apache.org/
参考:http://blog.sina.com.cn/s/blog_502c8cc40100mw7n.html
下载:http://labs.renren.com/apache-mirror//trafficserver/trafficserver-2.0.1.tar.bz2
我的机子配置 2G内存
1:安装好apache和nginx。它们共用80端口(哈哈,当然修改端口是很简单的),apache安装在 /opt/httpd目录下,nginx安装在/opt/nginx中。
2:安装好webbench(很简单,下载解压后,进入目录,make ,make install即可进行安装),用于压力测试。
3:cd /opt/httpd/bin
./apachectl start
netstat -antl | grep 80 //用以确认该服务是否真正启动!以下是测试部分:
[root@*bin]# webbench -c 5000 -t 60 http://127.0.0.1/apache_pb.png
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
Benchmarking: GET http://127.0.0.1/apache_pb.png
5000 clients, running 60 sec.
Speed=208453 pages/min, 5741557 bytes/sec.
Requests: 208279 susceed, 174 failed.
-t 60 表示在60秒的时间内,-c 表示并发数。红色字体部分为性能表示。
很直观的一点就是说有174个响应失败。
4:为了测试的准确性,我
cp /opt/httpd/htdocs/apache_pb.png /opt/nginx/html/ //复制文件
接着关闭apache服务器, 以nginx来测试(我必须将其关闭,因为共用80端口,不关闭, 我启动不了nginx)
[root@qingheliu bin]# pkill httpd //将服务kill掉
[root@qingheliu bin]# netstat -antl | grep 80 //确认apache是否被kill
[root@qingheliu bin]# /opt/nginx/sbin/nginx //启动nginx
[root@qingheliu bin]# netstat -antl | grep 80 //确认是否正常启动
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
//压力测试:
[*]# webbench -c 5000 -t 60 http://127.0.0.1/apache_pb.png
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
Benchmarking: GET http://127.0.0.1/apache_pb.png
5000 clients, running 60 sec.
Speed=325235 pages/min, 8656698 bytes/sec.
Requests: 325235 susceed, 0 failed.
[root@qingheliu bin]#
比较红色字体的部分。事实胜过雄辩,显然nginx服务器功能更好!
转自 http://hi.baidu.com/sheshi37c/blog/item/27417e1ed96942fc1bd57699.html
1:安装好apache和nginx。它们共用80端口(哈哈,当然修改端口是很简单的),apache安装在 /opt/httpd目录下,nginx安装在/opt/nginx中。
2:安装好webbench(很简单,下载解压后,进入目录,make ,make install即可进行安装),用于压力测试。
3:cd /opt/httpd/bin
./apachectl start
netstat -antl | grep 80 //用以确认该服务是否真正启动!以下是测试部分:
[root@*bin]# webbench -c 5000 -t 60 http://127.0.0.1/apache_pb.png
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
Benchmarking: GET http://127.0.0.1/apache_pb.png
5000 clients, running 60 sec.
Speed=208453 pages/min, 5741557 bytes/sec.
Requests: 208279 susceed, 174 failed.
-t 60 表示在60秒的时间内,-c 表示并发数。红色字体部分为性能表示。
很直观的一点就是说有174个响应失败。
4:为了测试的准确性,我
cp /opt/httpd/htdocs/apache_pb.png /opt/nginx/html/ //复制文件
接着关闭apache服务器, 以nginx来测试(我必须将其关闭,因为共用80端口,不关闭, 我启动不了nginx)
[root@qingheliu bin]# pkill httpd //将服务kill掉
[root@qingheliu bin]# netstat -antl | grep 80 //确认apache是否被kill
[root@qingheliu bin]# /opt/nginx/sbin/nginx //启动nginx
[root@qingheliu bin]# netstat -antl | grep 80 //确认是否正常启动
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
//压力测试:
[*]# webbench -c 5000 -t 60 http://127.0.0.1/apache_pb.png
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
Benchmarking: GET http://127.0.0.1/apache_pb.png
5000 clients, running 60 sec.
Speed=325235 pages/min, 8656698 bytes/sec.
Requests: 325235 susceed, 0 failed.
[root@qingheliu bin]#
比较红色字体的部分。事实胜过雄辩,显然nginx服务器功能更好!
转自 http://hi.baidu.com/sheshi37c/blog/item/27417e1ed96942fc1bd57699.html
每秒持续10W的ajax请求,现在用mina来处理http请求,单机c10k搞不定,业务逻辑基本就根据url进行数据过滤并返回json,
以下测试数据通过ab -n 100000 -c 1 http://localhost/,client, server都在一个ubuntu上~
mina处理能力是2K request/s,即使不带业务代码,也不到3k request/s。
在这方面没有过多的经验,在公司也是一个人闭门造车,自己学习新技术能力较强,对nginx的性能也比较有信心,处理静态文件返回是7K request/s。
对erlang比较感兴趣,但是这个技术在公司基本不会采用,所以想直接在apache/nginx(首选nginx)上开发模块,处理http请求,java负责将数据装进memcache,nginx模块直接从memcache取数据,感觉这样性能有保障,这方面的资料网上不多,可能nginx模块本身就不应该用来处理业务逻辑。
故在javaeye请教各位,nginx业务模块,这种方案是否靠谱?有没有相应的案例或者资料来学习的,当然有更好的方案来解决这个问题也希望您能不吝赐教~
谢啦~
问题补充:
其实最终也就是想提高单机吞吐量,负载均衡肯定是需要做的。
对TCP/IP这些理论还没有深入的了解,仅仅停留在知道nginx以C为主的http比java快这个基础上。
还是尝试一下,用C来处理高并发这段的业务,用测试数据说话,谢谢啦
2009-08-22 fjlyxx (中级程序员)
在WIN下面 你同时并非3K到4K 信道就不够了 在LINUX下可以到3W到4W 你同时并发10W 只是一个梦想. 如果你要在1S内吞吐达到10W是可以的 但是一次HTTP请求是一个短连接的过程 连接时间可能就占用了几百毫秒甚至几秒 看LZ的意思 是想从业务处理时间上提高吞吐 但是个人觉得 在单向短连接的情况下 提高余地不高 如果业务处理时间都少于1S的话 那么这个时间基本和你建立连接时间持平 TOMCAT默认15条现场 在TOMCAT LF线程模型下 其实同时并非最大也就15个 但是这15个能同在1S内处理上百个简单请求 这时候瓶颈并不在IO方面 IO方面的瓶颈基本上是因为 访问量过大 建立连接耗时 如果访问量过大那么楼主就不能靠缩小业务处理时间 进行提高吞吐量(因为提高不多) 这时候更应该考虑负载均衡了. 如果访问量不多 但是吞吐量很低 这时候楼主可以考虑 业务优化
一般来说短连接和业务处理时间短的东西很难靠NIO去提高吞吐量
来源:http://www.javaeye.com/problems/23085
以下测试数据通过ab -n 100000 -c 1 http://localhost/,client, server都在一个ubuntu上~
mina处理能力是2K request/s,即使不带业务代码,也不到3k request/s。
在这方面没有过多的经验,在公司也是一个人闭门造车,自己学习新技术能力较强,对nginx的性能也比较有信心,处理静态文件返回是7K request/s。
对erlang比较感兴趣,但是这个技术在公司基本不会采用,所以想直接在apache/nginx(首选nginx)上开发模块,处理http请求,java负责将数据装进memcache,nginx模块直接从memcache取数据,感觉这样性能有保障,这方面的资料网上不多,可能nginx模块本身就不应该用来处理业务逻辑。
故在javaeye请教各位,nginx业务模块,这种方案是否靠谱?有没有相应的案例或者资料来学习的,当然有更好的方案来解决这个问题也希望您能不吝赐教~
谢啦~
问题补充:
其实最终也就是想提高单机吞吐量,负载均衡肯定是需要做的。
对TCP/IP这些理论还没有深入的了解,仅仅停留在知道nginx以C为主的http比java快这个基础上。
还是尝试一下,用C来处理高并发这段的业务,用测试数据说话,谢谢啦
2009-08-22 fjlyxx (中级程序员)
在WIN下面 你同时并非3K到4K 信道就不够了 在LINUX下可以到3W到4W 你同时并发10W 只是一个梦想. 如果你要在1S内吞吐达到10W是可以的 但是一次HTTP请求是一个短连接的过程 连接时间可能就占用了几百毫秒甚至几秒 看LZ的意思 是想从业务处理时间上提高吞吐 但是个人觉得 在单向短连接的情况下 提高余地不高 如果业务处理时间都少于1S的话 那么这个时间基本和你建立连接时间持平 TOMCAT默认15条现场 在TOMCAT LF线程模型下 其实同时并非最大也就15个 但是这15个能同在1S内处理上百个简单请求 这时候瓶颈并不在IO方面 IO方面的瓶颈基本上是因为 访问量过大 建立连接耗时 如果访问量过大那么楼主就不能靠缩小业务处理时间 进行提高吞吐量(因为提高不多) 这时候更应该考虑负载均衡了. 如果访问量不多 但是吞吐量很低 这时候楼主可以考虑 业务优化
一般来说短连接和业务处理时间短的东西很难靠NIO去提高吞吐量
来源:http://www.javaeye.com/problems/23085
从11岁时,我就一直在编程,并且一直都很喜欢技术和编程。这些年来,我积累了一些艰难又容易的经验。作为一名程序员,你或许还没这些经验,但我会把它们献给那些想从中学到更多的朋友。
我会持续更新这些经验,我可能还会有更多的感想,但就我这20年来看,我想下面这个列表中基本不需要增添额外的东西了。下面就是我至今最难忘的经验。
1. 估算解决问题所需要的时间。不要怕,承认吧!我曾见过一些程序员为了解决一个特殊问题而坐在显示器前面8小时。为自己定一个时间限制吧,1小时、30分钟或甚至15分钟。如果在这期间你不能解决问题,那就去寻求帮助,或到网上找答案,而不是尝试去做“超级堆码员”。
2. 编程语言是一种语言,只是一种语言。随着时光推移,只要你理解了一种语言的原理,你会发现各种语言之间的相似之处 。你所选择的语言,你应该觉得“舒服”,并且能够写出有效(而且简洁)的代码。最重要的,让语言去适应项目,反之亦然。
3. 不要过于注重程序的“设计模式”。 有时候,写一个简单的算法,要比引入某种模式更容易。在多数情况下,程序代码应是简单易懂,甚至清洁工也能看懂。
4. 经常备份代码。在我年轻时,我就有过因硬盘故障而丢了大量代码的经历,这经历很恐怖的。只要你一次没有备份,就应当像有着严格的期限,客户明天就需要。此时就该源码/版本控制软件大显身手了。
5. 承认自己并不是最顶尖的程序员 - 知不足。我常想,我对编程了解已足够多,但是总有其他人比你优秀。正所谓,“一山总比一山高”。所以,向他们看齐吧!
6、学习再学习。正如第5点所说,我经常会在手里拿一本计算机或编程相关的杂志或书(不信,可以问我的朋友)。诚然,总有很多你不知道的技术,你可以从中学习以保持不落后。如果你有一种灵巧的方式来获取你需要的新技术,那你每天都应该坚持学习。
7. 永恒的变化。你对待技术/编程知识,就应像你对待股票一样:多样化。不要在某一特定技术上自我感觉良好。如果那种技术或语言已经没有足够支持,那你还不如现在就开始更新你的简历,并启动培训新计划。我能保持前行的主要原则是什么呢?至少了解两到三种语言,所以,如果某种语言过时了,你在学习新技术的时候还可以依靠另一种语言。
8. 提携新人。协助并且培养初级/入门的开发人员学习优秀的编程方法和技巧。也许你还不知道,在帮助他们向更高一层前进时,你自己也在向更高一层提升,你会更加自信。
9. 简化算法。代码如恶魔,在你完成编码后,应回头并且优化它。从长远来看,这里或那里一些的改进,会让后来的支持人员更加轻松。
10. 编写文档。无论是Web服务的API,还是一个简单的类,你尽量编写相应文档。我曾经引以为豪的代码注释,因过度注释而有人指责。给三行代码加一行注释,只需要你几秒时间。如果那是一个比较难以理解的技术,千万别担心过多注释。如果你能很好做好自己的工作,大多数架构师、后备程序员、支持组都会感激你。
11. 测试、测试再测试。我是一名黑盒测试粉丝。当你完成编码后,你“被认可”的时候就开始了。如果你们公司有QA部门,如果你的代码中有错误,那你得到的评论,会比项目经理还多。如果你不彻底测试自己的代码,那恐怕你开发的就不只是代码,可能还会声名狼藉。
12. 庆祝每一次成功。我见过很多程序员在解决编程技术难题后,会和同伴握手、击掌或甚至手舞足蹈。每个人在生命中都会碰到“顿悟”。如果一个程序员高兴地跑来叫你去看他的非凡代码,也许你已经看过这样的代码100遍了,但你也应该为了这个家伙而庆祝第101次。(编者注:《庆祝成功的九种方式》。)
13. 经常检查代码。 在公司,你的代码要经常检查(包括自查和其他同事检查)。不要把别人的检查,看成是对代码风格的苛求。应该把它们看作是有建设性的批评。对个人来说,经常检查你的代码并且自问,“我怎样才能写得更好呢?” 这会让你加速你的成长,让你成为一个更优秀的程序员。
14. 回顾你的代码。在看到自己以前的代码时,通常会有两种方式:“难以至信,这代码是我写的”和“难以至信,这代码是我写的”。第一种往往是厌恶的语气,并在想如何改进它。你也许会惊叹,旧代码也能复活成为一种更好的程序,甚至是一个完整的产品。第二种通常带着惊奇和成就感。开发人员应该一到两个自己完成的项目成果,能让众人不禁而立并注目而观的项目。同样,基于你优越的编程能力,你可以把过去的程序或项目拿出来,把它们更新为更加优秀的产品或想法。
15. 幽默是不可缺的。在我20年的开发生涯中,我还没有碰到哪位程序员是没有幽默感的。实际上,干我们这行,幽默是一项必备品。
16. 谨防那些无所不知的程序员,不愿分享的程序员,还有经验不足的程序员。当你遇到这几种程序员时,你自己要谦虚。无所不知的程序员,更想当一个英雄而不是团队成员;保守的程序员则是在编写着他们独享的代码;而经验不足的程序员则会每十分钟就来问你一下,当代码完成后,代码已经是你的,而不是他们。
17. 任何项目都不会那么简单。朋友、家人和同事曾请求我仓促做一些事情,仓促做一个程序或者网站。对于这样的事,应该从双方做计划,才能做出令两方都会满意的东西。如果某人起初只是需要一个使用Microsoft Access的、只有有3个页面的网站,但来就很可能变成一个有15个页面的网站,并使用SQL Server,有一个论坛,还有一个定制的CMS(内容管理系统)。
18. 任何时候不要想当然。假如你承接一个简单的项目,你可能会认为某个部分可以轻松完成。千万别这样想!除非你有一个类、组件、或者一段已经写好的代码,并且在现有的项目已经测试通过。不要认为这将是很容易的。
19. 没有已经完成的软件。曾经有一位程序员告诉我,没有软件是已经完成的,它只是“暂时完成了”。这是明智的忠告。如果客户还在使用你写的程序,并经受了时间的考验。如果有机会,你仍在更新它,这并不是什么坏事,这让你不断地前行。
20. 耐心是一种美德。当客户、朋友或家庭成员用电脑的时候,他们也许会受挫,进而想砸电脑,或气冲冲地离开。我一直在告诉他们,“是你掌控电脑,不是电脑掌控你。”对于用作编程的电脑,你要有一定的耐心。一旦程序员知道问题所在后,他们就会站在电脑的角度看问题,并且说 “哦,这就是为什么它是这样做。”
来源:http://bbs.xidian.edu.cn/viewthread.php?tid=42070
我会持续更新这些经验,我可能还会有更多的感想,但就我这20年来看,我想下面这个列表中基本不需要增添额外的东西了。下面就是我至今最难忘的经验。
1. 估算解决问题所需要的时间。不要怕,承认吧!我曾见过一些程序员为了解决一个特殊问题而坐在显示器前面8小时。为自己定一个时间限制吧,1小时、30分钟或甚至15分钟。如果在这期间你不能解决问题,那就去寻求帮助,或到网上找答案,而不是尝试去做“超级堆码员”。
2. 编程语言是一种语言,只是一种语言。随着时光推移,只要你理解了一种语言的原理,你会发现各种语言之间的相似之处 。你所选择的语言,你应该觉得“舒服”,并且能够写出有效(而且简洁)的代码。最重要的,让语言去适应项目,反之亦然。
3. 不要过于注重程序的“设计模式”。 有时候,写一个简单的算法,要比引入某种模式更容易。在多数情况下,程序代码应是简单易懂,甚至清洁工也能看懂。
4. 经常备份代码。在我年轻时,我就有过因硬盘故障而丢了大量代码的经历,这经历很恐怖的。只要你一次没有备份,就应当像有着严格的期限,客户明天就需要。此时就该源码/版本控制软件大显身手了。
5. 承认自己并不是最顶尖的程序员 - 知不足。我常想,我对编程了解已足够多,但是总有其他人比你优秀。正所谓,“一山总比一山高”。所以,向他们看齐吧!
6、学习再学习。正如第5点所说,我经常会在手里拿一本计算机或编程相关的杂志或书(不信,可以问我的朋友)。诚然,总有很多你不知道的技术,你可以从中学习以保持不落后。如果你有一种灵巧的方式来获取你需要的新技术,那你每天都应该坚持学习。
7. 永恒的变化。你对待技术/编程知识,就应像你对待股票一样:多样化。不要在某一特定技术上自我感觉良好。如果那种技术或语言已经没有足够支持,那你还不如现在就开始更新你的简历,并启动培训新计划。我能保持前行的主要原则是什么呢?至少了解两到三种语言,所以,如果某种语言过时了,你在学习新技术的时候还可以依靠另一种语言。
8. 提携新人。协助并且培养初级/入门的开发人员学习优秀的编程方法和技巧。也许你还不知道,在帮助他们向更高一层前进时,你自己也在向更高一层提升,你会更加自信。
9. 简化算法。代码如恶魔,在你完成编码后,应回头并且优化它。从长远来看,这里或那里一些的改进,会让后来的支持人员更加轻松。
10. 编写文档。无论是Web服务的API,还是一个简单的类,你尽量编写相应文档。我曾经引以为豪的代码注释,因过度注释而有人指责。给三行代码加一行注释,只需要你几秒时间。如果那是一个比较难以理解的技术,千万别担心过多注释。如果你能很好做好自己的工作,大多数架构师、后备程序员、支持组都会感激你。
11. 测试、测试再测试。我是一名黑盒测试粉丝。当你完成编码后,你“被认可”的时候就开始了。如果你们公司有QA部门,如果你的代码中有错误,那你得到的评论,会比项目经理还多。如果你不彻底测试自己的代码,那恐怕你开发的就不只是代码,可能还会声名狼藉。
12. 庆祝每一次成功。我见过很多程序员在解决编程技术难题后,会和同伴握手、击掌或甚至手舞足蹈。每个人在生命中都会碰到“顿悟”。如果一个程序员高兴地跑来叫你去看他的非凡代码,也许你已经看过这样的代码100遍了,但你也应该为了这个家伙而庆祝第101次。(编者注:《庆祝成功的九种方式》。)
13. 经常检查代码。 在公司,你的代码要经常检查(包括自查和其他同事检查)。不要把别人的检查,看成是对代码风格的苛求。应该把它们看作是有建设性的批评。对个人来说,经常检查你的代码并且自问,“我怎样才能写得更好呢?” 这会让你加速你的成长,让你成为一个更优秀的程序员。
14. 回顾你的代码。在看到自己以前的代码时,通常会有两种方式:“难以至信,这代码是我写的”和“难以至信,这代码是我写的”。第一种往往是厌恶的语气,并在想如何改进它。你也许会惊叹,旧代码也能复活成为一种更好的程序,甚至是一个完整的产品。第二种通常带着惊奇和成就感。开发人员应该一到两个自己完成的项目成果,能让众人不禁而立并注目而观的项目。同样,基于你优越的编程能力,你可以把过去的程序或项目拿出来,把它们更新为更加优秀的产品或想法。
15. 幽默是不可缺的。在我20年的开发生涯中,我还没有碰到哪位程序员是没有幽默感的。实际上,干我们这行,幽默是一项必备品。
16. 谨防那些无所不知的程序员,不愿分享的程序员,还有经验不足的程序员。当你遇到这几种程序员时,你自己要谦虚。无所不知的程序员,更想当一个英雄而不是团队成员;保守的程序员则是在编写着他们独享的代码;而经验不足的程序员则会每十分钟就来问你一下,当代码完成后,代码已经是你的,而不是他们。
17. 任何项目都不会那么简单。朋友、家人和同事曾请求我仓促做一些事情,仓促做一个程序或者网站。对于这样的事,应该从双方做计划,才能做出令两方都会满意的东西。如果某人起初只是需要一个使用Microsoft Access的、只有有3个页面的网站,但来就很可能变成一个有15个页面的网站,并使用SQL Server,有一个论坛,还有一个定制的CMS(内容管理系统)。
18. 任何时候不要想当然。假如你承接一个简单的项目,你可能会认为某个部分可以轻松完成。千万别这样想!除非你有一个类、组件、或者一段已经写好的代码,并且在现有的项目已经测试通过。不要认为这将是很容易的。
19. 没有已经完成的软件。曾经有一位程序员告诉我,没有软件是已经完成的,它只是“暂时完成了”。这是明智的忠告。如果客户还在使用你写的程序,并经受了时间的考验。如果有机会,你仍在更新它,这并不是什么坏事,这让你不断地前行。
20. 耐心是一种美德。当客户、朋友或家庭成员用电脑的时候,他们也许会受挫,进而想砸电脑,或气冲冲地离开。我一直在告诉他们,“是你掌控电脑,不是电脑掌控你。”对于用作编程的电脑,你要有一定的耐心。一旦程序员知道问题所在后,他们就会站在电脑的角度看问题,并且说 “哦,这就是为什么它是这样做。”
来源:http://bbs.xidian.edu.cn/viewthread.php?tid=42070
今天配置一台server的php支持curl的时候, 出现如下报错
checking for cURL in default path… not found
configure: error: Please reinstall the libcurl distribution -
easy.h should be in /include/curl/
其实就是curl的dev包没有安装, 解决方案:
终端下
# yum -y install curl-devel
然后就可以继续了
suse enterprise 10 sp2: 注意依赖关系的先后:
root@172.25.39.117:~/webserver/software# rpm -ihv libidn-devel-0.6.0-14.2.i586.rpm
Preparing... ########################################### [100%]
1:libidn-devel ########################################### [100%]
root@172.25.39.117:~/webserver/software# rpm -ihv curl-devel-7.15.1-19.7.i586.rpm
Preparing... ########################################### [100%]
1:curl-devel ########################################### [100%]
来源:http://www.hao32.com/webserver/191.html
suse enterprise 10得找到当时的源码包才行,如下:
SUSE LINUX Enterprise Server 9 for x86
header files and libraries for curl development
Version: 7.11.0
Release: 39.1
Medium: CD3
Path: /suse/i586/curl-devel-7.11.0-39.1.i586.rpm
Group: Development/Libraries/C
License: MPL
Size: 334 KB
Homepage: http://curl.haxx.se/
来源:http://www.novell.com/products/linuxpackages/enterpriseserver/i386/curl-devel.html
RPM Search:
http://rpm.pbone.net/index.php3/stat/4/idpl/3084452/dir/suse_10.x/com/curl-devel-7.15.5-1.guru.suse100.i686.rpm.html
http://rpm.pbone.net/
checking for cURL in default path… not found
configure: error: Please reinstall the libcurl distribution -
easy.h should be in /include/curl/
其实就是curl的dev包没有安装, 解决方案:
终端下
# yum -y install curl-devel
然后就可以继续了
suse enterprise 10 sp2: 注意依赖关系的先后:
root@172.25.39.117:~/webserver/software# rpm -ihv libidn-devel-0.6.0-14.2.i586.rpm
Preparing... ########################################### [100%]
1:libidn-devel ########################################### [100%]
root@172.25.39.117:~/webserver/software# rpm -ihv curl-devel-7.15.1-19.7.i586.rpm
Preparing... ########################################### [100%]
1:curl-devel ########################################### [100%]
来源:http://www.hao32.com/webserver/191.html
suse enterprise 10得找到当时的源码包才行,如下:
SUSE LINUX Enterprise Server 9 for x86
header files and libraries for curl development
Version: 7.11.0
Release: 39.1
Medium: CD3
Path: /suse/i586/curl-devel-7.11.0-39.1.i586.rpm
Group: Development/Libraries/C
License: MPL
Size: 334 KB
Homepage: http://curl.haxx.se/
来源:http://www.novell.com/products/linuxpackages/enterpriseserver/i386/curl-devel.html
RPM Search:
http://rpm.pbone.net/index.php3/stat/4/idpl/3084452/dir/suse_10.x/com/curl-devel-7.15.5-1.guru.suse100.i686.rpm.html
http://rpm.pbone.net/
PHP并行 多进程/多线程
PHP中提供了一个扩展pcntl,可以利用操作系统的fork调用来实现多进程。fork调用后执行的代码将是并行的。
注:pcntl仅支持linux平台,并且只能在cli模式下使用。
PHP官方没有提供多线程的扩展,pecl中有一个pthreads扩展提供了多线程的特性。多进程和多线程其实是作用是相同的。区别是
线程是在同一个进程内的,可以共享内存变量实现线程间通信
线程比进程更轻量级,开很大量进程会比线程消耗更多系统资源
多线程也存在一些问题:
线程读写变量存在同步问题,需要加锁
锁的粒度过大会有性能问题,可能会导致只有1个线程在运行,其他线程都在等待锁。这样就不是并行了
同时使用多个锁,逻辑复杂,一旦某个锁没被正确释放,可能会发生线程死锁
某个线程发生致命错误会导致整个进程崩溃
多进程方式更加稳定,另外利用进程间通信(IPC)也可以实现数据共享。
共享内存,这种方式和线程间读写变量是一样的,需要加锁,会有同步、死锁问题。
消息队列,可以采用多个子进程抢队列模式,性能很好
PIPE,UnixSock,TCP,UDP。可以使用read/write来传递数据,TCP/UDP方式使用socket来通信,子进程可以分布运行
利用fork可以实现一个最简单的并发TCP Server。主进程accept连接,有新的连接到来就Fork一个子进程。子进程中循环recv/send,处理数据。这种模式在请求量不多情况下很实用,像FTP服务器。过去有很多Linux程序都是这种模式的,简单高效,几十行代码就可以实现。当然这种模型在几百个并发的情况下还算不错,大量并发的情况下就有点消耗过大了。
来自:http://swoole.sinaapp.com/archives/48
----------------------------------------------------------------------------------------------------------------------------------------
PHP在很多时候不适合做常驻的SHELL进程, 他没有专门的gc例程, 也没有有效的内存管理途径. 所以如果用PHP做常驻SHELL, 你会经常被内存耗尽导致abort而unhappy.
而且, 如果输入数据非法, 而脚本没有检测, 导致abort, 也会让你很不开心.
那? 怎么办呢?
多进程….
为什么呢?
优点:
1. 使用多进程, 子进程结束以后, 内核会负责回收资源
2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程.
3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.
Then, 怎么做呢?
接下来, 我们使用PHP提供的POSIX和Pcntl系列函数, 来实现一个PHP命令解析器, 主进程负责接受用户输入, 然后fork子进程执行, 并负责回显子进程的结束状态.
代码如下, 我加了注释
来源:http://www.laruence.com/2009/06/11/930.html
PHP中提供了一个扩展pcntl,可以利用操作系统的fork调用来实现多进程。fork调用后执行的代码将是并行的。
注:pcntl仅支持linux平台,并且只能在cli模式下使用。
PHP官方没有提供多线程的扩展,pecl中有一个pthreads扩展提供了多线程的特性。多进程和多线程其实是作用是相同的。区别是
线程是在同一个进程内的,可以共享内存变量实现线程间通信
线程比进程更轻量级,开很大量进程会比线程消耗更多系统资源
多线程也存在一些问题:
线程读写变量存在同步问题,需要加锁
锁的粒度过大会有性能问题,可能会导致只有1个线程在运行,其他线程都在等待锁。这样就不是并行了
同时使用多个锁,逻辑复杂,一旦某个锁没被正确释放,可能会发生线程死锁
某个线程发生致命错误会导致整个进程崩溃
多进程方式更加稳定,另外利用进程间通信(IPC)也可以实现数据共享。
共享内存,这种方式和线程间读写变量是一样的,需要加锁,会有同步、死锁问题。
消息队列,可以采用多个子进程抢队列模式,性能很好
PIPE,UnixSock,TCP,UDP。可以使用read/write来传递数据,TCP/UDP方式使用socket来通信,子进程可以分布运行
利用fork可以实现一个最简单的并发TCP Server。主进程accept连接,有新的连接到来就Fork一个子进程。子进程中循环recv/send,处理数据。这种模式在请求量不多情况下很实用,像FTP服务器。过去有很多Linux程序都是这种模式的,简单高效,几十行代码就可以实现。当然这种模型在几百个并发的情况下还算不错,大量并发的情况下就有点消耗过大了。
来自:http://swoole.sinaapp.com/archives/48
----------------------------------------------------------------------------------------------------------------------------------------
PHP在很多时候不适合做常驻的SHELL进程, 他没有专门的gc例程, 也没有有效的内存管理途径. 所以如果用PHP做常驻SHELL, 你会经常被内存耗尽导致abort而unhappy.
而且, 如果输入数据非法, 而脚本没有检测, 导致abort, 也会让你很不开心.
那? 怎么办呢?
多进程….
为什么呢?
优点:
1. 使用多进程, 子进程结束以后, 内核会负责回收资源
2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程.
3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.
Then, 怎么做呢?
接下来, 我们使用PHP提供的POSIX和Pcntl系列函数, 来实现一个PHP命令解析器, 主进程负责接受用户输入, 然后fork子进程执行, 并负责回显子进程的结束状态.
代码如下, 我加了注释
#!/bin/env php
<?php
/** A example denoted muti-process application in php
* @filename fork.php
* @touch date Wed 10 Jun 2009 10:25:51 PM CST
* @author Laruence<laruence@baidu.com>
* @license http://www.zend.com/license/3_0.txt PHP License 3.0
* @version 1.0.0
*/
/** 确保这个函数只能运行在SHELL中 */
if (substr(php_sapi_name(), 0, 3) !== 'cli') {
die("This Programe can only be run in CLI mode");
}
/** 关闭最大执行时间限制, 在CLI模式下, 这个语句其实不必要 */
set_time_limit(0);
$pid = posix_getpid(); //取得主进程ID
$user = posix_getlogin(); //取得用户名
echo <<<EOD
USAGE: [command | expression]
input php code to execute by fork a new process
input quit to exit
Shell Executor version 1.0.0 by laruence
EOD;
while (true) {
$prompt = "\n{$user}$ ";
$input = readline($prompt);
readline_add_history($input);
if ($input == 'quit') {
break;
}
process_execute($input . ';');
}
exit(0);
function process_execute($input) {
$pid = pcntl_fork(); //创建子进程
if ($pid == 0) {//子进程
$pid = posix_getpid();
echo "* Process {$pid} was created, and Executed:\n\n";
eval($input); //解析命令
exit;
} else {//主进程
$pid = pcntl_wait($status, WUNTRACED); //取得子进程结束状态
if (pcntl_wifexited($status)) {
echo "\n\n* Sub process: {$return['pid']} exited with {$status}";
}
}
}
<?php
/** A example denoted muti-process application in php
* @filename fork.php
* @touch date Wed 10 Jun 2009 10:25:51 PM CST
* @author Laruence<laruence@baidu.com>
* @license http://www.zend.com/license/3_0.txt PHP License 3.0
* @version 1.0.0
*/
/** 确保这个函数只能运行在SHELL中 */
if (substr(php_sapi_name(), 0, 3) !== 'cli') {
die("This Programe can only be run in CLI mode");
}
/** 关闭最大执行时间限制, 在CLI模式下, 这个语句其实不必要 */
set_time_limit(0);
$pid = posix_getpid(); //取得主进程ID
$user = posix_getlogin(); //取得用户名
echo <<<EOD
USAGE: [command | expression]
input php code to execute by fork a new process
input quit to exit
Shell Executor version 1.0.0 by laruence
EOD;
while (true) {
$prompt = "\n{$user}$ ";
$input = readline($prompt);
readline_add_history($input);
if ($input == 'quit') {
break;
}
process_execute($input . ';');
}
exit(0);
function process_execute($input) {
$pid = pcntl_fork(); //创建子进程
if ($pid == 0) {//子进程
$pid = posix_getpid();
echo "* Process {$pid} was created, and Executed:\n\n";
eval($input); //解析命令
exit;
} else {//主进程
$pid = pcntl_wait($status, WUNTRACED); //取得子进程结束状态
if (pcntl_wifexited($status)) {
echo "\n\n* Sub process: {$return['pid']} exited with {$status}";
}
}
}
来源:http://www.laruence.com/2009/06/11/930.html
以下这些tips,是我在实际工作中慢慢形成的,有些可能是不正确的,有些出于个人习惯,所以,千万不要把以下这些条当成什么标准,其中可能隐藏着天大的bug,代码可能正在病态的运行中,SO!请一定仔细的看过后想想,这么做的好处是什么?会产生怎样的负面影响?有问题特别欢迎你来和我讨论。这就是我写这篇文字的目的,希望能和大家多多交流,也希望不断完善自己,同时又能给大家一些帮助。
开发习惯和PHP代码:
1、准确的理解各种概念。现在的新东西层出不穷,望文生义和一知半解对开发工作有害无益;
2、代码美观,适当的空行、缩进,空格,这样能更容易理解代码段的意思;
3、一定要写注释,而且要恰当的注释,要不然后面的维护工作或者接手代码的人会痛哭不已;
4、静态方法、类访问权限、接口、抽象类应该综合起来使用,发挥各自特点;
5、不要复制粘贴,即使是要用到现成的代码,也要一行一行的审阅后,再加入到新项目,因为经验告诉我们,这太容易出错了,对于使用开源类这种大段代码更需要;
6、变量都要初始化;
7、不要只处理error,而忽略warning和notice,这可能会导致日后的莫名其妙的问题,项目在开发状态下应该是error_reporting( E_ALL ^ E_NOTICE ),等到发布的外网生产环境时,应关闭所有错误报告display_errors=Off,error_reporting(0)网友 pAUL gAO分享了他们更合理的方案,error_reporting(E_ALL | E_STRICT),并且在生产环境中记录错误日志
8、记录一些必要的错误日志,比如写文件失败、写memcache失败,socket连接失败、读写数据库失败,日志能够帮助出现问题时的快速定位,外部生产环境我个人是强烈建议关闭所有错误报告的;
9、用try、catch捕获异常,对代码的健壮有帮助,常常在API接口中碰到,这样子显得友好多了;
10、双引号中出现的变量建议加上大括号,至于是”${nider}at gmail.com”还是”{$tom}at zendstudio.net”看个人习惯,我更喜欢后面一种;
11、尽量少的if else嵌套层数,也许你要表达一个非常复杂的逻辑算法,但这样做至少能让代码逻辑更清晰
12、多阅读网上开源项目的优秀代码(不是优秀项目的开源代码),吸取其中值得借鉴的地方
13、语言包用sprintf的格式化来做是多么惬意的一件事啊!
14、写缓存并不总是要先serialize一次的
15、AJAX传数据的时候,不要将数据库查出的数组直接json_encode后传给客户端,这样做不仅有一定的安全风险(字段名暴露),而且一些不需要的数据被传出浪费带宽,这条同样适用于API接口
16、要记得处理魔术变量,我的方法是直接关闭,当然也可以获取开关状态来避免传输数据被处理两次的问题
17、用$GLOBALS['var']代替global $var
18、不能轻易的die掉程序,尤其是在方法内部
19、require、require_once、include、include_once有着略微不同的应用场景
20、为了最大限度的使得写入缓存成功,可以结合重试次数+usleep,我一般重试3次,还不行那就记下一条log了
21、PHP的常量是个非常好的东西,很多开源项目中用一整个文件来定义要用到的常量
22、尽可能的使用绝对路径寻找文件
23、autoload是个很灵活的东西
24、最好用上set_error_handler和set_exception_handler,那显得你的项目更完美
25、PHP的引用类型是很高效的,在进行复杂运算时建议使用
26、@符号抑制错误是很耗性能的,因此尽可能的找到替代方案
MYSQL部分:
1、SQL语句用双引号,其中的值都用单引号,例如”INSERT INTO gril SET money=’{$iMaxMoney}’,age=’18′”
2、用mysqli扩展代替mysql扩展
2、用mysqli_real_escape_string和mysqli_escape_string处理传出sql语句中的变量
3、用mysqli_set_charset(mysqli->set_charset)代替 query “SET NAMES”
4、联合查询(JOIN)之前,考虑下各个表的数据量,不合适的话应该分开查,尤其是有缓存可用的时候
5、很多地方需要记录发生时间,但不是每一个表都需要,同样,不是每一个表都需要一个自增量作主键
6、很多时候为integer类型加上unsigned是很好的
7、INERT DELEYED、INSERT IGNORE、SELECT DISTINCT…这种语句通常有意想不到的好效果
8、varchar类型并不是不能超过255长度,而是超过了255,这个字段就不能建立索引了,所以,看你的实际需要了
暂时就想到这么多,等再想到的继续update吧。想到什么写什么,没有什么条理性,多多包涵了,如果这些对你有点滴帮助,那我就感到非常开心了。
最后一条终极建议就是——多和别人交流能够进步更快、更大!欢迎与我交流,留下你的宝贵意见。
来源:http://www.zendstudio.net/archives/some-php-development-tips-from-my-own/
开发习惯和PHP代码:
1、准确的理解各种概念。现在的新东西层出不穷,望文生义和一知半解对开发工作有害无益;
2、代码美观,适当的空行、缩进,空格,这样能更容易理解代码段的意思;
3、一定要写注释,而且要恰当的注释,要不然后面的维护工作或者接手代码的人会痛哭不已;
4、静态方法、类访问权限、接口、抽象类应该综合起来使用,发挥各自特点;
5、不要复制粘贴,即使是要用到现成的代码,也要一行一行的审阅后,再加入到新项目,因为经验告诉我们,这太容易出错了,对于使用开源类这种大段代码更需要;
6、变量都要初始化;
7、不要只处理error,而忽略warning和notice,这可能会导致日后的莫名其妙的问题,项目在开发状态下应该是error_reporting( E_ALL ^ E_NOTICE ),等到发布的外网生产环境时,应关闭所有错误报告display_errors=Off,error_reporting(0)网友 pAUL gAO分享了他们更合理的方案,error_reporting(E_ALL | E_STRICT),并且在生产环境中记录错误日志
8、记录一些必要的错误日志,比如写文件失败、写memcache失败,socket连接失败、读写数据库失败,日志能够帮助出现问题时的快速定位,外部生产环境我个人是强烈建议关闭所有错误报告的;
9、用try、catch捕获异常,对代码的健壮有帮助,常常在API接口中碰到,这样子显得友好多了;
10、双引号中出现的变量建议加上大括号,至于是”${nider}at gmail.com”还是”{$tom}at zendstudio.net”看个人习惯,我更喜欢后面一种;
11、尽量少的if else嵌套层数,也许你要表达一个非常复杂的逻辑算法,但这样做至少能让代码逻辑更清晰
12、多阅读网上开源项目的优秀代码(不是优秀项目的开源代码),吸取其中值得借鉴的地方
13、语言包用sprintf的格式化来做是多么惬意的一件事啊!
14、写缓存并不总是要先serialize一次的
15、AJAX传数据的时候,不要将数据库查出的数组直接json_encode后传给客户端,这样做不仅有一定的安全风险(字段名暴露),而且一些不需要的数据被传出浪费带宽,这条同样适用于API接口
16、要记得处理魔术变量,我的方法是直接关闭,当然也可以获取开关状态来避免传输数据被处理两次的问题
17、用$GLOBALS['var']代替global $var
18、不能轻易的die掉程序,尤其是在方法内部
19、require、require_once、include、include_once有着略微不同的应用场景
20、为了最大限度的使得写入缓存成功,可以结合重试次数+usleep,我一般重试3次,还不行那就记下一条log了
21、PHP的常量是个非常好的东西,很多开源项目中用一整个文件来定义要用到的常量
22、尽可能的使用绝对路径寻找文件
23、autoload是个很灵活的东西
24、最好用上set_error_handler和set_exception_handler,那显得你的项目更完美
25、PHP的引用类型是很高效的,在进行复杂运算时建议使用
26、@符号抑制错误是很耗性能的,因此尽可能的找到替代方案
MYSQL部分:
1、SQL语句用双引号,其中的值都用单引号,例如”INSERT INTO gril SET money=’{$iMaxMoney}’,age=’18′”
2、用mysqli扩展代替mysql扩展
2、用mysqli_real_escape_string和mysqli_escape_string处理传出sql语句中的变量
3、用mysqli_set_charset(mysqli->set_charset)代替 query “SET NAMES”
4、联合查询(JOIN)之前,考虑下各个表的数据量,不合适的话应该分开查,尤其是有缓存可用的时候
5、很多地方需要记录发生时间,但不是每一个表都需要,同样,不是每一个表都需要一个自增量作主键
6、很多时候为integer类型加上unsigned是很好的
7、INERT DELEYED、INSERT IGNORE、SELECT DISTINCT…这种语句通常有意想不到的好效果
8、varchar类型并不是不能超过255长度,而是超过了255,这个字段就不能建立索引了,所以,看你的实际需要了
暂时就想到这么多,等再想到的继续update吧。想到什么写什么,没有什么条理性,多多包涵了,如果这些对你有点滴帮助,那我就感到非常开心了。
最后一条终极建议就是——多和别人交流能够进步更快、更大!欢迎与我交流,留下你的宝贵意见。
来源:http://www.zendstudio.net/archives/some-php-development-tips-from-my-own/