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生成静态页
Nov 25 PHP
一个PHP数组应该有多大的分析
Jul 30 PHP
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
Sep 07 PHP
PHP正则表达式之定界符和原子介绍
Oct 05 PHP
PHP正确解析UTF-8字符串技巧应用
Nov 07 PHP
php中防止SQL注入的最佳解决方法
Apr 25 PHP
深入PHP变量存储的详解
Jun 13 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
Jun 25 PHP
php除数取整示例
Apr 24 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
Aug 21 PHP
图文详解phpstorm配置Xdebug进行调试PHP教程
Jun 13 PHP
laravel框架邮箱认证实现方法详解
Nov 22 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中引用符号(&amp;)的使用详解
2013/11/13 PHP
浅析php中json_encode()和json_decode()
2014/05/25 PHP
php过滤html标记属性类用法实例
2014/09/23 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
php及codeigniter使用session-cookie的方法(详解)
2017/04/06 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
use jscript List Installed Software
2007/06/11 Javascript
html中的input标签的checked属性jquery判断代码
2012/09/19 Javascript
js与C#进行时间戳转换
2014/11/14 Javascript
JS实现可展开折叠层的鼠标拖曳效果
2015/10/09 Javascript
JS实现的3D拖拽翻页效果代码
2015/10/31 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
JS基于面向对象实现的多个倒计时器功能示例
2017/02/28 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
2018/10/08 Javascript
vue项目配置使用flow类型检查的步骤
2020/03/18 Javascript
Vue实现省市区三级联动
2020/12/27 Vue.js
python中使用百度音乐搜索的api下载指定歌曲的lrc歌词
2014/07/18 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
Python嵌套式数据结构实例浅析
2019/03/05 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
大学生军训自我评价分享
2013/11/09 职场文书
酒店总经理职务说明书
2014/02/26 职场文书
团队口号大全
2014/06/06 职场文书
教师优秀党员事迹材料
2014/08/14 职场文书
ktv服务员岗位职责
2015/02/09 职场文书
计划生育个人总结
2015/03/02 职场文书
pycharm 如何查看某一函数源码的快捷键
2021/05/12 Python
Python实现单例模式的5种方法
2021/06/15 Python
redis不能访问本机真实ip地址的解决方案
2021/07/07 Redis
MySQL常见优化方案汇总
2022/01/18 MySQL