我正在构建一个通过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-ray,nightmare,jsdom,cheerio,axios,zombie,幻影,它们只是试图替换木偶。有些框架什么也没有返回,有些只是对我没有用。我想我只需要一个无头的浏览器解决方案,就能执行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时,得到以下信息:
首次通话大约需要2秒钟。但是当我进行大量刷新时,时间又增加了很多秒。因此,很明显,我对多线程的理解不是很好,还是我在测试中缺少一些关键的东西?
答案 0 :(得分:0)
我有一个与您相似的设置。最大的问题是您的液滴。您应该至少使用最便宜的CPU优化液滴(每月从内存中获得40美元)。 DO上最便宜的通用液滴位于共享环境中(嘈杂的邻居会造成性能波动)。您可以通过制作服务器快照并克隆驱动器来轻松地进行测试。
接下来有人建议减少冷启动。在我的服务器上,冷启动增加了大约2秒钟的时间。在打开新的浏览器之前,我拍摄了10张屏幕截图。除此之外,您可能会遇到内存问题。