Maison >développement back-end >tutoriel php >Introduction à trois méthodes d'implémentation de simulation multithread PHP
Lorsque nous travaillions sur le projet, nous avions certaines exigences, notamment le traitement des réponses des données qui prenait beaucoup de temps. Nous savons tous que PHP lui-même ne prend pas en charge le multi-threading, alors comment devrions-nous implémenter le multi-threading. en PHP ?
1. Multi-threading PHP sous Linux
Les éléments suivants sont dérivés de la fonction pcntl_fork de PHP Pour cette raison. La fonction dépend de l’implémentation du fork du système d’exploitation, donc les éléments abordés dans cet article ne s’appliquent qu’à Linux/Unix. Jetons donc d'abord un coup d'œil à l'utilisation de cette fonction. le manuel php dit ceci :
<?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}?>
Créez un processus enfant via pcntl_fork, si. Si la valeur de retour est -1, cela signifie que la création du processus enfant a échoué. L'ID du processus créé avec succès sera renvoyé au processus parent et 0 sera renvoyé au processus enfant. C'est difficile à comprendre. devrait être écrit comme ceci :
<?php $pid = pcntl_fork();if($pid == -1){ //创建失败咱就退出呗,没啥好说的 die('could not fork'); }else{ if($pid){ //从这里开始写的代码是父进程的,因为写的是系统程序,记得退出的时候给个返回值 exit(0); } else{ //从这里开始写的代码都是在新的进程里执行的,同样正常退出的话,最好也给一个返回值 exit(0); } }?>
Ce changement est beaucoup plus facile à comprendre. Si votre processus parent veut savoir que le processus enfant se termine normalement, vous pouvez ajouter le pcntl_wait précédent.
2. Via la méthode stream_socket_client
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. Remplacer le multi-threading par le multi-processus
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);
Résumé :
Le multi-threading ne peut pas être utilisé en php. , nous tous Oui, nous le savons, mais nous pouvons l'implémenter via de nombreuses méthodes. Cet article présente la méthode d'implémentation multi-thread en PHP. J'espère que cela aide!
Recommandations associées :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!