Als wir an dem Projekt arbeiteten, hatten wir einige Anforderungen, insbesondere die Antwortverarbeitung von Daten, die viel Zeit in Anspruch nahmen. Wir alle wissen, dass PHP selbst kein Multithreading unterstützt. Wie sollten wir also Multithreading implementieren? in PHP?
1. PHP-Multithreading unter Linux
Aus diesem Grund werden die folgenden Dinge von der pcntl_fork-Funktion abgeleitet Die Funktion hängt von der Implementierung des Betriebssystemzweigs ab, daher gelten die in diesem Artikel besprochenen Dinge nur für Linux/Unix. Werfen wir also zunächst einen Blick auf die Verwendung dieser Funktion. php-Handbuch sagt Folgendes:
<?php $pid = pcntl_fork();if ($pid == -1) { die('could not fork'); } else if ($pid) { // we are the parent pcntl_wait($status); / /Protect against Zombie children} else { // we are the child}?>
Erstellen Sie einen untergeordneten Prozess über pcntl_fork, wenn Wenn der Rückgabewert -1 ist, bedeutet dies, dass die erfolgreich erstellte Prozess-ID an den übergeordneten Prozess zurückgegeben wird und 0 an den untergeordneten Prozess zurückgegeben wird. Dies ist daher schwer zu verstehen sollte so geschrieben werden:
<?php $pid = pcntl_fork();if($pid == -1){ //创建失败咱就退出呗,没啥好说的 die('could not fork'); }else{ if($pid){ //从这里开始写的代码是父进程的,因为写的是系统程序,记得退出的时候给个返回值 exit(0); } else{ //从这里开始写的代码都是在新的进程里执行的,同样正常退出的话,最好也给一个返回值 exit(0); } }?>
Diese Änderung ist viel einfacher zu verstehen. Wenn Ihr übergeordneter Prozess wissen möchte, dass der untergeordnete Prozess normal beendet wird, können Sie den vorherigen pcntl_wait hinzufügen.
2. Durch stream_socket_client-Methode
function sendStream() { $english_format_number = number_format($number, 4, '.', ''); echo $english_format_number; exit(); $timeout = 10; $result = array(); $sockets = array(); $convenient_read_block = 8192; $host = "test.local.com"; $sql = "select waybill_id,order_id from xm_waybill where status>40 order by update_time desc limit 1 "; $data = Yii::app()->db->createCommand($sql)->queryAll(); $id = 0; foreach ($data as $k => $v) { if ($k % 2 == 0) { $send_data[$k]['body'] = NoticeOrder::getSendData($v['waybill_id']); } else { $send_data[$k]['body'] = array($v['order_id'] => array('extra' => 16)); } $data = json_encode($send_data[$k]['body']); $s = stream_socket_client($host . ":80", $errno, $errstr, $timeout, STREAM_CLIENT_ASYNC_CONNECT | STREAM_CLIENT_CONNECT); if ($s) { $sockets[$id++] = $s; $http_message = "GET /php/test.php?data=" . $data . " HTTP/1.0\r\nHost:" . $host . "\r\n\r\n"; fwrite($s, $http_message); } else { echo "Stream " . $id . " failed to open correctly."; } } while (count($sockets)) { $read = $sockets; stream_select($read, $w = null, $e = null, $timeout); if (count($read)) { /* stream_select generally shuffles $read, so we need to compute from which socket(s) we're reading. */ foreach ($read as $r) { $id = array_search($r, $sockets); $data = fread($r, $convenient_read_block); if (strlen($data) == 0) { echo "Stream " . $id . " closes at " . date('h:i:s') . ".<br> "; fclose($r); unset($sockets[$id]); } else { $result[$id] = $data; } } } else { /* A time-out means that *all* streams have failed to receive a response. */ echo "Time-out!\n"; break; } } print_r($result); }
3. Ersetzen Sie Multithreading durch Multiprozess
function daemon($func_name,$args,$number){ while(true){ $pid=pcntl_fork(); if($pid==-1){ echo "fork process fail"; exit(); }elseif($pid){//创建的子进程 static $num=0; $num++; if($num>=$number){ //当进程数量达到一定数量时候,就对子进程进行回收。 pcntl_wait($status); $num--; } }else{ //为0 则代表是子进程创建的,则直接进入工作状态 if(function_exists($func_name)){ while (true) { $ppid=posix_getpid(); var_dump($ppid); call_user_func_array($func_name,$args); sleep(2); } }else{ echo "function is not exists"; } exit(); } } } function worker($args){ //do something } daemon('worker',array(1),2);
Zusammenfassung:
Multithreading kann in PHP tatsächlich nicht verwendet werden , wir alle Ja, wir wissen es, aber wir können es mit vielen Methoden implementieren. In diesem Artikel wird die Multithreading-Implementierungsmethode in PHP vorgestellt. Hoffe das hilft!
Verwandte Empfehlungen:
Das obige ist der detaillierte Inhalt vonEinführung in drei Methoden zur Implementierung der PHP-Multithread-Simulation. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!