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获取远程图片的两种 CURL方式和sockets方式获取远程图片
Nov 07 PHP
解析百度搜索结果link?url=参数分析 (全)
Oct 09 PHP
php 生成短网址原理及代码
Jan 23 PHP
thinkphp循环结构用法实例
Nov 24 PHP
php定义参数数量可变的函数用法实例
Mar 16 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
Oct 22 PHP
利用PHP实现一个简单的用户登记表示例
Apr 25 PHP
详解PHP防止盗链防止迅雷下载的方法
Apr 26 PHP
详解php中的implements 使用
Jun 13 PHP
PHP单例模式简单用法示例
Jun 23 PHP
PHP笛卡尔积实现算法示例
Jul 30 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
Apr 16 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
PHPMYADMIN 简明安装教程 推荐
2010/03/07 PHP
PHP连续签到功能实现方法详解
2019/12/04 PHP
关于PHP中interface的用处详解
2020/07/26 PHP
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
2012/12/07 Javascript
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
jQuery中校验时间格式的正则表达式小结
2013/09/22 Javascript
javaScript 计算两个日期的天数相差(示例代码)
2013/12/27 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
2013/12/27 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
Javascript字符串常用方法详解
2016/07/21 Javascript
AngularJS 工作原理详解
2016/08/18 Javascript
浅谈jquery中next与siblings的区别
2016/10/27 Javascript
详解微信小程序入门五: wxml文件引用、模版、生命周期
2017/01/20 Javascript
jQuery plugin animsition使用小结
2017/09/14 jQuery
使用RN Animated做一个“添加购物车”动画的方法
2018/09/12 Javascript
使用gulp构建前端自动化的方法示例
2018/12/25 Javascript
vue.config.js常用配置详解
2019/11/14 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
2019/12/16 Javascript
Cython 三分钟入门教程
2009/09/17 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
2018/01/10 Python
python使用sqlite3时游标使用方法
2018/03/13 Python
django 基于中间件实现限制ip频繁访问过程详解
2019/07/30 Python
python rsync服务器之间文件夹同步脚本
2019/08/29 Python
Python namedtuple命名元组实现过程解析
2020/01/08 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
应届实习生的自我评价范文
2014/01/05 职场文书
爱心倡议书范文
2014/05/12 职场文书
销售行政专员岗位职责
2014/06/10 职场文书
大学生个人简历自荐信
2015/03/06 职场文书
音乐教师求职信范文
2015/03/20 职场文书
电影小兵张嘎观后感
2015/06/03 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
文艺节目主持词
2015/07/06 职场文书
JS实现简单控制视频播放倍速的实例代码
2021/04/18 Javascript
python爬取新闻门户网站的示例
2021/04/25 Python