Как загнать процесс, вызываемый РНР скриптом, в бакграунд: так, чтоб нажал кнопку, запустил РНР скрипт и закрыл браузер, а РНР скрипт бы работал?
нужно копать в сторону модуля pcntl
>нужно копать в сторону модуля pcntlДело в том, что я не занимаюсь разработкой модулей.
Я - чистый скриптер.Так что Ваш совет мне вряд ли поможет. :)
Не предлагаю Вам писать модули для php, есть готовый модуль pcntl, работает, насколько я знаю, исключительно под *nix в cgi скриптах
http://php.rinet.ru/manual/ru/ref.pcntl.phpиз модуля для запуска скрипта в бэкграунде можно использовать
pcntl_fork()
http://php.rinet.ru/manual/ru/function.pcntl-fork.phpТакже могут пригодиться функции
ignore_user_abort()
http://php.rinet.ru/manual/ru/function.ignore-user-abort.phpset_time_limit()
http://php.rinet.ru/manual/ru/function.set-time-limit.phpЕсли Вы имеете в виду что то другое под запуском скрипта в бэкграунде - извиняйте.
Для себя нашел такое решение, хотя это и не exec() -> background
& в конце команды не помогает?
>& в конце команды не помогает?Хороший ход. :)
Но я думал о нём.
Дело в том, что цикл(-ы) сканирования сети хочу организовать по сетке, расписанной в файле(-лах), на РНР, которая вызывала бы отдельные команды (ping, nbtstat, telnet, ftp, etc).Допустим, есть такая строчка в функции моего скрипта:
$answer[] = exec("ping -c 1 -w 1 $ip &",$answer);
Разве ушедшая в бакграунд команда ping вернёт мне свой результат в массив $answer?
И как РНР "узнает", что команда успешно завершена?А теперь ещё одно усложнение: моя функция написана с учётом мультиплатформенности. Как думаете, под вындами данная строчка сработает:
$answer[] = exec("ping -n 1 $ip &",$answer);?
>Разве ушедшая в бакграунд команда ping вернёт мне свой результат в массив $answer?
Может по exec и не вернёт, такие тонкости php не проверял. Но может это пойдёт, по крайней мере заявлено php.net, что возвращает:
shell_exec - Execute command via shell and return the complete output as a string
pnctl_fork(),
потом в posix_setsid()$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork');
} else if ($pid) {
// we are the parent
echo "Working"; exit 0 // (или как там это на php)
} else {
// we are the child
posix_setsid();
// сюда вставляем код, который будет работать в бекграунде
}
<?
system ("команда параметры > /каталог_на_запись/out 2> /каталог_на_запись/err");
?>
<?
system ("команда параметры > /каталог_на_запись/out 2> /каталог_на_запись/err &");
?>
>Как загнать процесс, вызываемый РНР скриптом, в бакграунд: так, чтоб нажал кнопку,
>запустил РНР скрипт и закрыл браузер, а РНР скрипт бы работал?
>Не уверен, что понял задачу :) но может быть register_shutdown_function тебе поможет?