今天使用 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]);
...
}