php如何实现并发-PHP问题

资源魔 38 0

php完成并发的办法:起首写好针对第三方的申请接口;而后应用并发申请这些第三方的接口,并发代码如“function request(){...}”;最初应用php完成轮回申请接口便可。

保举:《PHP视频教程》

php完成并发

应用场景

假如你第三方的多个接口,需求轮回申请,这时候候就需求并发解决,由于 php 是单过程,程序执行的顺序,假如有一个接口挂了,那末前面的接口也不克不及失去申请,或许某个接口期待工夫太长,上面的接口也需求期待工夫,那末十多个接口每一个接口期待1S,十个接口就需求10S能力实现一次申请。这时候候,就需求应用并发申请

应用计划

能够先写好针对某个第三方的申请接口,而后应用并发申请这些第三方的接口

并发代码

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 完成轮回申请接口

这类状况针对的是轮回需求正在1S内执行的顺序,假如执行频次超越1S,则间接应用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);

以上就是php若何完成并发的具体内容,更多请存眷资源魔其它相干文章!

标签: php php教程 php故障解决 php使用问题

抱歉,评论功能暂时关闭!