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 相关文章推荐
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
Jul 09 PHP
用PHP生成静态HTML速度快类库
Mar 18 PHP
PHP的分页功能
Mar 21 PHP
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
Dec 05 PHP
PHP 中关于ord($str)&amp;gt;0x80的详细说明
Sep 23 PHP
基于php权限分配的实现代码
Apr 28 PHP
php注册登录系统简化版
Dec 28 PHP
Laravel SQL语句记录方式(推荐)
May 26 PHP
PHP7标量类型declare用法实例分析
Sep 26 PHP
Yii框架用户登录session丢失问题解决方法
Jan 07 PHP
一个非常实用的php文件上传类
Jul 04 PHP
PHP parse_ini_file函数的应用与扩展操作示例
Jan 07 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
77A一级收信机修理记
2021/03/02 无线电
一个PHP的QRcode类与大家分享
2011/11/13 PHP
php统计时间和内存使用情况示例分享
2014/03/13 PHP
php+ajax实现的点击浏览量加1
2015/04/16 PHP
phpcms手机内容页面添加上一篇和下一篇
2015/06/05 PHP
js自定义事件及事件交互原理概述(二)
2013/02/01 Javascript
js相册效果代码(点击创建即可)
2013/04/16 Javascript
jquery 漂亮的删除确认和提交无刷新删除示例
2013/11/13 Javascript
深入学习JavaScript中的Rest参数和参数默认值
2015/07/28 Javascript
javascript基于prototype实现类似OOP继承的方法
2015/12/16 Javascript
多种js图片预加载实现方式分享
2016/02/19 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
Adapter适配器模式在JavaScript设计模式编程中的运用分析
2016/05/18 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
2016/05/26 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
浅谈AngularJS中ng-class的使用方法
2016/11/11 Javascript
React创建组件的三种方式及其区别
2017/01/12 Javascript
Canvas实现放射线动画效果
2017/02/15 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
详解Vue打包优化之code spliting
2018/04/09 Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
2019/09/03 Javascript
python 获取本机ip地址的两个方法
2013/02/25 Python
探寻python多线程ctrl+c退出问题解决方案
2014/10/23 Python
Python txt文件常用读写操作代码实例
2020/08/03 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
python3中布局背景颜色代码分析
2020/12/01 Python
HTML5 video 视频标签使用介绍
2014/02/03 HTML / CSS
标签和贴纸印刷:Lightning Labels
2018/03/22 全球购物
法国在线购买汽车轮胎网站:123pneus.fr
2019/02/25 全球购物
给老婆的搞笑检讨书
2014/01/12 职场文书
岗位职责风险防控
2014/02/18 职场文书
干部个人对照检查材料
2014/08/25 职场文书
群众路线教育实践活动思想汇报(2014特荐篇)
2014/09/16 职场文书
陈斌强事迹观后感
2015/06/17 职场文书
2016年春季运动会加油稿
2015/07/22 职场文书
装修公司管理制度
2015/08/05 职场文书