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 相关文章推荐
多重?l件?合查?(一)
Oct 09 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
Sep 20 PHP
PHP empty函数报错解决办法
Mar 06 PHP
php获取数组元素中头一个数组元素值的实现方法
Dec 20 PHP
PHP基于curl后台远程登录正方教务系统的方法
Oct 14 PHP
php获取网站根目录物理路径的几种方法(推荐)
Mar 04 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
Jun 08 PHP
PHP读取CSV大文件导入数据库的实例
Jul 24 PHP
详细解读php的命名空间(一)
Feb 21 PHP
PHP iconv()函数字符编码转换的问题讲解
Mar 22 PHP
Yii2.0框架模型多表关联查询示例
Jul 18 PHP
Laravel 5+ .env环境配置文件详解
Apr 06 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
一个php作的文本留言本的例子(一)
2006/10/09 PHP
php date()日期时间函数详解
2010/05/16 PHP
PHP curl CURLOPT_RETURNTRANSFER参数的作用使用实例
2015/02/07 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
2015/12/08 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
2016/07/07 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
推荐:极酷右键菜单
2006/11/29 Javascript
javascript十个最常用的自定义函数(中文版)
2009/09/07 Javascript
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
2009/10/24 Javascript
使用typeof判断function是否存在于上下文
2014/08/14 Javascript
jquery插件splitScren实现页面分屏切换模板特效
2015/06/16 Javascript
jQuery事件绑定on()与弹窗实现代码
2016/04/28 Javascript
Web打印解决方案之证件套打的实现思路
2016/08/29 Javascript
微信小程序之仿微信漂流瓶实例
2016/12/09 Javascript
微信小程序 input输入框详解及简单实例
2017/01/10 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
angular动态删除ng-repaeat添加的dom节点的方法
2017/07/20 Javascript
js 只比较时间大小的实例
2017/10/26 Javascript
jQuery HTML获取内容和属性操作实例分析
2020/05/20 jQuery
Vue自定义多选组件使用详解
2020/09/08 Javascript
[09:22]2014DOTA2西雅图国际邀请赛 主赛事第二日TOPPLAY
2014/07/21 DOTA
[12:29]2018国际邀请赛 开幕秀
2018/08/22 DOTA
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
Python KMeans聚类问题分析
2018/02/23 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
pyqt5 获取显示器的分辨率的方法
2019/06/18 Python
django之对FileField字段的upload_to的设定方法
2019/07/28 Python
Pytorch Tensor的统计属性实例讲解
2019/12/30 Python
什么是CSS3 HSLA色彩模式?HSLA模拟渐变色条
2016/04/26 HTML / CSS
HTML5 Canvas实现平移/放缩/旋转deom示例(附截图)
2013/07/04 HTML / CSS
Banana Republic英国官网:香蕉共和国,GAP集团旗下偏贵族风
2018/04/24 全球购物
致跳远运动员加油稿
2014/02/11 职场文书
婚礼庆典答谢词
2015/01/20 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
Python办公自动化之教你如何用Python将任意文件转为PDF格式
2021/06/28 Python