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 随机数的产生、页面跳转、件读写、文件重命名、switch语句
Aug 07 PHP
php empty,isset,is_null判断比较(差异与异同)
Oct 19 PHP
PHP大批量数据操作时临时调整内存与执行时间的方法
Apr 20 PHP
PHP实现下载断点续传的方法
Nov 12 PHP
PHP+jQuery+Ajax实现用户登录与退出
Apr 27 PHP
CI(Codeigniter)的Setting增强配置类实例
Jan 06 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
Mar 18 PHP
PHP模块化安装教程
Jun 01 PHP
详解Yaf框架PHPUnit集成测试方法
Dec 27 PHP
Yii2框架redis基本应用示例
Jul 13 PHP
在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
Apr 09 PHP
PHP数组访问常用方法解析
Sep 05 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
《OVERLORD》手游英文版即将上线 手机上也能扮演骨王
2020/04/09 日漫
PHP中调用ASP.NET的WebService的代码
2011/04/22 PHP
PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析
2017/02/04 PHP
PHP 无限级分类
2017/05/04 PHP
Using the TextRange Object
2006/10/14 Javascript
区分JS中的undefined,null,&quot;&quot;,0和false
2007/03/08 Javascript
JS解析XML的实现代码
2009/11/12 Javascript
深入理解JavaScript系列(2) 揭秘命名函数表达式
2012/01/15 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
2014/06/24 Javascript
jQuery实现表格奇偶行显示不同背景色 就这么简单
2017/03/13 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
2017/04/13 Javascript
以BootStrap Tab为例写一个前端组件
2017/07/25 Javascript
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
小程序文字跑马灯效果
2018/12/28 Javascript
简单了解node npm cnpm的具体使用方法
2019/02/27 Javascript
Vue在 Nuxt.js 中重定向 404 页面的方法
2019/04/23 Javascript
小程序实现投票进度条
2019/11/20 Javascript
vue使用vant中的checkbox实现全选功能
2020/11/17 Vue.js
[46:55]完美世界DOTA2联赛决赛 FTD vs Phoenix 第三场 11.08
2020/11/11 DOTA
python实现随机密码字典生成器示例
2014/04/09 Python
Python数据结构之翻转链表
2017/02/25 Python
python八大排序算法速度实例对比
2017/12/06 Python
Python实现PS滤镜碎片特效功能示例
2018/01/24 Python
详解python中的json和字典dict
2018/06/22 Python
python的常用模块之collections模块详解
2018/12/06 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
优秀民警事迹材料
2014/01/29 职场文书
环保建议书600字
2014/05/14 职场文书
学校党的群众路线教育实践活动对照检查材料
2014/09/24 职场文书
2014年远程教育工作总结
2014/12/09 职场文书
社区文明倡议书
2015/04/28 职场文书
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
2021/06/21 Oracle
vue中 this.$set的使用详解
2021/11/17 Vue.js