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 相关文章推荐
一个可以删除字符串中HTML标记的PHP函数
Oct 09 PHP
php操作excel文件 基于phpexcel
Jul 02 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
Aug 13 PHP
PHP curl 抓取AJAX异步内容示例
Sep 09 PHP
浅析php创建者模式
Nov 25 PHP
php多次include后导致全局变量global失效的解决方法
Feb 28 PHP
浅谈本地WAMP环境的搭建
May 13 PHP
PHP超全局数组(Superglobals)介绍
Jul 01 PHP
php获取图片信息的方法详解
Dec 10 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
Dec 24 PHP
PHP数据对象PDO操作技巧小结
Sep 27 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
Jul 03 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之字符串变相相减的代码
2007/03/19 PHP
IIS6的PHP最佳配置方法
2007/03/19 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
2015/12/11 PHP
php微信公众号js-sdk开发应用
2016/11/28 PHP
JavaScript监测ActiveX控件是否已经安装过的代码
2008/09/02 Javascript
json原理分析及实例介绍
2012/11/29 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
基于jquery实现的定时显示与隐藏div广告的实现代码
2013/08/22 Javascript
js中function()使用方法
2013/12/24 Javascript
jQuery焦点图切换简易插件制作过程全纪录
2014/08/27 Javascript
javascript使用数组的push方法完成快速排序
2014/09/15 Javascript
Javascript学习指南
2014/12/01 Javascript
JQuery中attr属性和jQuery.data()学习笔记【必看】
2016/05/18 Javascript
jQuery简单实现列表隐藏和显示效果示例
2016/09/12 Javascript
小发现之浅谈location.search与location.hash的问题
2017/06/23 Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
2017/08/16 Javascript
react-router browserHistory刷新页面404问题解决方法
2017/12/29 Javascript
收集前端面试题之url、href、src
2018/03/22 Javascript
vue 解决异步数据更新问题
2019/10/29 Javascript
js实现时间日期校验
2020/05/26 Javascript
js实现贪吃蛇小游戏(加墙)
2020/07/31 Javascript
js数组中去除重复值的几种方法
2020/08/03 Javascript
vue下拉刷新组件的开发及slot的使用详解
2020/12/23 Vue.js
一步步教你用Python实现2048小游戏
2017/01/19 Python
Python爬虫实例扒取2345天气预报
2018/03/04 Python
详解Django中六个常用的自定义装饰器
2018/07/04 Python
Python对HTML转义字符进行反转义的实现方法
2019/04/28 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
解决导入django_filters不成功问题No module named 'django_filter'
2020/07/15 Python
澳大利亚宠物食品和药物在线:Jumbo Pets
2018/03/24 全球购物
水电工岗位职责
2014/02/12 职场文书
《将心比心》教学反思
2014/04/08 职场文书
我的未来不是梦演讲稿
2014/09/02 职场文书
面试复试通知单
2015/04/24 职场文书
家长会感言
2015/08/01 职场文书
使用pandas模块实现数据的标准化操作
2021/05/14 Python