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 相关文章推荐
PHP5与MySQL数据库操作常用代码 收集
Mar 21 PHP
php写的简易聊天室代码
Jun 04 PHP
PHP 第一节 php简介
Apr 28 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
Jun 12 PHP
PHP中设置一个严格30分钟过期Session面试题的4种答案
Jul 30 PHP
php创建无限级树型菜单
Nov 05 PHP
PHP实现冒泡排序的简单实例
May 26 PHP
thinkPHP5.0框架环境变量配置方法
Mar 17 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
Apr 09 PHP
laravel 5.3中自定义加密服务的方案详解
May 09 PHP
thinkPHP框架整合tcpdf插件操作示例
Aug 07 PHP
PHP删除字符串中非字母数字字符方法总结
Jan 20 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
星际RPG字典
2020/03/04 星际争霸
php中curl和file_get_content的区别
2014/05/10 PHP
php使用GD库创建图片缩略图的方法
2015/06/10 PHP
PHP使用http_build_query()构造URL字符串的方法
2016/04/02 PHP
php实现的http请求封装示例
2016/11/08 PHP
Laravel如何友好的修改.env配置文件详解
2017/06/07 PHP
修改发贴的编辑功能
2007/03/07 Javascript
jquery提交form表单简单示例分享
2014/03/03 Javascript
jQuery 取值、赋值的基本方法整理
2014/03/31 Javascript
angularjs中的e2e测试实例
2014/12/06 Javascript
jQuery对JSON数据进行排序输出的方法
2015/06/24 Javascript
jQuery实现表单步骤流程导航代码分享
2015/08/28 Javascript
JavaScript数据类型转换的注意事项
2016/07/31 Javascript
bootstarp modal框居中显示的实现代码
2017/02/18 Javascript
基于vue实现多引擎搜索及关键字提示
2017/03/16 Javascript
vue 和vue-touch 实现移动端左右导航效果(仿京东移动站导航)
2017/04/22 Javascript
JavaScript学习笔记之惰性函数示例详解
2017/08/27 Javascript
基于js中style.width与offsetWidth的区别(详解)
2017/11/12 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
2018/08/09 jQuery
python 字符串格式化代码
2013/03/17 Python
Python标准库os.path包、glob包使用实例
2014/11/25 Python
PyTorch上实现卷积神经网络CNN的方法
2018/04/28 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
解决Python3 抓取微信账单信息问题
2019/07/19 Python
python创建子类的方法分析
2019/11/28 Python
python matlab库简单用法讲解
2020/12/31 Python
美国半成品食材配送服务商:Home Chef
2018/01/25 全球购物
Doyoueven官网:澳大利亚健身服饰和配饰品牌
2019/03/24 全球购物
大学毕业生通用求职信
2013/09/28 职场文书
财务会计专业个人求职信范本
2014/01/08 职场文书
巧克力蛋糕店创业计划书
2014/01/14 职场文书
村委会主任先进事迹
2014/01/15 职场文书
工厂见习报告范文
2014/10/31 职场文书
党员评议自我评价
2015/03/03 职场文书
2016年会开场白台词
2015/06/01 职场文书
MySQL时区造成时差问题
2022/04/13 MySQL