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数组实现无限分类,不使用数据库,不使用递归.
Dec 09 PHP
检查url链接是否已经有参数的php代码 添加 ? 或 &amp;
Feb 09 PHP
Zend Guard使用指南及问题处理
Jan 07 PHP
php基于curl扩展制作跨平台的restfule 接口
May 11 PHP
日常整理PHP中简单的图形处理(经典)
Oct 26 PHP
Yii2 输出xml格式数据的方法
May 03 PHP
PHP文件下载实例代码浅析
Aug 17 PHP
php中通过eval实现字符串格式的计算公式
Mar 18 PHP
CI(CodeIgniter)框架实现图片上传的方法
Mar 24 PHP
thinkPHP通用控制器实现方法示例
Nov 23 PHP
购物车实现的几种方式优缺点对比
May 02 PHP
laravel 时间格式转时间戳的例子
Oct 11 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
第五节 克隆 [5]
2006/10/09 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
2013/10/25 PHP
PHP间隔一段时间执行代码的方法
2014/12/02 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
2016/04/02 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
PHP simplexml_load_file()函数讲解
2019/02/03 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
PHP goto语句用法实例
2019/08/06 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
2019/10/21 PHP
Javascript 变量作用域 两个可能会被忽略的小特性
2010/03/23 Javascript
JS清除IE浏览器缓存的方法
2013/07/26 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
D3.js实现柱状图的方法详解
2016/09/21 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
2016/10/11 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
Vue.js系列之项目搭建(1)
2017/01/03 Javascript
详解如何将 Vue-cli 改造成支持多页面的 history 模式
2017/11/20 Javascript
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
2019/05/28 Javascript
JS数据类型STRING使用实例解析
2019/12/18 Javascript
JS访问对象两种方式区别解析
2020/08/29 Javascript
[54:51]Ti4 冒泡赛第二轮LGD vs C9 3
2014/07/14 DOTA
pandas 选择某几列的方法
2018/07/03 Python
python3的输入方式及多组输入方法
2018/10/17 Python
Django 查询数据库并返回页面的例子
2019/08/12 Python
pytorch中的上采样以及各种反操作,求逆操作详解
2020/01/03 Python
python实现logistic分类算法代码
2020/02/28 Python
python实现梯度下降法
2020/03/24 Python
python plt可视化——打印特殊符号和制作图例代码
2020/04/17 Python
CSS3 渐变(Gradients)之CSS3 线性渐变
2016/07/08 HTML / CSS
TUMI马来西亚官方网站:国际领先的高品质商旅箱包品牌
2018/04/26 全球购物
2014年社区植树节活动方案
2014/02/28 职场文书
企业文化理念标语
2014/06/10 职场文书
计划生育标语
2014/06/23 职场文书
中学生旷课检讨书500字
2014/10/29 职场文书
swagger如何返回map字段注释
2021/07/03 Java/Android