PHP CLI模式下的多进程应用
2015-08-24 17:14
751 查看
· 作者: Laruence( )
· 本文地址: http://www.laruence.com/2009/06/11/930.html
· 转载请注明出处
PHP在很多时候不适合做常驻的SHELL进程,
他没有专门的gc例程,
也没有有效的内存管理途径.所以如果用PHP做常驻SHELL,你会经常被内存耗尽导致abort而unhappy.
而且,
如果输入数据非法,
而脚本没有检测, 导致abort,
也会让你很不开心.
那?
怎么办呢?
多进程….
为什么呢?
1. 优点:
2. 1.
使用多进程,
子进程结束以后, 内核会负责回收资源
3. 2.
使用多进程,子进程异常退出不会导致整个进程Thread退出.
父进程还有机会重建流程.
4. 3.
一个常驻主进程,
只负责任务分发, 逻辑更清楚.
Then, 怎么做呢?
接下来,
我们使用PHP提供的POSIX和Pcntl系列函数,
来实现一个PHP命令解析器,
主进程负责接受用户输入,
然后fork子进程执行,
并负责回显子进程的结束状态.
代码如下,
我加了注释,
如果有不懂的地方, 可以翻阅手册相关函数,
或者回复留言.
1. #!/bin/env php
2. <?php
3. /** A example denoted muti-process application in php
4. *
@filename fork.php
5. *
@touch date Wed 10 Jun 2009 10:25:51 PM CST
6. *
@author Laruence<laruence@baidu.com>
7. *
@licensehttp://www.zend.com/license/3_0.txt PHPLicense
3.0
8. *
@version 1.0.0
9. */
10.
11. /**
确保这个函数只能运行在SHELL中 */
12. if (substr(php_sapi_name(),0,3)
!== 'cli') {
13. die("This Programe can only be
run in CLI mode");
14. }
15.
16. /**
关闭最大执行时间限制,
在CLI模式下,
这个语句其实不必要 */
17. set_time_limit(0);
18.
19. $pid =
posix_getpid();//取得主进程ID
20. $user =
posix_getlogin();//取得用户名
21.
22. echo <<<EOD
23. USAGE: [command | expression]
24. input php code to execute by fork a
new process
25. input quit to
exit
26.
27. ShellExecutor version
1.0.0 by laruence
28. EOD;
29.
30. while (true) {
31.
32. $prompt =
"\n{$user}$ ";
33. $input =
readline($prompt);
34.
35. readline_add_history($input);
36. if ($input
== 'quit') {
37. break;
38. }
39. process_execute($input
. ';');
40. }
41.
42. exit(0);
43.
44. functionprocess_execute($input)
{
45. $pid =
pcntl_fork();//创建子进程
46. if ($pid
== 0) {//子进程
47. $pid =
posix_getpid();
48. echo"* Process {$pid} was created, andExecuted:\n\n";
49. eval($input);//解析命令
50. exit;
51. }
else {//主进程
52. $pid =
pcntl_wait($status, WUNTRACED);
//取得子进程结束状态
53. if (pcntl_wifexited($status))
{
54. echo"\n\n* Sub process: {$pid} exited with{$status}";
55. }
56. }
57. }
58.
但有一点,
我一定要提醒:
1. Process Control should not be enabled within a webserverenvironment and unexpected results may happen if any Process Control functionsare
used within a webserver environment. --摘自PHP手册
也就是说,
打消你在PHP Web开发中使用多进程的念头吧!
· 本文地址: http://www.laruence.com/2009/06/11/930.html
· 转载请注明出处
PHP在很多时候不适合做常驻的SHELL进程,
他没有专门的gc例程,
也没有有效的内存管理途径.所以如果用PHP做常驻SHELL,你会经常被内存耗尽导致abort而unhappy.
而且,
如果输入数据非法,
而脚本没有检测, 导致abort,
也会让你很不开心.
那?
怎么办呢?
多进程….
为什么呢?
1. 优点:
2. 1.
使用多进程,
子进程结束以后, 内核会负责回收资源
3. 2.
使用多进程,子进程异常退出不会导致整个进程Thread退出.
父进程还有机会重建流程.
4. 3.
一个常驻主进程,
只负责任务分发, 逻辑更清楚.
Then, 怎么做呢?
接下来,
我们使用PHP提供的POSIX和Pcntl系列函数,
来实现一个PHP命令解析器,
主进程负责接受用户输入,
然后fork子进程执行,
并负责回显子进程的结束状态.
代码如下,
我加了注释,
如果有不懂的地方, 可以翻阅手册相关函数,
或者回复留言.
1. #!/bin/env php
2. <?php
3. /** A example denoted muti-process application in php
4. *
@filename fork.php
5. *
@touch date Wed 10 Jun 2009 10:25:51 PM CST
6. *
@author Laruence<laruence@baidu.com>
7. *
@licensehttp://www.zend.com/license/3_0.txt PHPLicense
3.0
8. *
@version 1.0.0
9. */
10.
11. /**
确保这个函数只能运行在SHELL中 */
12. if (substr(php_sapi_name(),0,3)
!== 'cli') {
13. die("This Programe can only be
run in CLI mode");
14. }
15.
16. /**
关闭最大执行时间限制,
在CLI模式下,
这个语句其实不必要 */
17. set_time_limit(0);
18.
19. $pid =
posix_getpid();//取得主进程ID
20. $user =
posix_getlogin();//取得用户名
21.
22. echo <<<EOD
23. USAGE: [command | expression]
24. input php code to execute by fork a
new process
25. input quit to
exit
26.
27. ShellExecutor version
1.0.0 by laruence
28. EOD;
29.
30. while (true) {
31.
32. $prompt =
"\n{$user}$ ";
33. $input =
readline($prompt);
34.
35. readline_add_history($input);
36. if ($input
== 'quit') {
37. break;
38. }
39. process_execute($input
. ';');
40. }
41.
42. exit(0);
43.
44. functionprocess_execute($input)
{
45. $pid =
pcntl_fork();//创建子进程
46. if ($pid
== 0) {//子进程
47. $pid =
posix_getpid();
48. echo"* Process {$pid} was created, andExecuted:\n\n";
49. eval($input);//解析命令
50. exit;
51. }
else {//主进程
52. $pid =
pcntl_wait($status, WUNTRACED);
//取得子进程结束状态
53. if (pcntl_wifexited($status))
{
54. echo"\n\n* Sub process: {$pid} exited with{$status}";
55. }
56. }
57. }
58.
但有一点,
我一定要提醒:
1. Process Control should not be enabled within a webserverenvironment and unexpected results may happen if any Process Control functionsare
used within a webserver environment. --摘自PHP手册
也就是说,
打消你在PHP Web开发中使用多进程的念头吧!
相关文章推荐
- php实现递归的三种基本方式
- PHP字符串比较
- PHP4中模拟类的析构函数
- PHP
- php 上传图片文件类型整理
- RHEL7.1安装ftp
- cetos 6.6搭建sftp服务
- getPerspectiveTransform函数
- php - MySQL数据库的连接与关闭
- 服务器安全狗导致FTP链接、上传失败 解决方法
- ftp缓存信息
- php利用smtp类轻松的发送电子邮件
- PHP与EXCEL PHPExcel
- PHP获取网址的PR值
- PHP安全下载文件
- PHP字符串比较
- Yii2中验证码的使用
- 如何在yii的controller中调用外部action
- PHP 数组和字符串互相转换实现方法
- PHP实现生成唯一会员卡号