Maison > Article > développement back-end > Partage de solution multithread PHP
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 ? Dans cet article, nous partageons principalement avec vous la solution PHP multi-threading, en espérant vous aider.
1. PHP multi-threading sous Linux
Les éléments suivants sont la source Depuis la fonction pcntl_fork de PHP. Étant donné que cette fonction dépend de l'implémentation du fork du système d'exploitation, les éléments abordés dans cet article ne s'appliquent qu'à Linux/Unix. Voyons donc d'abord 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 la valeur de retour est -1, alors la création du processus enfant. Échec de la création L'ID du processus réussi sera renvoyé au processus parent et 0 sera renvoyé au processus enfant. C'est difficile à comprendre, il devrait donc ê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. cela facilitera la compréhension. Si votre processus parent veut connaître le processus enfant. Si le processus se termine normalement, vous pouvez ajouter le pcntl_wait précédent.
2.Grâce à 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);
La vraie façon de réaliser le multi-threading en php peut être réalisée en installant l'extension php pthread.
Actualisez ensuite la page comme suit, faites-la glisser vers le bas :
Trouvez la version 2 sur la page suivante
et téléchargez-la Cette v2 ne peut être utilisée qu'avec php5
Télécharger Descendez et installez : Ou, vous pouvez le télécharger directement :cd /tools wget https://github.com/krakjoe/pthreads/archive/v2.0.10.zip unzip v2.0.10.zip cd pthreads-2.0.10 /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config make make installRemarque : votre php doit être activé lors de la compilation –enable-maintainer-zts
./configure --prefix=/usr/local/php --disable-fileinfo --enable-fpm --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-openssl --with-zlib --with-curl --enable-ftp --with-gd --with-xmlrpc --with-jpeg-dir --with-png-dir --with-freetype-dir --enable-gd-native-ttf --enable-mbstring --with-mcrypt=/usr/local/libmcrypt --enable-zip --with-mysql=/usr/local/mysql --without-pear --enable-maintainer-zts
vim /etc/php.ini 添加 extension=pthreads.so
重启php /etc/init.d/php-fpm restartRecommandations associées :
Explication détaillée du mécanisme multithread du navigateur
Explication détaillée de Exemples multithread PHP
Prise en charge de PHP et utilisation de la programmation multithread
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!