Как известно, в PHP есть несколько способов запустить внешнюю команду: exec, system, shell_exec, etc. А есть ли способ сделать так, чтобы запущенная внешняя команда осталась работать после завершения скрипта, её запустившего?
Конечно можно. Хоть раз в 1 сек заставить "постоянно работать". Всегда можно погуглить, PHP DAEMON. Пример сюда не буду приводить, извини, лень.
Ага, именно вот прям батник. Ещё можно кроном запустить, чё. Не, через жопу можно, это понятно. Вопрос был -- как оно задумано. Кажется, что никак. Поэтому, видимо, под RedHat-based системами достаточно &, а под Debian-based нужно ещё и nohup. Но я не уверен, ибо у меня нет ничего RedHat-based, чтобы проверить. А я надеялся, что PHP всё сделает за меня. Облом.
то что работает у меня PHP: passthru('(/usr/local/bin/php -f ./setOrganic.php start &) >> /dev/null 2>&1'); ... exit; вызов завершается, а обработка продолжается
К команде нужно дописать & > /dev/null 2> /dev/null и она будет работать хоть вечность. И это фишка не пхп, а линукса. --- Добавлено --- Никакие функции кстати использовать не обязательно. Если цель как нибудь выполнить команду, можно её просто прямо в коде взять в амперсанды `
Нашел в комментариях к официальной документации PHP по какой-то функции Код (Text): function isWindows() { return substr(php_uname(), 0, 7) == "Windows"; } function execInBackground($cmd) { if (isWindows()) { pclose(popen("start /B " . $cmd, "r")); } else { // "/dev/null &" execute in background exec($cmd . " > /dev/null &"); } }
Да что-ж никто тему не читает?! Все писатели, ять. Ответ уже был дан, в сообщении № 5. Так что: Чувак, ты не въезжаешь. Так же как и все остальные придурки, начиная с модератора. Повторю сообщение №5, чисто чтоб все поняли: если просто добавить & в конце команды, то команда будет, конечно, исполняться в фоне, но будет убита с завершением процесса php, её запустившего. Чтобы совсем оторвать процесс от предка, нужно использовать nohup. Тогда процесс php может завершиться, но запущенная из него команда продолжит работать.
не будет. Пишем скрипт 1.php: PHP: <?php `php 2.php >/dev/null 2>/dev/null &`; for ($i = 10; $i; $i--) { echo $i; sleep(1); } пишем скрипт 2.php: PHP: <?php for ($i = 0; $i < 15; $i++) { file_put_contents('log.txt', $i, FILE_APPEND); sleep(1); } запускаем Код (Text): [root@server tmp]# php 1.php далее либо смотрим, как цикл досчитает до 1, либо убиваем его по Ctrl+C. В любом случае через 15 секунд, содержимое файла log.txt: Код (Text): 01234567891011121314 Среда CentOS 7.9 без тюнинга. Ответы @DlTA @Batman и мой абсолютно правильные. С огромным любопытством жду описания обстоятельств, при которых может возникнуть описаная @Satger ситуация, иначе вся тема будет расценена как троллинг. Здесь некоторые возможно написали демонов больше чем ТС строк кода, это надо учитывать прежде чем обвинять кого-то в некомпетентности.
На Ubuntu 20.04.3 LTS результат тот же Возможно на каких-то специфичных сборках результат другой. На нормальных системах nohup отсоединяет процесс от пользовательской сессии, а не от родительского процесса. Но ТС подробностей так и не предоставил, а потому отправляется в заслуженный бан за троллинг и нарушения пункта 1.1 правил Правила форума | Форум PHP Программистов | PHP.ru (в контексте пункта 1.2)