Обрабатывать параллельные запросы кукловода через php - PullRequest
0 голосов
/ 29 апреля 2019

Я создаю веб-приложение, которое извлекает динамически генерируемый контент через кукловода.Я установил (apache + php) докер-контейнеры, один для проекта p5js, который генерирует svg на основе (большого, 2 МБ) файла json, и один контейнер с PHP, который извлекает этот svg.Dockers работает в конфигурации Nginx (nginx для маршрутизации, apache для более быстрой обработки PHP).Я использую самый дешевый сервер CENTOS, доступный на digitalocean.Обновление определенно поможет.

Я не хочу, чтобы javascript в проекте p5js был представлен общественности, поэтому я подумал, что решение nodejs будет лучшим в этом сценарии.

Страница PHP делает shell_exec("node pup.js").В основном он работает примерно за 1-3 секунды, что идеально.

Проблема в том, что когда я пытаюсь протестировать многопользовательский сценарий и открываю 5 вкладок для запуска этой страницы PHP, время загрузки падает даже до 10+ секунд, чтоубивает для моего приложения.

Таким образом, вопрос заключается в том, как настроить эту архитектуру (вызов php командой узла) для многопользовательской среды.

===

Я пробовал несколько фреймворков, таких как рентген , кошмар , jsdom, cheerio, axios , зомби , фантом просто пытаетсязаменить кукловод.Некоторые из фреймворков ничего не возвращали, некоторые просто не сработали для меня.Я думаю, что мне просто нужно безголовое браузерное решение, чтобы иметь возможность выполнять p5js.В конце концов кукловод выполняет свою работу, но не в многопользовательской среде (я думаю, что из-за моей нынешней архитектуры кукловода php shell_exec).

Возможно, мой рабочий процесс shell_exec был узким местом, поэтому я в итоге создал простой node example.js, который ждет 5 секунд до финиша (без использования кукловода), и я выполнил это с несколькими вкладками одновременно, работает как шарм.Все вкладки загружаются примерно через 5-6 секунд.

Я также пытался pm2 проверить, было ли узкое место моей командой узла, я провел некоторое тестирование в командной строке, но без существенных результатов, и я не смог 'Я не смог заставить PHP запустить команду pm2, поэтому я отбросил этот тест.

Я попытался установить PuPHPeteer up, но не смог запустить его.

Когда-то я думал, что это как-то связано с несколькими запущенными браузерами кукловодов, но я читал, что с этим проблем не должно быть.

PHP выглядит так:

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

Мой кукловодcode:

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 и возвращает svg на основе локального сайта p5js, ноне сейчас (пока), если это будетбыть другим.

ОБНОВЛЕНИЕ

Так что, благодаря некоторым комментариям, я попробовал новый подход: не использование p5js, а собственный код обработки (java).Я экспортировал код обработки в 64-битное приложение linux и создал этот маленький пример 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);

};

Когда я вызываю этот узел example.js внутри shell_exec в PHP, я получаю следующее: enter image description here

Первый звонок занимает около 2 секунд.Но когда я получаю много обновлений, время снова увеличивается на много секунд.Итак, ясно, что мое понимание многопоточности не так уж хорошо, или я упустил что-то важное в моем тестировании?

...