通过php

时间:2019-04-29 10:11:26

标签: php node.js puppeteer shell-exec

我正在构建一个通过puppeteer检索动态生成的内容的Web应用程序。我已经设置了(apache + php)docker容器,一个用于p5js项目,该容器基于一个(大的2MB)json文件生成svg,一个用于PHP的容器则可以检索该svg。 Dockers在Nginx配置中运行(nginx用于路由,apache用于更快的PHP处理)。我正在使用digitalocean上最便宜的CENTOS服务器。因此,升级将对definitley有所帮助。

我不希望p5js项目中的javascript公开,因此我认为在这种情况下,最好使用nodejs解决方案。

PHP页面执行shell_exec("node pup.js")。它基本上可以在大约1-3秒内运行,这是完美的。

问题是,当我尝试测试多用户方案并打开5个选项卡以运行此PHP页面时,加载时间下降到10+秒,这对我的应用程序来说是致命的。

所以问题将是如何为多用户环境设置这种架构(php调用node命令)。

===

我尝试了几种框架,例如x-raynightmare,jsdom,cheerio,axioszombie,幻影,它们只是试图替换木偶。有些框架什么也没有返回,有些只是对我没有用。我想我只需要一个无头的浏览器解决方案,就能执行p5js。最终puppeteer完成了工作,但仅在多用户环境中才完成(我认为由于我目前的php shell_exec puppeteer体系结构)。

也许我的shell_exec工作流程是瓶颈,所以我最终构建了一个简单的node example.js,它在完成之前等待了5秒钟(不使用操纵up),并且我同时运行了几个选项卡,就像一个魅力。所有标签页的加载时间约为5-6秒。

我也尝试过pm2来测试我的节点命令是否是瓶颈,我在命令行上做了一些测试,没有重大结果,而且我无法让PHP运行pm2命令,所以我放弃了此测试。

我尝试设置PuPHPeteer,但无法使其运行。

有时候,我认为这与启动多个操纵up的浏览器有关,但我读到这应该没问题。

PHP看起来像:

<?php
$puppeteer_command = "node /var/www/pup.js >&1";
$result = shell_exec($puppeteer_command);
echo $result;
?>

我的木偶代码:

const puppeteer = require('puppeteer');

let url = "http://the-other-dockercontainer/";
let time = Date.now();

let scrape = async () => {
    const browser = await puppeteer.launch({
        args: ['--no-sandbox']
    });
    const page = await browser.newPage();
    await page.goto(url);

    await page.waitForSelector('svg', { timeout: 5000 });
    let svgImage = await page.$('svg');
    await svgImage.screenshot({
        path: `${time}.png`,
        omitBackground: true,
    });

    await browser.close();
    return time;
}

scrape().then((value) => {
    console.log(value); // Success!
});

如果这是最好的解决方案,我正在考虑在nodejs中构建整个应用程序,但是我已经在这个PHP基础架构中投入了很多时间,我真的很想获得一些建议:)

由于我可以完全控制目标站点和目标站点,因此一个脑力激荡是让节点为服务器提供服务,该服务器接受json文件并根据本地p5js站点返回svg,但是现在(还)不要会有所不同。

更新

因此,感谢一些评论,我尝试了一种新方法:不使用p5js,而是使用本机处理代码(java)。我已经将处理代码导出到Linux 64位应用程序,并创建了这个小nodejs示例:

var exec = require('child_process').exec;

var cmd = '/var/www/application.linux64/minimal';
exec(cmd, processing);

// Callback for command line process
function processing(error, stdout, stderr) {

  // I could do some error checking here
  console.log(stdout);

};

当我在PHP的shell_exec中调用该节点example.js时,得到以下信息: enter image description here

首次通话大约需要2秒钟。但是当我进行大量刷新时,时间又增加了很多秒。因此,很明显,我对多线程的理解不是很好,还是我在测试中缺少一些关键的东西?

1 个答案:

答案 0 :(得分:0)

我有一个与您相似的设置。最大的问题是您的液滴。您应该至少使用最便宜的CPU优化液滴(每月从内存中获得40美元)。 DO上最便宜的通用液滴位于共享环境中(嘈杂的邻居会造成性能波动)。您可以通过制作服务器快照并克隆驱动器来轻松地进行测试。

接下来有人建议减少冷启动。在我的服务器上,冷启动增加了大约2秒钟的时间。在打开新的浏览器之前,我拍摄了10张屏幕截图。除此之外,您可能会遇到内存问题。