PHP разветвляет php-fpm с помощью pcntl_fork () - PullRequest
0 голосов
/ 20 февраля 2010

Я разветвляюсь с этим кодом:

echo "1. posix_getpid()=".posix_getpid().", posix_getppid()=".posix_getppid()."\n";

$pid = pcntl_fork();
var_dump($pid);
if ($pid == -1) die("could not fork");

if ($pid) {
//parent
echo "2. pid=".$pid.", posix_getpid()=".posix_getpid().", posix_getppid()=".posix_getppid()."\n";
} else {
//child
$sid = posix_setsid();

if ($sid < 0)
exit;

echo "3. pid=".$pid.", posix_getpid()=".posix_getpid().", posix_getppid()=".posix_getppid()."\n";

$fp = fopen("/tmp/testfile", "w");
fwrite($fp, '$data');
fclose($fp);

} 

Почему-то иногда блок else отправляется в браузер, а иногда отображается блок if ($ pid).

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

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

Ответы [ 2 ]

2 голосов
/ 11 декабря 2012

На самом деле вы должны использовать fastcgi_finish_request() для отправки ответа в браузер, а затем продолжить работу в фоновом режиме. Имейте в виду, что это работает ТОЛЬКО при использовании PHP-FPM.

Примечание: функция fastcgi_finish_request() не описана в руководстве по PHP (см. Ошибку 61449), но использование довольно простое.

Что касается ignore_user_abort(), некоторые комментарии на php.net предлагают использовать с ним заголовок Content-Length: 0, но это вызовет проблемы при использовании SSL в сочетании с Internet Explorer.

0 голосов
/ 20 февраля 2010

Попробуйте вместо этого использовать ignore_user_abort().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...