Maison >développement back-end >Problème PHP >Comment implémenter la concurrence en php
Comment implémenter la concurrence en PHP : écrivez d'abord l'interface de requête pour les tiers ; puis utilisez des requêtes simultanées pour ces interfaces tierces, avec du code concurrent tel que "function request(){...}" ; enfin, utilisez PHP. Implémentez simplement l'interface de requête de boucle.
Recommandé : "Tutoriel vidéo PHP"
php pour obtenir la simultanéité
Scénarios d'utilisation
Si vous disposez de plusieurs interfaces tierces qui doivent boucler les requêtes, un traitement simultané est requis, car PHP est un programme à processus unique exécuté séquentiellement. Si une interface se bloque, alors le programme se bloque. Ensuite L'interface ne peut pas obtenir la demande, ou le temps d'attente d'une interface est trop long, et les interfaces suivantes ont également besoin d'un temps d'attente. Ensuite, plus de dix interfaces attendent 1S chacune, et dix interfaces prendront 10S pour terminer une demande. À ce stade, vous devez utiliser des requêtes simultanées
Plan d'utilisation
Vous pouvez d'abord écrire une interface de requête pour un tiers, puis utiliser des requêtes simultanées pour ces interfaces tierces
Code simultané
function request(){ $srart_time = microtime(TRUE); $webSiteUrl = 'http://test/'; /** * 结算 */ $alls = [ $webSiteUrl . "1.php", $webSiteUrl . "2.php", ]; //1 创建批处理cURL句柄 $chHandle = curl_multi_init(); $chArr = []; //2.创建多个cURL资源 foreach ($alls as $Url) { $chArr[$Url] = curl_init(); curl_setopt($chArr[$Url], CURLOPT_URL, $Url); curl_setopt($chArr[$Url], CURLOPT_RETURNTRANSFER, 1); curl_setopt($chArr[$Url], CURLOPT_TIMEOUT, 1); curl_multi_add_handle($chHandle, $chArr[$Url]); //2 增加句柄 } $active = null; /**常量 * CURLM_CALL_MULTI_PERFORM==-1 * // CURLM_OK == 0 **/ do { $mrc = curl_multi_exec($chHandle, $active); //3 执行批处理句柄 } while ($mrc == CURLM_CALL_MULTI_PERFORM); //4 //4 $active 为true,即$chHandle批处理之中还有$ch句柄正待处理,$mrc==CURLM_OK,即上一次$ch句柄的读取或写入已经执行完毕。 while ($active && $mrc == CURLM_OK) { if (curl_multi_select($chHandle) != CURLM_CALL_MULTI_PERFORM) {//$chHandle批处理中还有可执行的$ch句柄,curl_multi_select($chHandle) != -1程序退出阻塞状态。 do { $mrc = curl_multi_exec($chHandle, $active);//继续执行需要处理的$ch句柄。 } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } foreach ($chArr as $k => $ch) { // $result[$k] = curl_multi_getcontent($ch); //5 获取句柄的返回值,不需要 curl_multi_remove_handle($chHandle, $ch);//6 将$chHandle中的句柄移除 } curl_multi_close($chHandle); //7 关闭全部句柄 $end_time = microtime(TRUE); echo sprintf("use time:%.3f s", $end_time - $srart_time); }
php implémente l'interface de requête de boucle
Cette situation concerne les programmes qui doivent être exécutés dans un délai de 1S. Si la fréquence d'exécution dépasse 1S, vous pouvez directement utiliser la planification. tâches de Linux
// 无时间限制执行此程序 set_time_limit(0); // 设置默认时区 北京时间 date_default_timezone_set('PRC'); do { // 如果不存在 stop 文件,则程序停止 并且记录停止时间 if (!file_exists(dirname(__FILE__) . '/stop')) { $handle = fopen('./ceshi.log', 'a+'); fwrite($handle, '程序停止时间: ' . date('Y-m-d H:i:s') . "\n"); fclose($handle); exit(); } sleep(4); try { requestNewOpen(); } catch (Exception $exception) { $handle = fopen('./ceshi.log', 'a+'); fwrite($handle, 'catch : ' . $exception->getMessage() . "\n"); fclose($handle); } } while (true);.
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!