Heim >Backend-Entwicklung >PHP-Problem >Es gibt mehrere Möglichkeiten, PHP-Multithreading zu implementieren
1. Methode „curl_multi“
Wenn Multithreading erforderlich ist, können Sie mit „curl_multi“ mehrere Vorgänge gleichzeitig anfordern, „Curl“ jedoch Bei der Netzwerkkommunikation sind Effizienz und Zuverlässigkeit relativ schlecht.
function main(){ $sql = "select waybill_id,order_id from waybill where status>40 order by update_time desc limit 10 "; $data = Yii::app()->db->createCommand($sql)->queryAll(); //yii 框架格式 foreach ($data as $k => $v) { if ($k % 2 == 0) { //偶数发一个网址 $send_data[$k]['url'] = ''; $send_data[$k]['body'] = $v['waybill_id']; } else { //奇数发送另外一个网址 $send_data[$k]['url'] = 'http://www.abc.com'; $send_data[$k]['body']=array($v['order_id'] => array('extra' => 16)); } } }
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."; } } }
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);
Empfohlenes Tutorial : PHP-Video-Tutorial
Das obige ist der detaillierte Inhalt vonEs gibt mehrere Möglichkeiten, PHP-Multithreading zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!