Задать вопрос
@tehnazavr

Как запустить nodejs скрипт через PHP exec?

Итак, имеется nodejs скрипт, который, используя selenium webdriver, запускает браузерный тест. Он нормально запускается из консоли. Но когда я пытаюсь запустить его из контроллера через exec или shell_exec, то получаю кучу ошибок, природу которых не совсем понимаю, так как упомянул уже ранее, что через терминал всё работает хорошо.

Код скрипта:
"use strict";

require('chromedriver');
const webdriver = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');

var browser = new webdriver.Builder().forBrowser('chrome')
            .setChromeOptions(new chrome.Options()
            	.addArguments('--no-sandbox')
            	.addArguments('--headless')
            	.addArguments('--disable-dev-shm-usage')
            	)
            .build();
browser.get('https://some_url.com');


Так запускаю скрипт в контроллере:
exec('/usr/bin/node ../../admin-test/test.js');

И сама ошибка, которая возникает при запуске:
Array
(
    [0] => /var/www/xxe.loc/admin-test/node_modules/selenium-webdriver/lib/promise.js:2626
    [1] =>         throw error;
    [2] =>         ^
    [3] => 
    [4] => WebDriverError: unknown error: Chrome failed to start: exited abnormally
    [5] =>   (unknown error: DevToolsActivePort file doesn't exist)
    [6] =>   (The process started from chrome location /opt/google/chrome/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
    [7] =>   (Driver info: chromedriver=77.0.3865.40 (f484704e052e0b556f8030b65b953dce96503217-refs/branch-heads/3865@{#442}),platform=Linux 4.19.36-1-MANJARO x86_64)
    [8] =>     at Object.checkLegacyResponse (/var/www/xxe.loc/admin-test/node_modules/selenium-webdriver/lib/error.js:546:15)
    [9] =>     at parseHttpResponse (/var/www/xxe.loc/admin-test/node_modules/selenium-webdriver/lib/http.js:509:13)
    [10] =>     at doSend.then.response (/var/www/xxe.loc/admin-test/node_modules/selenium-webdriver/lib/http.js:441:30)
    [11] =>     at processTicksAndRejections (internal/process/task_queues.js:86:5)
    [12] => From: Task: WebDriver.createSession()
    [13] =>     at Function.createSession (/var/www/xxe.loc/admin-test/node_modules/selenium-webdriver/lib/webdriver.js:769:24)
    [14] =>     at Function.createSession (/var/www/xxe.loc/admin-test/node_modules/selenium-webdriver/chrome.js:761:15)
    [15] =>     at createDriver (/var/www/xxe.loc/admin-test/node_modules/selenium-webdriver/index.js:170:33)
    [16] =>     at Builder.build (/var/www/xxe.loc/admin-test/node_modules/selenium-webdriver/index.js:642:16)
    [17] =>     at Object.<anonymous> (/var/www/xxe.loc/admin-test/test_lab.js:13:14)
    [18] =>     at Module._compile (internal/modules/cjs/loader.js:816:30)
    [19] =>     at Object.Module._extensions..js (internal/modules/cjs/loader.js:827:10)
    [20] =>     at Module.load (internal/modules/cjs/loader.js:685:32)
    [21] =>     at Function.Module._load (internal/modules/cjs/loader.js:620:12)
    [22] =>     at Function.Module.runMain (internal/modules/cjs/loader.js:877:12)
)
  • Вопрос задан
  • 1119 просмотров
Подписаться 2 Средний 10 комментариев
Пригласить эксперта
Ответы на вопрос 2
larisamoroz
@larisamoroz
Курю маны, втыкаю в код, ваяю, починяю.
1. Выполните с помощью exec d в php команду whoami:
exec('whoami', $output);
Посмотрите содержимое $output и убедитесь, что php запускается не из под вашего штатного пользователя, а от какого-то своего, который не имеет прав на запуск хрома

2. Перенаправьте вывод ошибок в stdout (2>&1) в вашей команде, которую вы передаёте exec:
exec('/usr/bin/node ../../admin-test/test.js 2>&1', $output);

И после выполнения посмотрите содержимое $output, там скорее всего будет описание ошибки, которая происходит
Ответ написан
erge
@erge
Примус починяю
может лучше скрипт node.js оформить как микросервис?
и из PHP общаться с ним по API (REST API)
PS: закрыть извне доступ на порт микросервиса, либо прикрутить авторизацию.
так же в таком случае основное приложение и микросервис можно разнести на разные сервера.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы