URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 3946
[ Назад ]

Исходное сообщение
"exec() -> background"

Отправлено Antares , 07-Мрт-06 15:19 
Как загнать процесс, вызываемый РНР скриптом, в бакграунд: так, чтоб нажал кнопку, запустил РНР скрипт и закрыл браузер, а РНР скрипт бы работал?

Содержание

Сообщения в этом обсуждении
"exec() -> background"
Отправлено Ilyang , 07-Мрт-06 15:41 
нужно копать в сторону модуля pcntl

"exec() -> background"
Отправлено Antares , 10-Мрт-06 08:38 
>нужно копать в сторону модуля pcntl

Дело в том, что я не занимаюсь разработкой модулей.
Я - чистый скриптер.

Так что Ваш совет мне вряд ли поможет.  :)


"exec() -> background"
Отправлено Ilyang , 10-Мрт-06 11:36 
Не предлагаю Вам писать модули для 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.php

set_time_limit()
  http://php.rinet.ru/manual/ru/function.set-time-limit.php

Если Вы имеете в виду что то другое под запуском скрипта в бэкграунде - извиняйте.
Для себя нашел такое решение, хотя это и не exec() -> background


"exec() -> background"
Отправлено Жека , 07-Мрт-06 16:51 
& в конце команды не помогает?

"exec() -> background"
Отправлено Antares , 07-Мрт-06 20:28 
>& в конце команды не помогает?

Хороший ход.  :)

Но я думал о нём.
Дело в том, что цикл(-ы) сканирования сети хочу организовать по сетке, расписанной в файле(-лах), на РНР, которая вызывала бы отдельные команды (ping, nbtstat, telnet, ftp, etc).

Допустим, есть такая строчка в функции моего скрипта:
   $answer[] = exec("ping -c 1 -w 1 $ip &",$answer);
Разве ушедшая в бакграунд команда ping вернёт мне свой результат в массив $answer?
И как РНР "узнает", что команда успешно завершена?

А теперь ещё одно усложнение: моя функция написана с учётом мультиплатформенности. Как думаете, под вындами данная строчка сработает:
   $answer[] = exec("ping -n 1 $ip &",$answer);?


"exec() -> background"
Отправлено Жека , 08-Мрт-06 00:06 
>Разве ушедшая в бакграунд команда ping вернёт мне свой результат в массив $answer?
Может по exec и не вернёт, такие тонкости php не проверял. Но может это пойдёт, по крайней мере заявлено php.net, что возвращает:
shell_exec - Execute command via shell and return the complete output as a string

"exec() -> background"
Отправлено rWizard , 08-Мрт-06 21:50 
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();
     // сюда вставляем код, который будет работать в бекграунде
}


"exec() -> background"
Отправлено THESERG , 08-Мрт-06 12:48 
<?
system ("команда параметры > /каталог_на_запись/out 2> /каталог_на_запись/err");
?>

"exec() -> background"
Отправлено THESERG , 08-Мрт-06 12:49 
<?
system ("команда параметры > /каталог_на_запись/out 2> /каталог_на_запись/err &");
?>

"exec() -> background"
Отправлено taienos , 10-Мрт-06 16:31 
>Как загнать процесс, вызываемый РНР скриптом, в бакграунд: так, чтоб нажал кнопку,
>запустил РНР скрипт и закрыл браузер, а РНР скрипт бы работал?
>

Не уверен, что понял задачу :) но может быть register_shutdown_function тебе поможет?