puppeteer / chromium:处理崩溃的内存重页?

时间:2018-01-17 09:20:41

标签: chromium puppeteer

我有以下代码:

puppeteer.launch().then(async browser => {
    for (let id of ids) {
        try {
            const page = await browser.newPage();
            //const url = 'chrome://crash';
            await page.goto(url + id)
            await page.waitFor(5000);
            await page.screenshot({
                path: path.join(__dirname, "../public/images/screenshots/" + id + ".png"),
                clip: { x: 10, y: 70, width: 780, height: 470}
            });
        } catch (error) {
            console.log('Exception', id, error.message);
            page.close();
        }
    };
    browser.close();
});

它通常可以正常工作,但我遇到了某个特定页面的问题(遗憾的是我无法分享的网址)。

此页面尝试加载GB数据​​并导致Chrome崩溃,因此我猜它会导致Chromium崩溃。

我在此页面中看到的错误是:Exception 6766 Navigation Timeout Exceeded: 30000ms exceeded。这很好,但它似乎没有停止在这一点 - 它导致我的整个服务器挂起,我想是因为它试图在操作系统级别使用太多内存。

如何阻止我的服务器挂起并妥善处理?是否有我可以提供给Chromium的标志来限制使用的内存并优雅地放弃?我也不确定我的错误处理是否正确,所以任何提示都会受到赞赏。

2 个答案:

答案 0 :(得分:3)

一些想法:

首先,这可能与您的初始问题无关,但它会节省一些内存。你打开很多标签(页面)而不关闭它们,如果你的ID列表很长,可能会占用大量内存。

尝试通过加载新网址而不是创建新网页来迭代ID。

此外,您可以延长超时时间,以检查是否有更多时间可以完成此操作。

启动puppeteer时可以传递铬标记。这是完整的Chromium switch list

您可以尝试使用:int[] ids = AppWidgetManager.getInstance(Context.getApplication()).getAppWidgetIds(new ComponentName(Context.getApplication(), Widget.class)); Widget myWidget = new Widget(); myWidget.onUpdate(Context, AppWidgetManager.getInstance(Context),ids); --unlimited-storage

这也可以用来调试:--force-gpu-mem-available-mb

您可以在那里搜索所有其他与内存相关的标志。

以下是你如何将旗帜传递给木偶戏,以及我提到的其他建议:

--full-memory-crash-report

答案 1 :(得分:2)

尝试传递{args: ['--disable-dev-shm-usage']}启动选项launch()命令 - 这是supposed to improve Puppeteer's ability to render large/complex pages