Querylist批量采集碰到404咋办

1、tp框架搭配querylist 使用CurlMulti插件 多线程执行后在执行一段时间后出现404

2、环境 php nginx mysql 数据量不小(本来用的apache,后来动不动服务器500,代码超时时间都设置了,不行就切换nginx)

3、相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)
如下如果这个url 404 那么往后就不执行了 其实我加了判断来着

public function makeids()
    {
        $index = input('param.index');//接收id用于半自动采集
        $last = input('param.last');//接收id用于半自动采集
        set_time_limit(3600);
        $urlmake = [];
        $ql = QueryList::getInstance();
        for ($i = $index; $i <=$last; $i++) {
            for ($j = $i . '000'; $j <= $i . '999'; $j++) {
                if (ISCESHI){
                    $url = LOCALURL."/index.php/index/index/getlists/id/" . $i . '_' . $j;
                }else{
                    $url = SERVICE."/index.php/index/index/getlists/id/" . $i . '_' . $j;
                }
                $urlmake [] = $url;
                if(count($urlmake)>=5){
                    $ql->use(CurlMulti::class);
                    $ql->curlMulti($urlmake)
                        ->success(function (QueryList $ql, CurlMulti $curl, $r) {
                            echo "Current url:{$r['info']['url']} \r\n";
                            //                if (!empty($r)){
                            $this->getlists($r['info']['url']);
                            //                }
                            unset($urlmake);
                            $ql->destruct();
                        })
                        ->start([
                            // 最大并发数,这个值可以运行中动态改变。
                            'maxThread' => 1999,
                            // 触发curl错误或用户错误之前最大重试次数,超过次数$error指定的回调会被调用。
                            'maxTry' => 3,
                            // 全局CURLOPT_*
                            'opt' => [
                                CURLOPT_TIMEOUT => 3600,
                                //                    CURLOPT_CONNECTTIMEOUT => 1,
                                CURLOPT_CONNECTTIMEOUT => 0,
                                CURLOPT_RETURNTRANSFER => true
                            ],
                            // 缓存选项很容易被理解,缓存使用url来识别。如果使用缓存类库不会访问网络而是直接返回缓存。
                            'cache' => ['enable' => false, 'compress' => false, 'dir' => null, 'expire' => 86400, 'verifyPost' => false]
                        ]);
                }
            }
        }
    }

这里 采集结果非空的时候

$result = $data->all();
                if (!empty($result)) {
                    xx这里执行相关代码
                }

4、我希望有懂得人能帮我看看咋回事。希望的结果就是假如出现了404 或者其他一些无响应的异常 线程不中断继续执行其他url;

阅读 2.3k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题