PHP CLI模式下的多进程应用

简介: 作者: Laruence(   ) 本文地址: http://www.laruence.com/2009/06/11/930.html 转载请注明出处 PHP在很多时候不适合做常驻的SHELL进程, 他没有专门的gc例程, 也没有有效的内存管理途径.

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. * @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. }
  58.   

但有一点, 我一定要提醒:

  1. 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开发中使用多进程的念头吧!

谋胆并重
目录
相关文章
|
7天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
7天前
|
设计模式 算法 测试技术
PHP中的设计模式:策略模式的应用与实践
在软件开发的浩瀚海洋中,设计模式如同灯塔,指引着开发者们避开重复造轮子的暗礁,驶向高效、可维护的代码彼岸。今天,我们将聚焦于PHP领域中的一种重要设计模式——策略模式,探讨其原理、应用及最佳实践,揭示如何通过策略模式赋予PHP应用灵活多变的业务逻辑处理能力,让代码之美在策略的变换中熠熠生辉。
|
8天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入探索与实践在软件开发的广袤天地中,PHP以其独特的魅力和强大的功能,成为无数开发者手中的得力工具。而在这条充满挑战与机遇的征途上,设计模式犹如一盏明灯,指引着我们穿越代码的迷雾,编写出更加高效、灵活且易于维护的程序。今天,就让我们聚焦于设计模式中的璀璨明珠——策略模式,深入探讨其在PHP中的实现方法及其实际应用价值。
策略模式,这一设计模式的核心在于它为软件设计带来了一种全新的视角和方法。它允许我们在运行时根据不同情况选择最适合的解决方案,从而极大地提高了程序的灵活性和可扩展性。在PHP这门广泛应用的编程语言中,策略模式同样大放异彩,为开发者们提供了丰富的创作空间。本文将从策略模式的基本概念入手,逐步深入到PHP中的实现细节,并通过一个具体的实例来展示其在实际项目中的应用效果。我们还将探讨策略模式的优势以及在实际应用中可能遇到的挑战和解决方案,为PHP开发者提供一份宝贵的参考。
ly~
|
9天前
|
存储 监控 小程序
除了 Web 开发,PHP 还可以应用于哪些领域?
PHP 在 Web 开发之外还有多个应用场景:1)命令行脚本,如批量处理文件、数据库管理及系统监控;2)利用 PHP-GTK 等工具开发桌面应用,满足特定业务需求;3)结合微信云开发功能支持微信小程序后端,处理数据存储与用户认证;4)为小型游戏或特定类型游戏开发游戏服务器逻辑;5)在物联网领域作为后端语言处理设备数据交互与分析。
ly~
25 4
|
10天前
|
设计模式 自然语言处理 算法
PHP中的设计模式:桥接模式的深入探索与应用
在PHP开发中,理解并运用设计模式是提升代码质量与可维护性的关键。本文聚焦于桥接模式——一种结构型设计模式,它通过封装一个抽象的接口,将实现与抽象分离,从而使得它们可以独立变化。不同于传统摘要的概述式表述,本文将以故事化的情境引入,逐步解析桥接模式的精髓,通过PHP代码示例详细展示其在实际项目中的应用,旨在为读者提供一个既深刻又易于理解的学习体验。
12 1
|
6天前
|
数据采集 消息中间件 并行计算
进程、线程与协程:并发执行的三种重要概念与应用
进程、线程与协程:并发执行的三种重要概念与应用
16 0
|
10天前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。
|
PHP Android开发
PHP CLI应用的调试原理
PHP CLI应用的调试原理
121 0
PHP CLI应用的调试原理
|
15天前
|
安全 关系型数据库 MySQL
PHP与MySQL交互:从入门到实践
【9月更文挑战第20天】在数字时代的浪潮中,掌握PHP与MySQL的互动成为了开发动态网站和应用程序的关键。本文将通过简明的语言和实例,引导你理解PHP如何与MySQL数据库进行对话,开启你的编程之旅。我们将从连接数据库开始,逐步深入到执行查询、处理结果,以及应对常见的挑战。无论你是初学者还是希望提升技能的开发者,这篇文章都将为你提供实用的知识和技巧。让我们一起探索PHP与MySQL交互的世界,解锁数据的力量!