2013-05-28 194 views
12

我正在運行一個PHP守護進程進行配置。php xdebug:如何配置分叉進程

的啓動所需的所有數據的PHP處理的負擔,forks本身對所有核分配工作量,waits爲分叉兒來完成,並收集孩子們所產生的結果。

由於我與其他用戶共享CLI環境,我需要通過在shell調用中注入php.ini值來啓動xdebug profiling

$ php -d xdebug.profiler_enable=1 -d xdebug.profiler_output_dir="/home/xxx" daemon.php 

生成的cachegrind文件,如何分析家長,因此顯示90%的睡眠。

有沒有辦法在不建立驅動程序的情況下對工作人員進行概要分析?

感謝

回答

7

我遇到同樣的問題,並沒有解決XDebug的。不幸的是我找不到XDebug的一種方法。就好像它不關心任何分支進程。

我解決了使用XHProf的來分析和Xhgui檢查日誌。 Xhprof是Facebook內部開發的一款優秀工具,然後在開源後發佈。 很酷的是,您可以決定何時開始分析以及何時停止。這使您能夠解決我們的問題。

所以首先讓我們安裝它!

sudo pecl install xhprof-beta 

如果您使用的是基於debian的發行版,請確保您還安裝了graphviz。

sudo apt-get install graphviz 

現在讓我們來看看代碼。

$children = []; 

do { 
    if (count($children) < $maxConsumers) { 
     $pid = pcntl_fork(); 
     $children[] = $pid; 

     if ($pid == -1) { 
      throw new \RuntimeException('Could not fork process'); 
     } else if ($pid === 0) { 
      // we are the child 

      if ($verbose) { 
       $output->writeln(sprintf('Child here (PID = %s)', posix_getpid())); 
      } 

      if ($xhProf) { 
       // here we enable xhprof thus the profiling starts 
       xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); 
      } 

      // DO YOUR MAGIC HERE! 

      if ($xhProf) { 
       // and here we call the xhgui header file that will 
       // stop xhprof and write all the gathered data into 
       // mongo or into a dedicated file 
       require_once('/var/www/xhgui/external/header.php'); 
      } 

      exit; 
     } else { 
      // we are the parent 
      if ($verbose) { 
       $output->writeln(sprintf('Parent here (PID = %s) spawned a new child (PID = %s)', posix_getpid(), $pid)); 
      } 
     } 
    } else { 
     if ($verbose) { 
      $output->writeln(sprintf("Parent - spawned enough children, let's wait them...")); 
     } 

     $deadPID = pcntl_wait($status); 
     $children = array_diff($children, [$deadPID]); 
} while (true); 

// Waits for all remaining children 
while (($pid = pcntl_waitpid(0, $status)) != -1) { 
    if ($verbose) { 
     $status = pcntl_wexitstatus($status); 
     $output->writeln(sprintf("Child (PID %d) terminated. Status is %s.", $pid, $status)); 
    } 
} 

爲了檢查您的日誌,您還需要正確配置Xhgui。你可能也需要一個虛擬主機。

對於所有所需的配置和以供參考: