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实现小型站点广告管理(修正版)
Oct 09 PHP
PHP过滤★等特殊符号的正则
Jan 27 PHP
PHP基于数组实现的分页函数实例
Aug 20 PHP
PHP之sprintf函数用法详解
Nov 12 PHP
PHP动态柱状图实现方法
Mar 30 PHP
递归实现php数组转xml的代码分享
May 14 PHP
php实现SAE上使用storage上传与下载文件的方法
Jun 29 PHP
php给图片加文字水印
Jul 31 PHP
PHP实现GIF图片验证码
Nov 04 PHP
Yii框架上传图片用法总结
Mar 28 PHP
Yii2框架BootStrap样式的深入理解
Nov 07 PHP
PHP MVC框架中类的自动加载机制实例分析
Sep 18 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
颠覆常识!无色透明的咖啡诞生了(中日双语)
2021/03/03 咖啡文化
DedeCms模板安装/制作概述
2007/03/11 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
2013/01/29 PHP
PHP goto语句简介和使用实例
2014/03/11 PHP
浅析php单例模式
2014/11/25 PHP
laravel实现前后台路由分离的方法
2019/10/13 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
2020/05/29 PHP
Javascript计算时间差的函数分享
2011/07/04 Javascript
js中的cookie的读写操作示例详解
2014/04/17 Javascript
jQuery源码解读之removeAttr()方法分析
2015/02/20 Javascript
JS实现跟随鼠标的链接文字提示框效果
2015/08/06 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
JavaScript下拉菜单功能实例代码
2017/03/01 Javascript
js浏览器滚动条卷去的高度scrolltop(实例讲解)
2017/07/07 Javascript
JavaScript实现简单生成随机颜色的方法
2017/09/21 Javascript
在Vue methods中调用filters里的过滤器实例
2018/08/30 Javascript
javascript实现贪吃蛇经典游戏
2020/04/10 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
用Python制作在地图上模拟瘟疫扩散的Gif图
2015/03/31 Python
简单了解Python下用于监视文件系统的pyinotify包
2015/11/13 Python
python中with用法讲解
2020/02/07 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
python 制作本地应用搜索工具
2021/02/27 Python
日本无添加化妆品:HABA
2016/08/18 全球购物
JACK & JONES荷兰官网:男士服装和鞋子
2021/03/07 全球购物
店长职务说明书
2014/02/04 职场文书
《在山的那边》教学反思
2014/02/23 职场文书
多媒体编辑专业毕业生求职信
2014/06/13 职场文书
带刀到教室的检讨书
2014/10/04 职场文书
党员转正大会主持词
2015/07/02 职场文书
MySQL创建高性能索引的全步骤
2021/05/02 MySQL
redis 查看所有的key方式
2021/05/07 Redis
Python函数中的不定长参数相关知识总结
2021/06/24 Python
jQuery实现广告显示和隐藏动画
2021/07/04 jQuery
Win11怎么把合并的任务栏分开 Win11任务栏合并分开教程
2022/04/06 数码科技