手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆

转:PHP中利用pcntl实现多进程(模拟多线程)实例

首页 > PHP >

 pcntl在很久很久之前就听过了,但是一直没有尝试着真正要用它。这不,遇到socket问题了,看socket,遇到pcntl了,再看看吧。

这里是某个人的测试代码:
PHP代码
  1. <?php  
  2. /** 
  3.  * 创建子进程入口 
  4.  * @author selfimpr 
  5.  * @blog http://blog.csdn.net/lgg201 
  6.  * @mail lgg860911@yahoo.com.cn 
  7.  * @param $func_name 代表子进程处理过程的函数名 
  8.  * @param other 接受不定参数, 提供给子进程的过程函数. 
  9.  */  
  10. function new_child($func_name)  
  11. {  
  12.     $args = func_get_args();  
  13.     unset($args[0]);  
  14.     $pid = pcntl_fork();  
  15.     if ($pid == 0) {  
  16.         function_exists($func_nameand exit(call_user_func_array($func_name$args)) or exit(-1);  
  17.     }  
  18.     else if ($pid == -1) {  
  19.         echo "Couldn’t create child process .";  
  20.     }  
  21. }  
  22. //测试处理函数, 输出$prefix连接的数组    
  23. function test($prefix$num)  
  24. {  
  25.     while ($i++ < $num) {  
  26.         echo $prefix . $i ."\n";  
  27.     }  
  28. }  
  29. //创建一个子进程    
  30. new_child("test""child process ", 100);  
  31. //父进程也开启一个与子进程同样多的循环.    
  32. test("parent process", 100);  
  33. //运行结果, 我这里运行父进程输出50个左右, 子进程开始运行.    
  34. ?>    
因为上面有作者有注释,所以我就不再多贴这篇文章的地址了。原网页的代码是错误的。我改了一下。原作者说的是:父进程输出50个左右时,子进程就开始运行了。我这边不是。我把数据改成1000后,发现父进程在950多的时候,子进程开始运行了。
原作者的博客上还有一个详细介绍:PHP扩展pcntl(进程控制以及信号处理)中文文档 
 
当然,看手册也可以,对了,风雪之隅也写过类似的文章,http://www.laruence.com/2009/06/11/930.html,他提到的优点就是:
XML/HTML代码
  1. 优点:  
  2.     1. 使用多进程, 子进程结束以后, 内核会负责回收资源  
  3.     2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程.  
  4.     3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.  
然后他的代码就与上面有点区别,不过说白了还是大同小异:
PHP代码
  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. * @license http://www.zend.com/license/3_0.txt PHP License 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.         Shell Executor 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. function process_execute($input) {  
  45.         $pid = pcntl_fork(); //创建子进程  
  46.         if ($pid == 0) {//子进程  
  47.                 $pid = posix_getpid();  
  48.                 echo "* Process {$pid} was created, and Executed:\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. }  
做个笔记。
 
 
 
 



本站采用创作共享版权协议, 要求署名、非商业和保持一致. 本站欢迎任何非商业应用的转载, 但须注明出自"膘叔", 保留原始链接, 此外还必须标注原文标题和链接.

Tags: 多进程, pcntl

« 上一篇 | 下一篇 »

发表评论

评论内容 (必填):