PHP 多进程 解决难题


Posted in PHP onJune 22, 2009

而且, 如果输入数据非法, 而脚本没有检测, 导致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: {$return['pid']} exited with {$status}"; 
} 
} 
}
PHP 相关文章推荐
截获网站title标签之家内容的例子
Oct 09 PHP
PHP中MD5函数使用实例代码
Jun 07 PHP
php self,$this,const,static,-&amp;gt;的使用
Oct 22 PHP
php下使用SimpleXML 处理XML 文件
Feb 27 PHP
PHP MemCached高级缓存配置图文教程
Aug 05 PHP
使用XDebug调试及单元测试覆盖率分析
Jan 27 PHP
PHP高级对象构建 工厂模式的使用
Feb 05 PHP
mysql 查询指定日期时间内sql语句实现原理与代码
Dec 16 PHP
php+mysql数据库实现无限分类的方法
Dec 12 PHP
php实现的简单数据库操作Model类
Nov 16 PHP
php pdo操作数据库示例
Mar 10 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
Apr 18 PHP
PHP 高级课程笔记 面向对象
Jun 21 #PHP
mysql 性能的检查和优化方法
Jun 21 #PHP
php fckeditor 调用的函数
Jun 21 #PHP
学习discuz php 引入文件的方法DISCUZ_ROOT
Jun 21 #PHP
php 分页函数multi() discuz
Jun 21 #PHP
一个php Mysql类 可以参考学习熟悉下
Jun 21 #PHP
discuz7 phpMysql操作类
Jun 21 #PHP
You might like
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
PHP 伪静态隐藏传递参数名的四种方法
2010/02/22 PHP
学习php设计模式 php实现装饰器模式(decorator)
2015/12/07 PHP
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
用javascript getComputedStyle获取和设置style的原理
2008/10/10 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
js关闭父窗口时关闭子窗口
2013/04/01 Javascript
jquery click([data],fn)使用方法实例介绍
2013/07/08 Javascript
Javascript学习笔记之 函数篇(三) : 闭包和引用
2014/11/23 Javascript
jQuery在ul中显示某个li索引号的方法
2015/03/17 Javascript
AngularJs解决跨域问题案例详解(简单方法)
2016/05/19 Javascript
JS留言功能的简单实现案例(推荐)
2016/06/23 Javascript
jquery实时获取时间的简单实例
2017/01/26 Javascript
微信小程序 首页制作简单实例
2017/04/07 Javascript
使用Node.js实现RESTful API的示例
2017/08/01 Javascript
详解React开发必不可少的eslint配置
2018/02/05 Javascript
JavaScript实现与使用发布/订阅模式详解
2019/01/19 Javascript
详解Node.js一行命令上传本地文件到服务器
2019/04/22 Javascript
nodejs实现百度舆情接口应用示例
2020/02/07 NodeJs
Java分治归并排序算法实例详解
2017/12/12 Python
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
2018/06/11 Python
python读取文本绘制动态速度曲线
2018/06/21 Python
浅述python中深浅拷贝原理
2018/09/18 Python
详解Python requests 超时和重试的方法
2018/12/18 Python
python实现两张图片的像素融合
2019/02/23 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
2021/01/12 Python
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
Clearly澳大利亚:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
What is view? why do we have view?
2012/06/22 面试题
自荐信的五个重要部分
2013/10/29 职场文书
元旦促销方案
2014/03/15 职场文书
党员公开承诺书2015
2015/01/21 职场文书
稽核岗位职责
2015/02/10 职场文书
2015羊年春节慰问信
2015/02/14 职场文书
css样式important规则的正确使用方式
2022/06/10 HTML / CSS