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 归并排序 数组交集
May 10 PHP
介绍一些PHP判断变量的函数
Apr 24 PHP
codeigniter使用技巧批量插入数据实例方法分享
Dec 31 PHP
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
Jan 30 PHP
php打印一个边长为N的实心和空心菱型的方法
Mar 02 PHP
php实现的用户查询类实例
Jun 18 PHP
PHP响应post请求上传文件的方法
Dec 17 PHP
PHP加密解密类实例代码
Jul 20 PHP
自写的利用PDO对mysql数据库增删改查操作类
Feb 19 PHP
PHP接入微信H5支付的方法示例
Oct 28 PHP
PHP code 验证码生成类定义和简单使用示例
May 27 PHP
如何用Laravel包含你自己的帮助函数
May 27 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
destoon二次开发入门示例
2014/06/20 PHP
ThinkPHP后台首页index使用frameset时的注意事项分析
2014/08/22 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
2017/08/30 PHP
ThinkPHP5 的简单搭建和使用详解
2018/11/15 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
JavaScript 节点操作 以及DOMDocument属性和方法
2007/12/06 Javascript
JQuery加载图片自适应固定大小的DIV
2013/09/12 Javascript
js实现编辑div节点名称的方法
2014/12/17 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
JavaScript学习笔记之Cookie对象
2015/01/22 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
jQuery选择器用法实例详解
2015/12/17 Javascript
JavaScript关于提高网站性能的几点建议(一)
2016/07/24 Javascript
利用JS轻松实现获取表单数据
2016/12/06 Javascript
Bootstrap禁用响应式布局的实现方法
2017/03/09 Javascript
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
nodejs socket实现的服务端和客户端功能示例
2017/06/02 NodeJs
vue 项目如何引入微信sdk接口的方法
2017/12/18 Javascript
5分钟快速掌握JS中var、let和const的异同
2018/09/19 Javascript
JS使用对象的defineProperty进行变量监控操作示例
2019/02/02 Javascript
微信小程序批量监听输入框对按钮样式进行控制的实现代码
2019/10/12 Javascript
微信小程序页面渲染实现方法
2019/11/06 Javascript
JavaScript闭包原理与用法学习笔记
2020/05/29 Javascript
Python对象的深拷贝和浅拷贝详解
2014/08/25 Python
python实现忽略大小写对字符串列表排序的方法
2014/09/25 Python
Python的time模块中的常用方法整理
2015/06/18 Python
python中的set实现不重复的排序原理
2018/01/24 Python
CentOS7下python3.7.0安装教程
2018/07/30 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
Python将视频或者动态图gif逐帧保存为图片的方法
2019/09/10 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
Kathmandu英国网站:新西兰户外运动品牌
2017/03/27 全球购物
How to spawning asynchronous work in J2EE
2016/08/29 面试题
公司节能减排方案
2014/05/16 职场文书
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电
MySQL常用慢查询分析工具详解
2022/08/14 MySQL