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.ini中文版(1)
Oct 09 PHP
PHP编实现程动态图像的创建代码
Sep 28 PHP
PHP 日志缩略名的创建函数代码
May 26 PHP
基于simple_html_dom的使用小结
Jul 01 PHP
网页上facebook分享功能具体实现
Jan 26 PHP
使用php批量删除数据库下所有前缀为prefix_的表
Jun 09 PHP
PHP中使用sleep函数实现定时任务实例分享
Aug 21 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
Jan 07 PHP
PHP内存缓存功能memcached示例
Oct 19 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
May 05 PHP
PHP自动识别当前使用移动终端
May 21 PHP
基于PHP实现堆排序原理及实例详解
Jun 19 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脚本的10个技巧(7)
2006/10/09 PHP
php curl模拟post提交数据示例
2013/12/31 PHP
浅析PHP7的多进程及实例源码
2019/04/14 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
php的lavarel框架中join和orWhere的用法
2020/12/28 PHP
javaScript对象和属性的创建方法
2007/01/15 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
js中时间格式化的几种方法
2018/07/22 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
vue实现添加与删除图书功能
2018/10/07 Javascript
JavaScript Window浏览器对象模型原理解析
2020/05/30 Javascript
python多线程扫描端口示例
2014/01/16 Python
Python subprocess模块学习总结
2014/03/13 Python
python针对excel的操作技巧
2018/03/13 Python
Python遍历numpy数组的实例
2018/04/04 Python
pandas DataFrame数据转为list的方法
2018/04/11 Python
Python 爬取携程所有机票的实例代码
2018/06/11 Python
python 实现A*算法的示例代码
2018/08/13 Python
一看就懂得Python的math模块
2018/10/21 Python
使用python的pexpect模块,实现远程免密登录的示例
2019/02/14 Python
python 实现快速生成连续、随机字母列表
2019/11/28 Python
django框架ModelForm组件用法详解
2019/12/11 Python
Python对wav文件的重采样实例
2020/02/25 Python
使用Python实现批量ping操作方法
2020/05/06 Python
CSS3+HTML5+JS 实现一个块的收缩与展开动画效果
2020/11/17 HTML / CSS
全球性的女装店:storets
2019/06/12 全球购物
我的理想演讲稿
2014/04/30 职场文书
2014年文秘工作总结
2014/11/25 职场文书
庆祝教师节新闻稿
2015/07/17 职场文书
2015年小学实验室工作总结
2015/07/28 职场文书
MySQL系列之十五 MySQL常用配置和性能压力测试
2021/07/02 MySQL
Winsows11性能如何? win11性能测评多核竟比Win10差了10%
2021/11/21 数码科技
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers
redis调用二维码时的不断刷新排查分析
2022/04/01 Redis
为什么MySQL8新特性会修改自增主键属性
2022/04/18 MySQL