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 相关文章推荐
一个目录遍历函数
Oct 09 PHP
本地计算机无法启动Apache故障处理
Aug 08 PHP
ThinkPHP查询返回简单字段数组的方法
Aug 25 PHP
php中文字符串截取方法实例总结
Sep 30 PHP
2014最热门的24个php类库汇总
Dec 18 PHP
PHP中如何防止外部恶意提交调用ajax接口
Apr 11 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
Jun 13 PHP
php实现学生管理系统
Mar 21 PHP
全面解析PHP操作Memcache基本函数
Jul 14 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
Nov 06 PHP
php生成二维码不保存服务器还有下载功能的实现代码
Aug 09 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 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
实现树状结构的两种方法
2006/10/09 PHP
PHP Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
解析将多维数组转换为支持curl提交的一维数组格式
2013/07/08 PHP
php自定义函数截取汉字长度
2014/05/15 PHP
smarty模板引擎从配置文件中获取数据的方法
2015/01/22 PHP
php redis实现文章发布系统(用户投票系统)
2017/03/04 PHP
laravel 模型查询按照whereIn排序的示例
2019/10/16 PHP
phpstudy后门rce批量利用脚本的实现
2019/12/12 PHP
jquery 模拟雅虎首页的点击对话框效果
2010/04/11 Javascript
Js+Flash实现访问剪切板操作
2012/11/20 Javascript
jQery使网页在显示器上居中显示适用于任何分辨率
2014/06/09 Javascript
javascript在IE下trim函数无法使用的解决方法
2014/09/12 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
跟我学习javascript的垃圾回收机制与内存管理
2015/11/23 Javascript
浅谈js原生拖放
2016/11/21 Javascript
javascript数组去重方法分析
2016/12/15 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
小程序组件之仿微信通讯录的实现代码
2018/09/12 Javascript
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
Vue CLI3中使用compass normalize的方法
2019/05/30 Javascript
JavaScript实现英语单词题库
2019/12/24 Javascript
python指定写入文件时的编码格式方法
2018/06/07 Python
python内存动态分配过程详解
2019/07/15 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
彼得罗夫美国官网:Peter Thomas Roth美国(青瓜面膜)
2017/11/05 全球购物
写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)
2014/09/05 面试题
秋天的图画教学反思
2014/05/01 职场文书
会计专业求职信
2014/08/10 职场文书
青涩记忆观后感
2015/06/18 职场文书
企业法人代表证明书
2015/06/18 职场文书
毕业赠语大全
2015/06/23 职场文书
本科毕业论文答辩稿
2015/06/23 职场文书
毕业酒会致辞
2015/07/29 职场文书
小学生大队委竞选稿
2015/11/20 职场文书
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
2022/04/09 MySQL