PHP CLI模式下的多进程应用分析


Posted in PHP onJune 03, 2013

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: {$pid} exited with {$status}"; 
} 
} 
}

但有一点, 我一定要提醒:
Process Control should not be enabled within a webserver environment and unexpected results may happen if any Process Control functions are used within a webserver environment. --摘自PHP手也就是说, 打消你在PHP Web开发中使用多进程的念头吧!

原文:http://www.laruence.com/2009/06/11/930.html

PHP 相关文章推荐
php 应用程序安全防范技术研究
Sep 25 PHP
PHP处理excel cvs表格的方法实例介绍
May 13 PHP
浅析php中如何在有限的内存中读取大文件
Jul 02 PHP
浅析php数据类型转换
Jan 09 PHP
PHP中鲜为人知的10个函数
Feb 28 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
Oct 01 PHP
thinkPHP导出csv文件及用表格输出excel的方法
Dec 30 PHP
php打包压缩文件之ZipArchive方法用法分析
Apr 30 PHP
CodeIgniter框架验证码类库文件与用法示例
Mar 18 PHP
php封装db类连接sqlite3数据库的方法实例
Dec 19 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
Nov 26 PHP
TP5框架实现上传多张图片的方法分析
Mar 29 PHP
基于php-fpm 参数的深入理解
Jun 03 #PHP
php-cli简介(不会Shell语言一样用Shell)
Jun 03 #PHP
基于在生产环境中使用php性能测试工具xhprof的详解
Jun 03 #PHP
php cli模式学习(PHP命令行模式)
Jun 03 #PHP
获取PHP警告错误信息的解决方法
Jun 03 #PHP
php cli 小技巧
Jun 03 #PHP
php中用加号与用array_merge合并数组的区别深入分析
Jun 03 #PHP
You might like
基于mysql的bbs设计(三)
2006/10/09 PHP
php实现网站插件机制的方法
2009/11/10 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
yii2实现分页,带搜索的分页功能示例
2017/01/07 PHP
优化JavaScript脚本的性能的几个注意事项
2006/12/22 Javascript
jquery无缝向上滚动实现代码
2013/03/29 Javascript
jquery实现点击变换导航样式的方法
2015/08/31 Javascript
jQuery实现摸拟alert提示框
2016/05/22 Javascript
jQuery+CSS3实现四种应用广泛的导航条制作实例详解
2016/09/17 Javascript
手机端实现Bootstrap简单图片轮播效果
2016/10/13 Javascript
微信小程序中用WebStorm使用LESS
2017/03/08 Javascript
javascript 正则表达式分组、断言详解
2017/04/20 Javascript
在ABP框架中使用BootstrapTable组件的方法
2017/07/31 Javascript
利用JS做网页特效_大图轮播(实例讲解)
2017/08/09 Javascript
express框架实现基于Websocket建立的简易聊天室
2017/08/10 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
layui问题之模拟select点击事件的实例讲解
2018/08/15 Javascript
Vue 监听列表item渲染事件方法
2018/09/06 Javascript
JS数组实现分类统计实例代码
2018/09/30 Javascript
Layui表格监听行单双击事件讲解
2019/11/14 Javascript
Python脚本实现代码行数统计代码分享
2015/03/10 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
python super函数使用方法详解
2020/02/14 Python
Python控制台实现交互式环境执行
2020/06/09 Python
python 实现aes256加密
2020/11/27 Python
浅谈Selenium+Webdriver 常用的元素定位方式
2021/01/13 Python
澳大利亚牛仔裤商店:Just Jeans
2016/10/13 全球购物
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
离婚协议书范文2014
2014/10/16 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
汽车4S店前台接待岗位职责
2015/04/03 职场文书
汽车销售助理岗位职责
2015/04/14 职场文书
催款函范本大全
2015/06/24 职场文书
2015年秋季小学开学典礼主持词
2015/07/16 职场文书
2016廉洁教育心得体会
2016/01/20 职场文书
Golang 入门 之url 包
2022/05/04 Golang