首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过php处理并发傀儡请求

通过php处理并发傀儡请求
EN

Stack Overflow用户
提问于 2019-04-29 10:11:25
回答 2查看 2.4K关注 0票数 1

我正在构建一个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看起来像:

代码语言:javascript
复制
<?php
$puppeteer_command = "node /var/www/pup.js >&1";
$result = shell_exec($puppeteer_command);
echo $result;
?>

我的木偶师代码:

代码语言:javascript
复制
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示例:

代码语言:javascript
复制
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秒。但是当我恢复精力的时候,时间又增加了很多秒。所以,很明显,我对多线程的理解不是很好,还是我在测试中遗漏了一些关键的东西?

EN

回答 2

Stack Overflow用户

发布于 2019-09-08 10:47:31

我有一个和你相似的装置。最大的问题是你的水滴。您应该至少使用最便宜的CPU优化液滴(从内存每月40美元)。DO上最便宜的通用液滴是在一个共享的环境中(吵闹的邻居造成性能的波动)。您可以轻松地通过创建服务器快照和克隆驱动器来测试这一点。

接下来,正如其他人所建议的,是减少寒冷的开始。在我的服务器上,冷启动会增加大约2秒。在打开一个新浏览器之前,我会拍10张截图。除此之外,您可能会遇到内存问题。

票数 0
EN

Stack Overflow用户

发布于 2022-04-10 16:43:18

如果您试图使用带php的傀儡,您应该使用确保安装了composer,而在项目文件夹中打开终端窗口和类型composer要求nesk/puphpeteer也安装nesk/rialto,然后要求自动加载所有应该工作的东西。当使用木偶师设置const时,有一件事是使用$并跳过使用等待命令加替换“。用->

代码语言:javascript
复制
<?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 Down
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55901191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档