php多进程实战
PHP #多进程2012-10-31 16:01
为什么PHP多进程很好? 网游服务器大部分都使用多线程而不是多进程的原因也在于进程比线程更加稳定。而且多线程适合现在多核服务器的应用场景,更能发挥多核运算的能力。进程的维护可以用很多操作系统级别的工具。Message Queue解决了多大部分线程通信问题。所以PHP多进程很适合做服务器端的计算密集型的应用。
据一家越南IT公司介绍,他们成功的把PHP后台多进程用在法律文件的分发、处理银行账户的金额这样的企业级的应用上。
使用后台PHP进程可以不影响服务器同时处理网页的请求。这种后台进程一旦发生失败很容易查处原因进行恢复或者补救,所以健壮性更高。不同的进程相互隔离,更加高效,可以统一调度各个服务进程。
PHP是目前应用最广泛的Web开发语言,所以用PHP来做服务器端的应用可以降低成本。可以用现有人员、现有配置、甚至做到代码重用。什么样的场景更适合用PHP后台多进程呢?比如邮件的分发、远程服务的调用、数据的聚合、计划任务、计算结果的缓存这些不需要立即返回的地方。
PHP单进程在某些地方完全可以达到目的,而且更加容易实现,不用考虑进程的同步问题,不用考虑数据的共享问题。PHP CLI(SAPI SERVER API) 命令行接口可以用来做CRON计划任务, 图形界面程序 (使用GTK库)。
PHP CLI例子
php -f test.php
php -r “echo time();”
php -R as python style
PHP读取命令行参数:
<?php#!/usr/bin/php -q
echo “Test Arguments:\n”;
echo $_SERVER["argc"].”\n”;
echo $_SERVER["argv"][0].”\n”;
?>
PHP命令行接口标准输入输出:
<?php
#!/usr/bin/php -q
/* Define STDIN in case if it is not already defined by PHP for some reason */
if(!defined(“STDIN”)) {
define(“STDIN”, fopen(‘php://stdin’,'r’))
}
echo “Hello! What is your name (enter below):\n”;
$strName = fread(STDIN, 80); // Read up to 80 characters or a newline
echo ‘Hello ‘ , $strName , “\n”;
?>
CRONJOB可以定时运行某些任务,但要防止重复运行。开始时创建一个锁文件, 结束时删除。或者用ps命令来处理。任务队列可以用MySQL来实现,或者Key/VALUE数据库,或者消息队列来实现。
进程控制相关函数:
Process Control Extensions
pcntl_fork()
posix_setsid()
posix_kill
pcntl_wait
pcntl_signal
SIGHUP
SIGTERM; system shutdown, kill
SIGINT; sent by Ctrl+c
SIGKILL (uncatchable); unresponsive, kill -9
SIGCHLD; child status change
SIGSTP; sent by Ctrl+z
SIGCONT; resume from stop, fg
PHP不能对某些错误抛出异常,如何提高PHP多进程应用的容错性?
◆可以监控进程,依赖进程失败后报告。
◆用CRONJOB实现监控进程。
◆将被监控进程PID写成文件。
◆定时检查PID文件是否存在 检查ps -o pid=或者file_exists(‘/proc/’)。
◆如果线程不存在重启进程。
回顾以前用Java或者Python做的服务器端的服务都可以用PHP来实现。单一语言更容易维护。以往人们对于Web语言的认识很片面,例如多线程、事 务这些东西都可以改变方式来达到同样的目的。
相关文章
- PHP常用正则表达式 2012/10/31
- PHP判断端口是否打开的代码 2012/10/30
- PHP访问MYSQL数据库封装类 2012/10/30
- php跳转的三种实现方法 2012/10/30
- php怎样判断MySQL的update语句是否执行成功 2012/10/30
- PHP引号的正确使用 2012/10/30
- php支持apc和文件缓存的缓存类 2012/10/30
- php可以逆转的加密类 2012/10/30
- PHP获取指定IP地址的whois数据 2012/10/30
- php5中北京时间差8小时的解决办法 2012/10/30