美文网首页
PHP 请求长时间的程序

PHP 请求长时间的程序

作者: 云龙789 | 来源:发表于2021-11-21 19:02 被阅读0次

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

    • 场景
      有一个被请求的程序处理时间很长,比如需要60S a.php,所以我使用了 curl 的并发请求

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

     1. curl_setopt($curl, CURLOPT_TIMEOUT, 1);     
    手册解释:允许 cURL 函数执行的最长秒数。
    我个人感觉是请求程执行的最长时间。被请求的程序需要10S,则这里需要大于10
    2. curl_setopt($curl, CURLOPT_CONNECTTIMEOUT , 1); 
    手册解释: 在尝试连接时等待的秒数。设置为0,则无限等待。
    
    • curl 并发代码
    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);
    }
    
    • 被请求的程序 a.php
     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。但是我并没有开启这个,不知道为什么关闭浏览器,也是可以继续执行

    相关文章

      网友评论

          本文标题:PHP 请求长时间的程序

          本文链接:https://www.haomeiwen.com/subject/rsjmtrtx.html