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 类型转换函数intval
Jun 20 PHP
PHP中通过加号合并数组的一个简单方法分享
Jan 27 PHP
非常精妙的PHP递归调用与静态变量使用
Dec 16 PHP
php并发对MYSQL造成压力的解决方法
Feb 21 PHP
Yii操作数据库的3种方法
Mar 11 PHP
新浪SAE搭建PHP项目教程
Jan 28 PHP
PHP SESSION的增加、删除、修改、查看操作
Mar 20 PHP
MySql数据库查询结果用表格输出PHP代码示例
Mar 20 PHP
php实现的RSS生成类实例
Apr 23 PHP
PHP中each与list用法分析
Jan 08 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
May 28 PHP
Laravel框架路由设置与使用示例
Jun 12 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
使用数据库保存session的方法
2006/10/09 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
php简单截取字符串代码示例
2016/10/19 PHP
类似GMAIL的Ajax信息反馈显示
2010/02/16 Javascript
javascript textContent与innerText的异同分析
2010/10/22 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
如何使用JS获取IE上传文件路径(IE7,8)
2013/07/08 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
2015/03/02 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
详解JavaScript中的4种类型识别方法
2015/09/14 Javascript
JS作用域深度解析
2016/12/29 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
Vue如何获取数据列表展示
2019/12/11 Javascript
JavaScript实现捕获鼠标坐标
2020/04/12 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
python基础教程之基本内置数据类型介绍
2014/02/20 Python
Python实现各种排序算法的代码示例总结
2015/12/11 Python
基于python的七种经典排序算法(推荐)
2016/12/08 Python
python生成二维码的实例详解
2017/10/29 Python
Python使用pickle模块存储数据报错解决示例代码
2018/01/26 Python
python写一个md5解密器示例
2018/02/23 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
用Python解数独的方法示例
2019/10/24 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
2020/12/10 Python
Scrapy实现模拟登录的示例代码
2021/02/21 Python
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
iKRIX意大利网上商店:男女豪华服装和配件
2019/10/09 全球购物
如何实现一个自定义类的序列化
2012/05/22 面试题
linux面试题参考答案(7)
2012/10/29 面试题
民族团结先进个人材料
2014/02/05 职场文书
高考1977观后感
2015/06/04 职场文书
html实现弹窗的实例
2021/06/09 HTML / CSS
pyqt5蒙版遮罩mask,setmask的使用
2021/06/11 Python
关于SpringBoot 使用 Redis 分布式锁解决并发问题
2021/11/17 Redis