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 相关文章推荐
dedecms后台验证码总提示错误的解决方法
Mar 21 PHP
php实现网站插件机制的方法
Nov 10 PHP
php中防止恶意刷新页面的代码小结
Oct 31 PHP
PHP提示Notice: Undefined variable的解决办法
Nov 24 PHP
教大家制作简单的php日历
Nov 17 PHP
Zend Framework入门教程之Zend_View组件用法示例
Dec 09 PHP
thinkPHP多表查询及分页功能实现方法示例
Jul 03 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
Nov 16 PHP
postman的安装与使用方法(模拟Get和Post请求)
Aug 06 PHP
PHP使用OB缓存实现静态化功能示例
Mar 23 PHP
php实现断点续传大文件示例代码
Jun 19 PHP
php TP5框架生成二维码链接
Apr 01 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抓取https的内容的代码
2010/04/06 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
2015/07/02 PHP
Zend Framework教程之Loader以及PluginLoader用法详解
2016/03/09 PHP
全面了解PHP中的全局变量
2016/06/17 PHP
Laravel框架验证码类用法实例分析
2019/09/11 PHP
laravel validate 设置为中文的例子(验证提示为中文)
2019/09/29 PHP
番茄的表单验证类代码修改版
2008/07/18 Javascript
JS类的封装及实现代码
2009/12/02 Javascript
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList
2012/02/03 Javascript
jQuery EasyUI提交表单验证
2016/07/19 Javascript
JavaScript编码风格指南(中文版)
2016/08/26 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
2016/08/28 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
2017/01/15 Javascript
jquery pagination分页插件使用详解(后台struts2)
2017/01/22 Javascript
Vue.js结合bootstrap实现分页控件
2017/03/10 Javascript
jquery实现图片平滑滚动详解
2017/03/22 jQuery
Async Validator 异步验证使用说明
2017/07/03 Javascript
vue全屏事件开发详解
2020/06/17 Javascript
关于angular浏览器兼容性问题的解决方案
2020/07/26 Javascript
[01:02:46]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python脚本爬取字体文件的实现方法
2017/04/29 Python
彻彻底底地理解Python中的编码问题
2018/10/15 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
2019/09/03 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
CSS3 icon font完全指南(CSS3 font 会取代icon图标)
2013/01/06 HTML / CSS
CSS3控制HTML元素动画效果
2014/02/08 HTML / CSS
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
董事长职责范文
2013/11/08 职场文书
自我评价如何写好?
2014/01/05 职场文书
个人作风剖析材料
2014/02/02 职场文书
学生会离职感言
2014/02/11 职场文书
健康家庭事迹材料
2014/05/02 职场文书
师范大学生求职信
2014/06/13 职场文书
MySQL中几种插入和批量语句实例详解
2021/09/14 MySQL
5人制售《绝地求生》游戏外挂获利500多万元 被判刑
2022/03/31 其他游戏