Как выполнить команду оболочки с использованием PHP без ожидания результата (асинхронного) в средах Linux и Windows

Во многих случаях вы предпочитаете выполнять сценарий php с консоли вместо пользовательского интерфейса, но в некоторых случаях использование пользовательского интерфейса является единственным способом, как и клиент, запускающий действие.

Возможно, вы уже знаете, как выполнить задачу bash с использованием PHP, но что, если ваша задача слишком тяжелая и ее выполнение занимает слишком много времени? Никто не хочет видеть индикатор прогресса в течение часа, ожидая ответа от сервера … по крайней мере, не с делами работы.

В этом случае вы захотите проигнорировать вывод и позволить вашей задаче работать в фоновом режиме. Для достижения нашей цели нам нужно использовать system функция в окнах и shell_exec функция для Ubuntu и Linux.

shell_execute: выполняет команду через оболочку и возвращает полный вывод в виде строки (но в этом случае это будет предотвращено).

Система: Запустите внешнюю программу и отобразите вывод (и ни в этом случае).

Обе функции позволяют вам что-то делать с командной строкой, однако мы не допустим, чтобы эти функции ожидали вывода на каждой платформе, используя простой прием.

Следующая функция позволит вам сделать трюк в большинстве случаев:

 NUL");
}else{
shell_exec("/usr/bin/nohup ".$comando." >/dev/null 2>&1 &");
}
}

Функция ожидает ввод оболочки в качестве первого параметра:

Важная заметка : в некоторых средах Linux или Windows вам нужно изменить кавычки ("" или же '' за ``), иначе команда не будет выполнена.

Важно знать, какую команду использовать на какой платформе, и перенаправить вывод на нее. Для окон использовать {command} > NUL и для Linux, Ubuntu /usr/bin/nohup {command here} >/dev/null 2>&1 & сделает свое дело.

Однако обратите внимание, что эта функция поможет вам с простыми командами, такими как php bin/console do:something Если ваши команды используют сложную структуру или содержат специальные символы, вы можете реализовать ее самостоятельно в соответствии со своими потребностями.

Следующий самописный фрагмент записывает файл в Windows из php с системной функцией и экранированием специальных символов благодаря escapeshellcmd функция:

Замечания : escapeshellcmd экранирует любые символы в строке, которые могут быть использованы, чтобы обмануть команду оболочки при выполнении произвольных команд.

 something that could'nt work in the command line  foo.txt`;
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
system($comando." > NUL");
}else{
shell_exec("/usr/bin/nohup ".$comando." >/dev/null 2>&1 &");
} 

Советы для рассмотрения

  • Проверьте вашу команду вживую в командной строке, чтобы увидеть, работает ли она одна, если она работает, то она будет работать с функцией.
  • Этот метод пригодится, если вам нужно выполнить длинные задачи, и пользователь может не захотеть ждать или видеть прогресс.
  • Если вы используете команду для выполнения другой в PHP, не забудьте дать более высокий лимит времени с ini_set('max_execution_time', seconds) выполнения как для функции, так и для сценария, который будет выполняться в качестве ограничения времени по умолчанию, составляет 30 секунд.
  • Системные и shell_exec методы всегда рассчитывает на выход, нет никакого способа предотвратить это, однако мы используем этот трюк для перенаправления нулевого вывода для каждой платформы.

Повеселись !

Ссылка на основную публикацию
Adblock
detector