PHP CLI模式下的多进程应用分析


Posted in PHP onJune 03, 2013

PHP在很多时候不适合做常驻的SHELL进程, 他没有专门的gc例程, 也没有有效的内存管理途径. 所以如果用PHP做常驻SHELL, 你会经常被内存耗尽导致abort而unhappy.

而且, 如果输入数据非法, 而脚本没有检测, 导致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: {$pid} exited with {$status}"; 
} 
} 
}

但有一点, 我一定要提醒:
Process Control should not be enabled within a webserver environment and unexpected results may happen if any Process Control functions are used within a webserver environment. --摘自PHP手也就是说, 打消你在PHP Web开发中使用多进程的念头吧!

原文:http://www.laruence.com/2009/06/11/930.html

PHP 相关文章推荐
PHP类与对象中的private访问控制的疑问
Nov 01 PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
Jun 03 PHP
PHP加密函数 Javascript/Js 解密函数
Sep 23 PHP
PHP页面中文乱码分析
Oct 29 PHP
php.ini save_handler 修改不生效的解决办法
Jul 22 PHP
PHP对象相互引用的内存溢出实例分析
Aug 28 PHP
PHP设计模式之委托模式定义与用法简单示例
Aug 13 PHP
PHP实现的策略模式示例
Mar 20 PHP
PHP实现一个限制实例化次数的类示例
Sep 16 PHP
laravel实现上传图片并在页面显示的例子
Oct 14 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
Oct 20 PHP
Laravel框架数据库迁移操作实例详解
Apr 06 PHP
基于php-fpm 参数的深入理解
Jun 03 #PHP
php-cli简介(不会Shell语言一样用Shell)
Jun 03 #PHP
基于在生产环境中使用php性能测试工具xhprof的详解
Jun 03 #PHP
php cli模式学习(PHP命令行模式)
Jun 03 #PHP
获取PHP警告错误信息的解决方法
Jun 03 #PHP
php cli 小技巧
Jun 03 #PHP
php中用加号与用array_merge合并数组的区别深入分析
Jun 03 #PHP
You might like
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/29 PHP
通过PHP CLI实现简单的数据库实时监控调度
2009/07/01 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
浅谈PHP5.6 与 PHP7.0 区别
2019/10/09 PHP
JS不间断向上滚动效果代码
2013/12/25 Javascript
Array 重排序方法和操作方法的简单实例
2014/01/24 Javascript
jQuery中:submit选择器用法实例
2015/01/03 Javascript
JS模仿手机端九宫格登录功能实现代码
2016/04/28 Javascript
KnockoutJS 3.X API 第四章之数据控制流foreach绑定
2016/10/10 Javascript
细说webpack源码之compile流程-rules参数处理技巧(2)
2017/12/26 Javascript
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
简单了解JavaScript中的执行上下文和堆栈
2019/06/24 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
2019/11/07 jQuery
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
javascript实现获取中文汉字拼音首字母
2020/05/19 Javascript
JS原型对象操作实例分析
2020/06/06 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
详细介绍Python中的偏函数
2015/04/27 Python
解决每次打开pycharm直接进入项目的问题
2018/10/28 Python
python变量命名的7条建议
2019/07/04 Python
Django 路由控制的实现
2019/07/17 Python
Python多线程正确用法实例解析
2020/05/30 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
python实现图片,视频人脸识别(opencv版)
2020/11/18 Python
汽车驾驶求职信
2013/10/25 职场文书
大学生如何写自荐信
2014/01/08 职场文书
优秀士兵先进事迹
2014/02/06 职场文书
工会主席岗位责任制
2014/02/11 职场文书
文明班集体申报材料
2014/05/23 职场文书
党员学习正风肃纪思想汇报
2014/09/12 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
旅游安全责任协议书
2016/03/22 职场文书
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python
uniapp 微信小程序 自定义tabBar 导航
2022/04/22 Javascript
mysql中关键词exists的用法实例详解
2022/06/10 MySQL