我正在构建一个web应用程序,通过木偶师检索动态生成的内容。我已经设置了(apache + php)停靠容器,其中一个用于基于(大型,2MB) json文件生成svg的p5js项目,以及一个带有PHP检索该svg的容器。Dockers在Nginx配置中运行(nginx用于路由,apache用于更快的PHP处理)。我在使用数字海洋上最便宜的CENTOS服务器。所以升级肯定会有帮助。
我不希望p5js项目中的javascript向公众公开,所以我认为nodejs解决方案在这个场景中最好。
PHP页面执行一个shell_exec("node pup.js")。它基本上运行在大约1-3秒,这是完美的。
问题是,当我尝试测试一个多用户场景并打开5个选项卡来运行这个PHP页面时,加载时间会下降到甚至10+秒,这对我的应用程序来说是致命的。
因此,问题在于如何为多用户环境设置此体系结构(php调用节点命令)。
===
我尝试过几个框架,如X射线、噩梦、jsdom、cheerio、axios、僵尸、幻影,只是试图取代木偶师。有些框架没有返回任何内容,有些只是没有对我起作用。我想我只需要一个无头浏览器解决方案,才能执行p5js。最终木偶师完成了任务,只是没有在一个多用户环境中完成(我认为由于我目前的php shell_exec木偶师架构)。
也许我的shell_exec工作流是瓶颈,所以我最终构建了一个简单的node example.js,它在完成之前等待5秒(不使用木偶师),并且我同时运行了几个选项卡,工作起来很有魅力。所有标签在5-6秒内加载。
我还尝试了pm2来测试我的节点命令是否是瓶颈,我在命令行上做了一些测试,没有什么主要结果,我无法让pm2运行一个pm2命令,所以我放弃了这个测试。
我尝试过设置PuPHPeteer,但无法让它运行。
有一段时间,我认为这与启动多个木偶浏览器有关,但我读到过,这应该没什么问题。
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基础结构上花费了这么多时间,我真的很想得到一些建议:)
由于我完全控制了目标和目标站点,一个brainfart就是让节点服务于接受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中的一个example.js中调用这个节点shell_exec时,我得到如下信息:

第一个电话大约需要2秒。但是当我恢复精力的时候,时间又增加了很多秒。所以,很明显,我对多线程的理解不是很好,还是我在测试中遗漏了一些关键的东西?
发布于 2019-09-08 10:47:31
我有一个和你相似的装置。最大的问题是你的水滴。您应该至少使用最便宜的CPU优化液滴(从内存每月40美元)。DO上最便宜的通用液滴是在一个共享的环境中(吵闹的邻居造成性能的波动)。您可以轻松地通过创建服务器快照和克隆驱动器来测试这一点。
接下来,正如其他人所建议的,是减少寒冷的开始。在我的服务器上,冷启动会增加大约2秒。在打开一个新浏览器之前,我会拍10张截图。除此之外,您可能会遇到内存问题。
发布于 2022-04-10 16:43:18
如果您试图使用带php的傀儡,您应该使用确保安装了composer,而在项目文件夹中打开终端窗口和类型composer要求nesk/puphpeteer也安装nesk/rialto,然后要求自动加载所有应该工作的东西。当使用木偶师设置const时,有一件事是使用$并跳过使用等待命令加替换“。用->
<?php
require 'vendor/autoload.php';
use Nesk\Puphpeteer\Puppeteer;
use Nesk\Rialto\Data\JsFunction;
$puppeteer = new Puppeteer;
$browser = $puppeteer->launch(['headless'=>false,'--proxy-server=000.00.0.0:80']);// Type Proxy
$bot = $browser->newPage();
$data = $bot->evaluate(JsFunction::createWithBody('return document.documentElement.innerHTML'));
$urlPath = $bot->url();
$bot->goto('https://google.com');//goes to google.com
$bot->waitForTimeout(3000);// waits
$bot->type('div', '"cellphonemega"');//searches
$bot->keyboard->press('Enter');//presses enter
$bot->waitForTimeout(8000);//waits
$bot->click('h3', 'https:');//clicks webpage
$bot->waitForTimeout(8000);//waits while site loads
$bot->screenshot(['path' => 'screenshot.png']);// TAKES SCREENSHOT!
$browser->close();//Shuts Downhttps://stackoverflow.com/questions/55901191
复制相似问题