@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)
)
  • Вопрос задан
  • 113 просмотров
Пригласить эксперта
Ответы на вопрос 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, там скорее всего будет описание ошибки, которая происходит
Ответ написан
может лучше скрипт node.js оформить как микросервис?
и из PHP общаться с ним по API (REST API)
PS: закрыть извне доступ на порт микросервиса, либо прикрутить авторизацию.
так же в таком случае основное приложение и микросервис можно разнести на разные сервера.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Vigrom Москва
До 150 000 руб.
SaveTime Москва
от 100 000 руб.
от 60 000 до 80 000 руб.
14 нояб. 2019, в 08:31
1500 руб./за проект
14 нояб. 2019, в 08:04
2000 руб./за проект
14 нояб. 2019, в 06:34
5000 руб./за проект