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 相关文章推荐
利用文件属性结合Session实现在线人数统计
Oct 09 PHP
PHP 开发工具
Dec 06 PHP
新手配置 PHP 调试环境(IIS+PHP+MYSQL)
Jan 10 PHP
查找mysql字段中固定字符串并替换的几个方法
Sep 23 PHP
如何用php获取文件名后缀
Jun 09 PHP
php实现图片局部打马赛克的方法
Feb 11 PHP
php 解决substr()截取中文字符乱码问题
Jul 18 PHP
PHP转换文本框内容为HTML格式的方法
Jul 20 PHP
AES加解密在php接口请求过程中的应用示例
Oct 26 PHP
php数据序列化测试实例详解
Aug 12 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
Laravel事件监听器用法实例分析
Mar 12 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获取url字符串截取路径的文件名和扩展名的函数
2010/01/22 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
2014/09/16 PHP
PHP的伪随机数与真随机数详解
2015/05/27 PHP
PHP基于单例模式实现的数据库操作基类
2016/01/15 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
2016/10/25 PHP
PHP异步进程助手async-helper
2018/02/05 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
jQuery 1.5 源码解读 面向中高阶JSER
2011/04/05 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
关闭浏览器时提示onbeforeunload事件
2013/12/25 Javascript
jQuery 回车事件enter使用示例
2014/02/18 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
解析JavaScript数组方法reduce
2016/12/12 Javascript
详解用webpack2.0构建vue2.0超详细精简版
2017/04/05 Javascript
JS点击缩略图整屏居中放大图片效果
2017/07/04 Javascript
nodejs实现爬取网站图片功能
2017/12/14 NodeJs
Vue框架之goods组件开发详解
2018/01/25 Javascript
vue-cli或vue项目利用HBuilder打包成移动端app操作
2020/07/29 Javascript
[01:01]青春无憾,一战成名——DOTA2全国高校联赛开启
2018/02/25 DOTA
基于Django统计博客文章阅读量
2019/10/29 Python
Python-openCV读RGB通道图实例
2020/01/17 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
PyQt使用QPropertyAnimation开发简单动画
2020/04/02 Python
Jmeter调用Python脚本实现参数互相传递的实现
2021/01/22 Python
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
运动会入场式解说词
2014/02/18 职场文书
高一学生评语大全
2014/04/25 职场文书
优秀中职教师事迹材料
2014/08/26 职场文书
资料员岗位职责范本
2015/04/13 职场文书
庆七一活动简报
2015/07/20 职场文书
mysql 8.0.24 安装配置方法图文教程
2021/05/12 MySQL
Python 中random 库的详细使用
2021/06/03 Python
Vue全局事件总线你了解吗
2022/02/24 Vue.js
使用Mysql计算地址的经纬度距离和实时位置信息
2022/04/29 MySQL