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 相关文章推荐
pw的一个放后门的方法分析
Oct 08 PHP
PHP 页面跳转到另一个页面的多种方法方法总结
Jul 07 PHP
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
Feb 14 PHP
php实现将数组转换为XML的方法
Mar 09 PHP
腾讯CMEM的PHP扩展编译安装方法
Sep 25 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
Nov 04 PHP
yii2.0实现pathinfo的形式访问的配置方法
Apr 06 PHP
php封装的验证码类分享
Feb 26 PHP
PHP常见字符串操作函数与用法总结
Mar 04 PHP
Laravel向公共模板赋值方法总结
Jun 25 PHP
php创建类并调用的实例方法
Sep 25 PHP
php模拟post提交请求调用接口示例解析
Aug 07 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
获得Google PR值的PHP代码
2007/01/28 PHP
php xml文件操作实现代码(二)
2009/03/20 PHP
destoon出现验证码不显示时的紧急处理方法
2014/08/22 PHP
CodeIgniter记录错误日志的方法全面总结
2016/05/17 PHP
php使用curl代理实现抓取数据的方法
2017/02/03 PHP
PHP中模糊查询并关联三个select框
2017/06/19 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
js控制框架刷新
2008/08/01 Javascript
jQuery 事件队列调整方法
2009/09/18 Javascript
js阻止冒泡及jquery阻止事件冒泡示例介绍
2013/11/19 Javascript
浅谈js和css内联外联注意事项
2016/06/30 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
2016/07/22 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
canvas实现十二星座星空图
2017/02/14 Javascript
详解nodejs的express如何自动生成项目框架
2017/07/12 NodeJs
vue.js实现标签页切换效果
2018/06/07 Javascript
js实现input密码框显示/隐藏功能
2020/09/10 Javascript
laydate如何根据开始时间或者结束时间限制范围
2018/11/15 Javascript
微信小程序实现折线图的示例代码
2019/06/07 Javascript
通过js示例讲解时间复杂度与空间复杂度
2019/08/06 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
vue 解决setTimeOut和setInterval函数无效报错的问题
2020/07/30 Javascript
js加减乘除精确运算方法实例代码
2021/01/17 Javascript
[01:05:12]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS CIS-GAME
2014/05/21 DOTA
Python中使用bidict模块双向字典结构的奇技淫巧
2016/07/12 Python
python打开windows应用程序的实例
2019/06/28 Python
实列教程 一款基于jquery和css3的响应式二级导航菜单
2014/11/13 HTML / CSS
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
美国木工工具和用品商店:Woodcraft
2019/10/30 全球购物
反腐倡廉警示教育活动心得体会
2014/09/04 职场文书
求职自我评价范文
2015/03/09 职场文书
2015年党建工作汇报材料
2015/06/25 职场文书
高效课堂教学反思
2016/02/24 职场文书
使用SQL实现车流量的计算的示例代码
2022/02/28 SQL Server
TV动画《神废柴☆偶像》公布先导PV
2022/03/20 日漫
详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类
2022/04/08 Java/Android