PHPCLI模式下的多进程应用分析
2023-06-13 09:15:00 时间
PHP在很多时候不适合做常驻的SHELL进程,他没有专门的gc例程,也没有有效的内存管理途径.所以如果用PHP做常驻SHELL,你会经常被内存耗尽导致abort而unhappy.
而且,如果输入数据非法,而脚本没有检测,导致abort,也会让你很不开心.
那?怎么办呢?
多进程….
为什么呢?
优点:
1.使用多进程,子进程结束以后,内核会负责回收资源
2.使用多进程,子进程异常退出不会导致整个进程Thread退出.父进程还有机会重建流程.
3.一个常驻主进程,只负责任务分发,逻辑更清楚
Then,怎么做呢?
接下来,我们使用PHP提供的POSIX和Pcntl系列函数,来实现一个PHP命令解析器,主进程负责接受用户输入,然后fork子进程执行,并负责回显子进程的结束状态.
代码如下,我加了注释,如果有不懂的地方,可以翻阅手册相关函数,或者回复留言.
#!/bin/envphp
<?php
/**Aexampledenotedmuti-processapplicationinphp
*@filenamefork.php
*@touchdateWed10Jun200910:25:51PMCST
*@authorLaruence<laruence@baidu.com>
*@licensehttp://www.zend.com/license/3_0.txtPHPLicense3.0
*@version1.0.0
*/
/**确保这个函数只能运行在SHELL中*/
if(substr(php_sapi_name(),0,3)!=="cli"){
die("ThisProgramecanonlyberuninCLImode");
}
/**关闭最大执行时间限制,在CLI模式下,这个语句其实不必要*/
set_time_limit(0);
$pid=posix_getpid();//取得主进程ID
$user=posix_getlogin();//取得用户名
echo<<<EOD
USAGE:[command|expression]
inputphpcodetoexecutebyforkanewprocess
inputquittoexit
ShellExecutorversion1.0.0bylaruence
EOD;
while(true){
$prompt="\n{$user}$";
$input=readline($prompt);
readline_add_history($input);
if($input=="quit"){
break;
}
process_execute($input.";");
}
exit(0);
functionprocess_execute($input){
$pid=pcntl_fork();//创建子进程
if($pid==0){//子进程
$pid=posix_getpid();
echo"*Process{$pid}wascreated,andExecuted:\n\n";
eval($input);//解析命令
exit;
}else{//主进程
$pid=pcntl_wait($status,WUNTRACED);//取得子进程结束状态
if(pcntl_wifexited($status)){
echo"\n\n*Subprocess:{$pid}exitedwith{$status}";
}
}
}
但有一点,我一定要提醒:
ProcessControlshouldnotbeenabledwithinawebserverenvironmentandunexpectedresultsmayhappenifanyProcessControlfunctionsareusedwithinawebserverenvironment.--摘自PHP手也就是说,打消你在PHPWeb开发中使用多进程的念头吧!
原文:http://www.laruence.com/2009/06/11/930.html
相关文章
- 树莓派4b 镜像_用树莓派4b构建深度学习应用(一)硬件篇「建议收藏」
- 【干货书】工业自动化与机器人技术与应用
- 系统应用进程查看命令一览表
- 干货!运营商5G专网应用十大经典案例分享
- Kiosc for mac(远程控制应用)中文激活版
- 谈谈域渗透中常见的可滥用权限及其应用场景(一)
- 【Android 高性能音频】OboeTest 音频性能测试应用 ( 应用简介 | 测试内容 | 输出测试 | Oboe 缓冲区 与 工作负载修改 | 测试案例 )
- 【Android 进程保活】应用进程拉活 ( 账户同步拉活 | 账号添加 | 源码资源 )
- 【Android 进程保活】应用进程拉活 ( 双进程守护保活 )
- 【Android 逆向】Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | 使用 Makefile 构建 Android 平台 NDK 应用 )
- Linux高级应用:提升效能,提升技能(linux高级应用)
- Signal:安全、开源的聊天应用
- Linux进程如何利用共享内存优化应用性能(linux进程共享内存)
- 提升经营效率:Oracle ERP系统的应用(oracleerp系统)
- MySQL中与符号的应用解析(mysql中@ 与@@)
- c语言与MySQL结合实现简单1243应用(c mysql 1243)
- 构建实时应用 Redis中的模拟数据流(模拟数据流redis)
- Oracle中并与交集的应用(oracle中的并交集)
- Redis锁解决多进程协作问题的实际应用(redis锁实际应用场景)
- Oracle REC 变量的应用研究(oracle rec变量)
- 区块链项目死亡率高达92%!这里有一份最靠谱的应用搭建指南