Heim  >  Artikel  >  php教程  >  Teilen Sie PHP-pcntl, um Multiprozesscode zu implementieren

Teilen Sie PHP-pcntl, um Multiprozesscode zu implementieren

高洛峰
高洛峰Original
2016-12-22 16:16:261427Durchsuche

PHP kann mithilfe der PCNTL-Funktionsreihe auch eine Transaktion mit mehreren Prozessen verarbeiten. Ich muss beispielsweise 800.000 Daten aus der Datenbank abrufen und dann eine Reihe nachfolgender Verarbeitungen durchführen. Verwenden Sie zu diesem Zeitpunkt einen einzigen Prozess? Sie können bis heute nächstes Jahr warten. . . Daher sollten Sie die Funktion pcntl verwenden.

Schauen wir uns ein Beispiel an

Code

<?php
$arChildId = array();
 
for($i = 0; $i < 10; $i++)
{
$iPid = pcntl_fork();
if($iPid == -1)
{
  die(&#39;can\&#39;t be forked.&#39;);
}
 
if($iPid)
{
  # 主进程逻辑
  $arChildId[] = $iPid;
}
else
  {
  # 子进程逻辑
  $iPid = posix_getpid(); # 获取子进程的ID
  $iSeconds = rand(5, 30);
  echo &#39;* Process &#39;. $iPid. &#39; was created, and Executed, and Sleep &#39;. $iSeconds. PHP_EOL;
  excuteProcess($iPid, $iSeconds);
  exit();
}
}
 
while(count($arChildId) > 0)
{
foreach($arChildId as $iKey=> $iPid)
{
  $res = pcntl_waitpid($iPid, $status, WNOHANG);
 
  if($res == -1 || $res > 0)
  {
    unset($arChildId[$iKey]);
    echo &#39;* Sub process: &#39;. $iPid. &#39; exited with &#39;. $status. PHP_EOL;
  }
}
}
 
# 子进程执行的逻辑
function excuteProcess($iPid, $iSeconds)
{
file_put_contents(&#39;./log/&#39;.$iPid.&#39;.log&#39;, $iPid.PHP_EOL, FILE_APPEND);
sleep($iSeconds);
}
?>

Laufergebnis

* Process 16163 was created, and Executed, and Sleep 11
* Process 16164 was created, and Executed, and Sleep 21
* Process 16165 was created, and Executed, and Sleep 24
* Process 16166 was created, and Executed, and Sleep 27
* Process 16167 was created, and Executed, and Sleep 8
* Process 16168 was created, and Executed, and Sleep 14
* Process 16169 was created, and Executed, and Sleep 14
* Process 16170 was created, and Executed, and Sleep 26
* Process 16171 was created, and Executed, and Sleep 20
* Process 16172 was created, and Executed, and Sleep 21
* Sub process: 16167 exited with 0
* Sub process: 16163 exited with 0
* Sub process: 16169 exited with 0
* Sub process: 16168 exited with 0
* Sub process: 16171 exited with 0
* Sub process: 16164 exited with 0
* Sub process: 16172 exited with 0
* Sub process: 16165 exited with 0
* Sub process: 16170 exited with 0
* Sub process: 16166 exited with 0

Weitere Freigaben im Zusammenhang mit der PHP-pcntl-Implementierung von Multi -Prozesscode Bitte beachten Sie die PHP-Chinese-Website für Artikel!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn