Obecnie moje rozwiązanie to:PHP: jak rozpocząć oddzielny proces?
exec('php file.php >/dev/null 2>&1 &');
aw file.php
if (posix_getpid() != posix_getsid(getmypid()))
posix_setsid();
jest jakiś sposób mogę to zrobić tylko z exec?
Obecnie moje rozwiązanie to:PHP: jak rozpocząć oddzielny proces?
exec('php file.php >/dev/null 2>&1 &');
aw file.php
if (posix_getpid() != posix_getsid(getmypid()))
posix_setsid();
jest jakiś sposób mogę to zrobić tylko z exec?
No nie da się tego zrobić z exec()
(NOR shell_exec()
lub system()
)
Jeśli zainstalowano pcntl extension byłoby:
function detached_exec($cmd) {
$pid = pcntl_fork();
switch($pid) {
// fork errror
case -1 : return false
// this code runs in child process
case 0 :
// obtain a new process group
posix_setsid();
// exec the command
exec($cmd);
break;
// return the child pid in father
default:
return $pid;
}
}
Nazwijmy to tak:
$pid = detached_exec($cmd);
if($pid === FALSE) {
echo 'exec failed';
}
// do some work
// kill child
posix_kill($pid, SIGINT);
waitpid($pid, $status);
echo 'Child exited with ' . $status;
Nie chcę demonfigurować procesu ani go rozgałęziać. Muszę tylko uruchomić inny proces php, który nie otrzyma SIGINT, gdy ten, kto go utworzył, zakończy pracę. (Nie jestem pewien, jak demon różni się od procesu odłączonego od terminala?) – Dalius
Sprawdź ponownie mój przykład. Czy tego nie chcesz? ;) Jedyną różnicą dla demona jest to, że nie działa on wiecznie, ale zostanie zabity przy wyjściu ojca. – hek2mgl
Zasadniczo tak, ale spróbuj wdrożyć to w prostej funkcji, która zwraca wartość true lub false. (NIE MUSI się blokować). I nie chcę, aby nowy proces został zabity, to się skończy. – Dalius
Pod warunkiem, że obecny użytkownik ma wystarczające uprawnienia, aby to zrobić, powinno być możliwe z exec
i podobnie:
/*
/Start your child (otherscript.php)
*/
function startMyScript() {
exec('nohup php otherscript.php > nohup.out & > /dev/null');
}
/*
/Kill the script (otherscript.php)
/NB: only kills one process at the time, otherwise simply expand to
/loop over all complete exec() output rows
*/
function stopMyScript() {
exec('ps a | grep otherscript.php | grep -v grep', $otherProcessInfo);
$otherProcessInfo = array_filter(explode(' ', $otherProcessInfo[0]));
$otherProcessId = $otherProcessInfo[0];
exec("kill $otherProcessId");
}
// ensure child is killed when parent php script/process exits
register_shutdown_function('stopMyScript');
startMyScript();
Proszę nie ** nigdy nie rób tego nigdy więcej: http://stackoverflow.com/review/suggested-edits/3201462 To nie jest absolutnie jak Stack Przepełnienie działa. Jesteś drogi, ** droga ** z linii, przekreślając cudzą odpowiedź i wskazując swoją odpowiedź na swoją. – meagar
Przeprosiny - gra słów nie jest przeznaczona. Byłem pod wrażeniem S.O. bardzo poważnie podchodziło do tego, że nie mam tutaj niepoprawnych informacji, więc zasugerowałem jedynie usunięcie informacji hek2mgl, że nie można tego zrobić przy pomocy funkcji exec(). – Philzen
Głosowanie to sposób sortowania treści tutaj. – meagar
Nie sądzę. Może on posix_setsid przykład może pomóc, ale używa fork(). –