php使用puppeteer的idle_timeout設置超時時間不生效

今天使用 queryList的puppeteer插件(實際也就是nesk/puphpeteer) ,發現時間超過60秒後就拋異常,使用設置idle_timeout、timeout參數貌似都沒有生效

$ql->chrome(function ($page,$browser) {...}, [
    'idle_timeout' => 0, //值也嘗試過不用0,設置成1000000也無效,到時間就退出了
    'timeout' => 0,
])

報錯如下:

The idle timeout (60.000 seconds) has been exceeded. Maybe you should increase the "idle_timeout" option.

經嘗試,問題已解決。配置項在options這裏設置本身就不生效,需要在實例化puppteer對象時傳遞給構造函數。

個人處理過程如下,供同學們參考:

嘗試1

首先根據nesk/puphpeteer的readme介紹中提到This will create a new Node process controlled by PHP.,是創建一個由php控制的node進程,那麼初步懷疑是否存在socket通信超時問題,於是到php.ini文件中找到

; Default timeout for socket based streams (seconds)
; http://php.net/default-socket-timeout
default_socket_timeout = 60

修改時間,無效, PASS!

嘗試2

不再使用quryList,直接使用nesk/puphpeteer試試idle_timeout參數是否生效

use Nesk\Puphpeteer\Puppeteer;

$puppeteer = new Puppeteer;
$browser = $puppeteer->launch([
    'idle_timeout' => 1000000, //超時時間,因爲不確定是秒還是毫秒,所以設置的大了點
    'headless' => false
]);
$page = $browser->newPage();
$page->goto('https://example.com');

sleep(100); // 等100秒

$browser->close();

結果,也無效,PASS!

嘗試3

在實例化Puppeteer時向構造函數傳遞idle_timeout設置項,而不再通過launch設置。

use Nesk\Puphpeteer\Puppeteer;

$puppeteer = new Puppeteer([
    'idle_timeout' => 1000000 //超時時間,因爲不確定是秒還是毫秒,所以設置的大了點
]);
$browser = $puppeteer->launch([
    'headless' => false
]);
$page = $browser->newPage();
$page->goto('https://example.com');

sleep(100); // 等100秒

$browser->close();

OK,生效

done

因此,我在queryList依賴包文件 jaeger/querylist-puppeteer/Chrome.php 中修改了超時時間(當然不推薦這樣做,不過我圖快且非正式項目,無所謂)

public static function render(QueryList $queryList,$url,$options)
 {
        $options = self::mergeOptions($options);
        $puppeteer = new Puppeteer(['idle_timeout' => 3600]);
        ...
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章