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 相关文章推荐
PHP4和PHP5共存于一系统
Nov 17 PHP
不错的一篇面向对象的PHP开发模式(简写版)
Mar 15 PHP
Gregarius中文日期格式问题解决办法
Apr 22 PHP
PHP 中文乱码解决办法总结分析
Jul 30 PHP
PHP新手入门学习方法
May 08 PHP
在wamp集成环境下升级php版本(实现方法)
Jul 01 PHP
CentOS6.5 编译安装lnmp环境
Dec 21 PHP
PHP中你应该知道的require()文件包含的正确用法
Jun 12 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
Jul 31 PHP
centos7上编译安装php7以php-fpm方式连接apache
Nov 08 PHP
Yii框架学习笔记之session与cookie简单操作示例
Apr 30 PHP
TP5框架请求响应参数实例分析
Oct 17 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插件 Simple HTML DOM 用DOM方式处理HTML
2013/07/01 PHP
YII使用url组件美化管理的方法
2015/12/28 PHP
php面向对象编程self和static的区别
2016/05/08 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
在laravel中使用Symfony的Crawler组件分析HTML
2017/06/19 PHP
JS辨别访问浏览器判断是android还是ios系统
2014/08/19 Javascript
js实现多张图片延迟加载效果
2017/07/17 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
2017/12/16 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
python中反射用法实例
2015/03/27 Python
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
Python 从一个文件中调用另一个文件的类方法
2019/01/10 Python
python数据类型可变不可变知识点总结
2020/03/06 Python
利用python在excel中画图的实现方法
2020/03/17 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
Python SMTP配置参数并发送邮件
2020/06/16 Python
H5最强接口之canvas实现动态图形功能
2019/05/31 HTML / CSS
html5自定义video标签的海报与播放按钮功能
2019/12/04 HTML / CSS
美国50岁以上单身人士约会平台:SilverSingles
2018/06/29 全球购物
STUBHUB日本:购买和出售全球活动门票
2018/07/01 全球购物
英国现代家具和照明购物网站:Heal’s
2019/10/30 全球购物
金山毒霸系列的笔试题
2013/04/13 面试题
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
linux下进程间通信的方式
2014/12/23 面试题
UNIX文件名称有什么规定
2013/03/25 面试题
经销商会议欢迎词
2014/01/11 职场文书
2014年勤工助学工作总结
2014/11/24 职场文书
英文感谢信范文
2015/01/21 职场文书
2015财务年终工作总结范文
2015/05/22 职场文书
文化大革命观后感
2015/06/17 职场文书
Java实现简易的分词器功能
2021/06/15 Java/Android
MongoDB数据库部署环境准备及使用介绍
2022/03/21 MongoDB