PHP在很多时候不适合做常驻的SHELL进程, 他没有专门的gc例程, 也没有有效的内存管理途径. 所以如果用PHP做常驻SHELL,
你会经常被内存耗尽导致abort而unhappy.
而且, 如果输入数据非法, 而脚本没有检测, 导致abort, 也会让你很不开心.
那? 怎么办呢?
多进程….
为什么呢?
- 优点:
- 1. 使用多进程, 子进程结束以后, 内核会负责回收资源
- 2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程.
- 3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚
Then, 怎么做呢?
接下来, 我们使用PHP提供的POSIX和Pcntl系列函数, 来实现一个PHP命令解析器, 主进程负责接受用户输入, 然后fork子进程执行,
并负责回显子进程的结束状态.
代码如下, 我加了注释, 如果有不懂的地方, 可以翻阅手册相关函数, 或者回复留言.
- <?php
-
@filename
-
@touch
-
@author<laruence@baidu.com>
-
@licensehttp://www.zend.com/license/3_0.txt
-
@version
-
if (substr(php_sapi_name(), 0, 3) !== 'cli') {
-
die("This Programe can only be run in CLI mode");
- }
-
set_time_limit(0);
-
$pid = posix_getpid();
-
$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}";
-
}
-
}
- }
-
但有一点, 我一定要提醒:
- 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开发中使用多进程的念头吧!
分享到:
相关推荐
PHP在很多时候不适合做常驻的SHELL进程, 他没有专门的gc例程, 也没有有效的内存管理途径. 所以如果用PHP做常驻SHELL, 你会经常被内存耗尽导致abort而unhappy
PHP在cli模式下接收参数有两种方法 1.使用argv数组 2.使用getopt方法 1.使用argv数组 例如:需要执行一个php,并传递三个参数(type=news, is_hot=1, limit=5) 创建test.php <?php print_r($argv); ?> 在...
php_cli模式简介 php-cli是php Command ...——注:windows和linux下都支持php_cli模式 PHP-cli应用场景: 1.多线程应用 这方面的好处,引用鸟哥的话: 优点: 1. 使用多进程, 子进程结束以后, 内核会负责回收资源 2.
主要介绍了PHP Cli 模式设置进程名称的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
vue+vuecli+webapck实现多页面应用,集成router路由及vux插件。
php的cli模式-圣诞树源码
使用vue脚手架vue-cli配置多页面应用
vue-cli3 多页应用 demo
This compact, concise book shows you how to create PHP Command Line Interface (CLI) scripts, including SAPI and more. Learn to quickly create useful and effective Command Line software and scripts ...
PHP multiprocess manager for cli, 可轻松让普通PHP脚本变守护进程和多进程执行
#资源达人分享计划#
主要介绍了CodeIgniter CLI模式,需要的朋友可以参考下
Python CLI应用程序模板 这是一个模板,用于生成Python命令行界面(CLI)应用程序。特征运行测试以方便构建CLI应用程序(分析和处理命令,参数,选项等) CI的yml文件开源许可证的不同选择用法安装要求pip install -...
oi-有 CLI 界面的,可长期运行的应用进程编辑框架
我们都知道PHP是单进程执行的,PHP处理多并发主要是依赖服务器或PHP-FPM的多进程及它们进程的复用,但PHP实现多进程也意义重大,尤其是在后台Cli模式下处理大量数据或运行后台DEMON守护进程时,多进程的优势不用多说...
mow.cli - 构建CLI应用程序的通用的Go库复杂的flag和参数解析与验证
本文给大家解决的是在php的cli模式下做任务计划的php脚本总是执行不成功,报“require 加载路径错误”,后来经过一番研究,才找到问题所在,这里分享给大家。