2013-05-28 12 views
12

Ich bin mit einem PHP-Daemon zu profilieren.php xdebug: Wie Profil Forked Prozess

Die gestartete Lasten PHP-Prozess alle Daten erforderlich, forks selbst Workload über alle Kerne zu verteilen, waits für die gegabelten Kinder zu beenden, und sammelt die von den Kindern generierten Ergebnisse.

Da ich die CLI-Umgebung mit anderen Benutzern teile, muss ich xdebug profiling starten, indem ich php.ini-Werte in den Shell-Aufruf einspeise.

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

Die generierte cachegrind-Datei profiliert jedoch das übergeordnete Element und zeigt daher 90% Schlaf.

Gibt es eine Möglichkeit, die Arbeiter zu profilieren, ohne einen Treiber zu bauen, um sie direkt zu laden?

Dank

Antwort

7

Ich lief in das gleiche Problem und ohne XDebug gelöst. Leider konnte ich mit XDebug keinen Weg finden. Es ist so, als ob es sich irgendwie nicht um einen gegabelten Prozess kümmert.

I gelöst durch Xhprof zum Profil und Xhgui mit die Protokolle zu überprüfen. Xhprof ist ein großartiges Tool, das intern von Facebook entwickelt und danach Open-Source veröffentlicht wurde. Die coole Sache ist, dass Sie genau entscheiden können, wann Sie mit dem Profiling beginnen und wann Sie aufhören sollen. Dies gibt Ihnen die Möglichkeit, unser Problem zu umgehen.

Also zuerst lass es uns installieren!

sudo pecl install xhprof-beta 

Wenn Sie eine Debian-basierte Distribution verwenden, stellen Sie sicher, dass Sie auch Graphviz installiert haben.

sudo apt-get install graphviz 

Jetzt schauen wir uns den Code an.

$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)); 
    } 
} 

Um Ihre Protokolle zu überprüfen, müssen Sie auch Xhgui ordnungsgemäß konfigurieren. Sie werden wahrscheinlich auch einen virtuellen Host benötigen.

Für alle die benötigte Konfiguration und Referenz: