QueryList icon indicating copy to clipboard operation
QueryList copied to clipboard

Fatal error: Uncaught TypeError: Argument 1 passed to QL\Services\MultiRequestService::QL\Services\{closure}() must be an instance of GuzzleHttp\Exception\RequestException, instance of GuzzleHttp\Exception\ConnectException given

Open jsonhet opened this issue 1 year ago • 2 comments

我在使用QueryList::rules($rules)->multiGet是总是会得到这个报错,但为什么使用try catch却无法捕获到它,这样会导致程序直接崩溃。 Fatal error: Uncaught TypeError: Argument 1 passed to QL\Services\MultiRequestService::QL\Services{closure}() must be an instance of GuzzleHttp\Exception\RequestException, instance of GuzzleHttp\Exception\ConnectException given in D:\phpstudy\WWW\wpblog\wp-content\plugins\seekhub-collector\vendor\jaeger\querylist\src\Services\MultiRequestService.php:56 Stack trace: #0 [internal function]: QL\Services\MultiRequestService->QL\Services{closure}(Object(GuzzleHttp\Exception\ConnectException), 7, Object(GuzzleHttp\Promise\Promise)) #1 D:\phpstudy\WWW\wpblog\wp-content\plugins\seekhub-collector\vendor\guzzlehttp\promises\src\EachPromise.php(192): call_user_func(Object(Closure), Object(GuzzleHttp\Exception\ConnectException), 7, Object(GuzzleHttp\Promise\Promise)) #2 D:\phpstudy\WWW\wpblog\wp-content\plugins\seekhub-collector\vendor\guzzlehttp\promises\src\Promise.php(204): GuzzleHttp\Promise\EachPromise->GuzzleHttp\Promise{closure}(Object(GuzzleHttp\Exception\ConnectException)) #3 D:\phpstudy\WWW\wpblog\wp-content\plugins\seek in D:\phpstudy\WWW\wpblog\wp-content\plugins\seekhub-collector\vendor\jaeger\querylist\src\Services\MultiRequestService.php on line 56

jsonhet avatar Aug 10 '22 17:08 jsonhet

之前以为是没传类型的问题,修改后发现问题还是会出现 相关代码:` use QL\QueryList; use GuzzleHttp\Psr7\Response;

use Fukuball\Jieba\Jieba; use Fukuball\Jieba\Finalseg;

    QueryList::rules($rules)->multiGet($urls)
    ->concurrency(5)    // 设置并发数
    ->withOptions(['verify'  => false])
    ->success(function(QueryList $ql, Response $res, $index) use ($rules, $task, $urls){
        $images = array();
        $url = $urls[$index];
        
        try{
            SH_Log::insert($task['id'], '数据爬取成功,处理中。url:'.$url);
        
            // 爬取图片
            if(isset($rules['image'])){
                if(self::isWeichatPost($url)){
                    $rules['image'][1] = 'data-src';
                }

                $images = $ql->find($rules['image'][0])->attrs($rules['image'][1])->all(); 
            }

            // 获取结果
            $data = $ql->rules($rules)->query()->getData()->all();
            $data['url'] = $url;
            
            
            if(!$this->filterCollectorResult($task, $data)){
                SH_Data::deleteByUrl($url);
                $this->filterFail ++;
            }else{
                $this->saveJiebaSpitWord($data);
                $this->saveCollectorResult($task, $data, $images, $rules, $url);                
            }
            
            // 最后一个任务url爬取完毕时
            if($index+1 == count($urls)){
                if($task['run_type'] == 'manual') SH_Task::setTaskStateById($task['id'], false);
                return $this->setSuccessResult($task, count($urls));
            }                          
        }catch(Exception $e){
            SH_Log::insert($task['id'], 'ERROR: 数据爬取失败,'.$e->getMessage());
        }
    })
    ->error(function(QueryList $reason, Exception $err){
        // var_dump($reason, $err);
        SH_Log::insert($task['id'], "ERROR: 数据爬取失败,$url ".$err->getMessage());
    })
    ->send();`

jsonhet avatar Aug 25 '22 16:08 jsonhet

src/Services/MultiRequestService.php

line 55, 这里应该是 GuzzleException

    public function error(Closure $error)
    {
        $this->multiRequest = $this->multiRequest->error(function(GuzzleException $reason, $index) use($error){
            $error($this->ql,$reason, $index);
        });
        return $this;
    }

yangfancn avatar May 31 '23 03:05 yangfancn

已修复

jae-jae avatar Apr 15 '24 02:04 jae-jae