PHP 请求长时间的程序

2021-11-21  本文已影响0人  云龙789

【php】用户关闭浏览器后服务器端会继续执行吗?

关于curl 请求时常的问题,很多资料都是复制粘贴,人家解释的都没问题,但关键还是不是很透彻

 1. curl_setopt($curl, CURLOPT_TIMEOUT, 1);     
手册解释:允许 cURL 函数执行的最长秒数。
我个人感觉是请求程执行的最长时间。被请求的程序需要10S,则这里需要大于10
2. curl_setopt($curl, CURLOPT_CONNECTTIMEOUT , 1); 
手册解释: 在尝试连接时等待的秒数。设置为0,则无限等待。
function requestCurl()
{
    $start_time = microtime(TRUE);
    $webSiteUrl = 'http://xxx.com/api/test';

    $arrUrl = [
        $webSiteUrl . '?request_id=0',
        $webSiteUrl . '?request_id=1',
        $webSiteUrl . '?request_id=2',
        $webSiteUrl . '?request_id=3',
        $webSiteUrl . '?request_id=4',
        $webSiteUrl . '?request_id=5',
        $webSiteUrl . '?request_id=6',
        $webSiteUrl . '?request_id=7',
        $webSiteUrl . '?request_id=8',
        $webSiteUrl . '?request_id=9',
    ];


//1 创建批处理cURL句柄
    $chHandle = curl_multi_init();
    $chArr = [];
//2.创建多个cURL资源
    foreach ($arrUrl 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 - $start_time);
}
 public function test()
    {
        $request_time = date('is');
        sleep(10);
        $str = isset($_GET['request_id']) ? $_GET['request_id'] : 'xxxx';
        logToMe($str . '   ' . $request_time . '   ' . date('is'));
        echo getTimeString();
    }

但是上面的 curl 会在1S 后就结束,如果使用浏览器,关闭浏览器,让程序继续执行.
这个取决于 ignore_user_abort 参数的配置,在 php.ini 大概 336 行 ;ignore_user_abort = On。但是我并没有开启这个,不知道为什么关闭浏览器,也是可以继续执行

上一篇下一篇

猜你喜欢

热点阅读