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 相关文章推荐
php代码优化及php相关问题总结
Oct 09 PHP
PHP中文分词的简单实现代码分享
Jul 17 PHP
一个PHP验证码类代码分享(已封装成类)
Jul 17 PHP
不使用php api函数实现数组的交换排序示例
Apr 13 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
May 20 PHP
round robin权重轮循算法php实现代码
May 28 PHP
PHP基于回溯算法解决n皇后问题的方法示例
Nov 07 PHP
PHP设计模式之适配器模式原理与用法分析
Apr 25 PHP
PHP 获取客户端 IP 地址的方法实例代码
Nov 11 PHP
Ajax+PHP实现的删除数据功能示例
Feb 12 PHP
浅析PHP7 的垃圾回收机制
Sep 06 PHP
php实现统计IP数及在线人数的示例代码
Jul 22 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
PHP+AJAX实现无刷新注册(带用户名实时检测)
2006/12/02 PHP
PHP编写RESTful接口的方法
2016/02/21 PHP
深入理解PHP中的count函数
2016/05/31 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
jquery预加载图片的方法
2015/05/27 Javascript
js实现正则匹配中文标点符号的方法
2015/12/23 Javascript
Angular的$http与$location
2016/12/26 Javascript
js实现股票实时刷新数据案例
2017/05/14 Javascript
vue一步步实现alert功能
2017/07/05 Javascript
Vue中的slot使用插槽分发内容的方法
2018/03/01 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
Vue.js实现数据响应的方法
2018/08/13 Javascript
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
微信小程序 checkbox使用实例解析
2019/09/09 Javascript
[01:00:25]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS Liquid
2018/03/31 DOTA
python 随机数生成的代码的详细分析
2011/05/15 Python
python操作xml文件示例
2014/04/07 Python
python字符串,数值计算
2016/10/05 Python
Python操作MongoDB详解及实例
2017/05/18 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
2017/12/14 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
2018/02/24 Python
Django学习笔记之ORM基础教程
2018/03/27 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
tensorflow实现简单逻辑回归
2018/09/07 Python
浅谈Python中的全局锁(GIL)问题
2019/01/11 Python
python 求1-100之间的奇数或者偶数之和的实例
2019/06/11 Python
python格式化输出保留2位小数的实现方法
2019/07/02 Python
python实现beta分布概率密度函数的方法
2019/07/08 Python
Python底层封装实现方法详解
2020/01/22 Python
Html5 FileReader实现即时上传图片功能实例代码
2014/09/01 HTML / CSS
全球摩托车装备领导者:RevZilla
2017/09/04 全球购物
德国足球商店:OUTFITTER
2019/05/06 全球购物
会展策划与管理专业大学生职业生涯规划
2014/02/07 职场文书
文秘自荐信
2014/06/28 职场文书
停水通知
2015/04/16 职场文书
Python进程间的通信之语法学习
2022/04/11 Python