Plusieurs tâches sont exécutées simultanément
Convertir les tâches exécutées séquentiellement en exécution parallèle (tâche Logiquement, elle peut être exécuté en parallèle)
Par exemple, nous devons juger des données utilisateur connues si des e-mails et des SMS doivent être envoyés, et si oui, les envoyer.
Lorsque le multi-processus n'est pas utilisé, nous déterminons d'abord s'il faut envoyer un e-mail et l'envoyons si nécessaire ; ensuite nous déterminons si un message texte doit être envoyé et l'envoyons si nécessaire. S'il faut 2 secondes pour envoyer un e-mail et 2 secondes pour envoyer un message texte, il nous faudra environ 4 secondes pour terminer la tâche.
Si nous utilisons le multithreading, nous pouvons ouvrir deux fils de discussion, un pour le traitement des e-mails et un pour le traitement des messages texte. Cela prendra au total environ 2 secondes et le temps de traitement est réduit de moitié.
Recommandé (gratuit) : swoole
<?php/** * Created by PhpStorm. * User: zhezhao * Date: 2016/10/20 * Time: 10:37 */$info = array( "sendmail"=>1, "mailto"=>"12345@qq.com", "sendsms"=>1, "smsto"=>"123456");echo "start:".date("Y-m-d H:i:s").PHP_EOL;$mail_process = new swoole_process('sendMail',true);$mail_process->start();$sms_process = new swoole_process('sendSMS',true);$sms_process->start();//主进程输出子进程范围内容echo $mail_process->read();echo PHP_EOL;echo $sms_process->read();echo PHP_EOL;echo "end:".date("Y-m-d H:i:s").PHP_EOL;//并行函数function sendMail(swoole_process $worker){ global $info; if($info['sendmail']==1){ sleep(2); $worker->write("send mail to ".$info['mailto']); } }function sendSMS(swoole_process $worker){ global $info; if($info['sendmail']==1){ sleep(2); $worker->write("send sms to ".$info['smsto']); } }
Diviser les grandes tâches en petites tâches
Divisez les tâches exécutées de manière cyclique en plusieurs processus d'exécution afin d'améliorer l'efficacité du travail
Supposons que nous ayons maintenant un système qui récupère le contenu Web via curl Selon le exigence, 10 pages Web doivent être explorées. L'adresse URL est lue dans le tableau. Chaque boucle prend 2 secondes. Si nous explorons ces 10 pages Web à travers une boucle for, cela prendra 20 secondes. En utilisant le multi-processus, nous pouvons diviser la tâche en 5 parties et les exécuter respectivement par 5 processus. Chaque processus récupère 2 URL et les exécute simultanément. Au total, cela prend 4 secondes et l'efficacité est augmentée de 5 fois.
<?php/** * Created by PhpStorm. * User: zhezhao * Date: 2016/10/20 * Time: 10:51 */$url_arr = array();for ($i=0;$i<10;$i++){ $url_arr[] = "www.baidu.com?wd=".$i; }echo "start:".date("Y-m-d H:i:s").PHP_EOL;$workers = array();for ($i=0;$i<5;$i++){ $process = new swoole_process('getContents',true); $process->start(); $process->write($i); $workers[] = $process; }//主进程数据结果foreach ($workers as $process){ echo $process->read(); echo PHP_EOL; }echo "end:".date("Y-m-d H:i:s").PHP_EOL;function getContents(swoole_process $worker){ $i = $worker->read(); global $url_arr; $res1 = execCurl($url_arr[($i*2)]); $res2 = execCurl($url_arr[($i*2+1)]); echo $res1.PHP_EOL.$res2; }function execCurl($url){ sleep(2); return "handle ".$url." finished"; }
Résumé
Les deux situations ci-dessus consistent essentiellement à utiliser plusieurs tâches logiquement indépendantes qui sont exécutées simultanément pour améliorer l'efficacité.
Le mécanisme PHP lui-même ne fournit pas d'opérations multithread. L'extension ptcl fournit une interface permettant à PHP de faire fonctionner plusieurs processus Linux.
Personnellement, je pense que la méthode multi-processus de Swoole est plus pratique.
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!