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

Как в консоли php запустить процесс nodejs и дождатся его завершения?

Собственно вопрос, даже не знаю к кому, то ли к Nodерам то ли к PHPникам
Чувак написал небольшой сервис на nodejs с кукловодом.
const puppeteer = require('puppeteer-extra');
var argv = process.argv
var fs = require('fs');
let file_map = argv[2];
let file_list = JSON.parse(fs.readFileSync(file_map, 'utf8'));

async function main() {
    let browser = await puppeteer.launch({
        headless: true,
        args: [
            '--window-size=1200,1400',
            '--window-position=000,000',
            '--no-sandbox',
            '--disable-dev-shm-usage',
            '--disable-web-security',
            '--disable-features=IsolateOrigins',
            '--disable-site-isolation-trials'
        ]
    })
    for (const temp_file of file_list) {
        console.log('file://'+temp_file);
        let page = await browser.newPage();
        await page.goto('file://'+temp_file);
        let body_processed = await page.evaluate(() => document.documentElement.innerHTML);
        await page.close();
        fs.writeFileSync(temp_file,'<html>'+body_processed+'</html>')
    }
    await browser.close();
}

main().catch((e) => {
    throw e
})


Мне надо из консоли в PHP стартануть его, и подождать пока он завершится.
Не чего получать от него не надо, но важно дождаться окончания его работы.
Код запуска не хитер:
$escaped_command = escapeshellcmd('/usr/bin/nodejs /home/master/tester/main.js '.$file_map);
shell_exec($escaped_command); // exec($escaped_command);  тоже пробовал


Если запускать руками то что в $escaped_command работает на ура.
Если запускаю из консольного PHP скрипт завершается через секунду. (хотя время работы node где то сек 40 )
Я с начало подумал что shell_exec или exec просто кидает процесс в фон и не ждет ответа, но свершись документацией понял что это не так.
Проверил документацию сделав
shell_exec('ping google.com')
Действительно shell_exec ждет когда ping завершится.
Собственно не очень понятно как его запустить, и почему node сразу завершает процесс...
Какие идеи?

UPDATE:

Сделал
dump(shell_exec($escaped_command));

Вижу console.log который нода выводит но завершается слишком быстро.
  • Вопрос задан
  • 164 просмотра
Подписаться 1 Средний 1 комментарий
Решения вопроса 1
@MasterCopipaster Автор вопроса
Короче разобрался, дело не в ноде и не в PHP, а в криво настроенной оболочке.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
parce56
@parce56
Системный аналитик
Скорее всего дело в том, функция main() выполняется асинхронно и скрипт не дожидается выполнения промиса. Не уверен, что сработает, но можно попробовать бахнуть что-то вроде
main().catch((e) => {
    throw e
}).finally(() => console.log('done'))
Ответ написан
Ваш ответ на вопрос

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

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