談PHP CLI模式下的多進程應用_PHP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:解讀PHP將比Java更受歡迎
      Netscape共同創辦人Marc Andreessen在周三(10/19)舉行的Zend/PHP會議上預言,簡單的PHP描述性語言撰寫工具,在Web-based應用程序的開發上,將會比Java更受歡迎。 在Sun Microsystems于1995年發表Java之后,由于Java的友善接口讓工程師設計軟件更為容易,受到

      PHP在很多時候不適合做常駐的SHELl進程, 他沒有專門的gc例程, 也沒有有效的內存管理途徑. 所以如果用PHP做常駐SHELL, 你會經常被內存耗盡導致abort而unhappy.
      而且, 如果輸入數據非法, 而腳本沒有檢測, 導致abort, 也會讓你很不開心.

      那? 怎么辦呢?

      呵呵, 別著急, 多進程來幫您!

      那,這是為什么呢?

      優點:

      1. 使用多進程, 子進程結束以后, 內核會負責回收資源

      2. 使用多進程,子進程異常退出不會導致整個進程Thread退出. 父進程還有機會重建流程.

      3. 一個常駐主進程, 只負責任務分發, 邏輯更清楚.


      Then, 怎么做呢?

      接下來, 我們使用PHP提供的POSIX和Pcntl系列函數, 來實現一個PHP命令解析器, 主進程負責接受用戶輸入, 然后fork子進程執行, 并負責回顯子進程的結束狀態.
      代碼如下, 我加了注釋, 如果有不懂的地方, 可以翻閱手冊相關函數, 或者回復留言.

      #!/bin/env php<?php
      /** A example denoted muti-process application in php
      * @filename fork.php
      * @touch date Wed 10 Jun 2009 10:25:51 PM CST
      * @author Laruence<laruence@baidu.com>
      * @license http://www.zend.com/license/3_0.txt   PHP License 3.0
      * @version 1.0.0
      */
      /** 確保這個函數只能運行在SHELL中 */
      if
      (substr(php_sapi_name(), 0, 3) !== 'cli')
      {
      die("This Programe can only be run in CLI mode");
      }
      /**  關閉最大執行事件限制, 在CLI模式下, 這個語句其實不必要 */
      set_time_limit(0);

      $pid  = posix_getpid(); //取得主進程ID
      $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}";
                      }
      }
      }


      分享:解讀配置PHP站點安全綜合教程
      本文通過介紹一些技巧,針對PHP木馬攻擊的防御之道,通過這些方面你可以更好的防范木馬程序。 1、防止跳出web目錄 首先修改httpd.conf,如果你只允許你的php腳本程序在web目錄里操作,還可以修改httpd.conf文件限制php的操作路徑。比如你的web目錄是/usr/loc

      來源:模板無憂//所屬分類:PHP教程/更新時間:2009-07-07
      相關PHP教程