Maison >développement back-end >Problème PHP >Comment implémenter la concurrence en php

Comment implémenter la concurrence en php

藏色散人
藏色散人original
2020-10-10 10:18:575102parcourir

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.

Comment implémenter la concurrence en php

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn