PHP запускает неблокирующий системный вызов

Как я могу запустить неблокирующий системный вызов в PHP?

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

Мои две мысли о решении:

1: существует собственный метод/параметр для выполнения системного вызова без блокировки

2: Запустите system() в новой программе C++, которая затем разветвится и запустит фактический php-скрипт в sep. нить

Есть ли собственный метод выполнения системных вызовов неблокирующим образом или мне нужно обойти это...

В настоящее время у меня есть shell_exec('nohup php/path/to/file.php &'), но он все еще держится


person Atticus    schedule 04.09.2011    source источник
comment
Пробовали ли вы передавать stdout и stderr в файлы или /dev/null? Я думаю, что nohup справится с этим, но попробовать стоит.   -  person Corbin    schedule 05.09.2011
comment
Crontabs, вероятно, то, что вы ищете. Кронтаб PHP   -  person adlawson    schedule 05.09.2011
comment
Если бы я искал Crontabs, я бы использовал их. Я запускаю порождение фоновых процессов, которые передают твиты в файлы данных, а потребитель получает их и распространяет на моем сайте. Не заинтересован в ретрансляции множества пингов через crontab, нужно открытое соединение.   -  person Atticus    schedule 05.09.2011
comment
@Corbin, да, спасибо, приятель, в итоге я сделал это, и это позволило мне двигаться дальше :)   -  person Atticus    schedule 05.09.2011


Ответы (1)


Из руководства по PHP:

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

Пример приведен в комментарии на той же странице (на основе Linux):

Если вы хотите запустить процесс php, который продолжает работать независимо от apache (с другим родительским pid), используйте nohub. Пример:

exec('nohup php process.php > process.out 2> process.err ‹ /dev/null &');

person etuardu    schedule 04.09.2011
comment
если у меня нет process.out... могу ли я вывести его в /dev/null? - person Atticus; 05.09.2011
comment
Эта строка означает: поместите вывод (stdout) nohup php process.php в файл с именем process.out, его поток ошибок (stderr) в другой файл с именем process.err и возьмите нулевой поток /dev/null в качестве ввода (stdin). Вы можете найти более подробную информацию о перенаправлении ввода-вывода в bash здесь: tldp.org/ LDP/abs/html/io-redirection.html. - person etuardu; 05.09.2011
comment
Обратите внимание, что в цитируемом тексте есть опечатка - @all, убедитесь, что вы используете nohup, а не nohub. - person rinogo; 02.08.2017