PHP – убить exec при отключении клиента

У меня очень примитивный веб-интерфейс для моего приложения на C ++. Клиент (веб-браузер) входит в php-сайт и заполняет форму параметрами. Than (после отправки сообщения) php calls exec и приложение выполняет свою работу. Приложение может работать дольше минуты и требует довольно большого объема оперативной памяти.

Есть ли возможность обнаружить отключение от клиента (например, закрытие вкладки в веб-браузере). Я хочу это сделать, потому что после отсоединения клиент не сможет увидеть результат вычислений, поэтому я могу убить приложение и освободить RAM на сервере.

Спасибо за любую помощь или предложения.

Solutions Collecting From Web of "PHP – убить exec при отключении клиента"

Пока программа C ++ производит вывод во время работы, вместо того, чтобы генерировать все выходные данные непосредственно перед завершением, используйте passthru() вместо exec() .

Это приводит к тому, что PHP выгружает результат клиенту по мере создания контента, что позволяет PHP обнаруживать, когда клиенты отключаются. PHP прекращается, когда клиент немедленно отключает и убивает дочерний процесс (если параметр ignore_user_abort() не установлен).

Пример:

 <?php function exec_unix_bg ($cmd) { // Executes $cmd in the background and returns the PID as an integer return (int) exec("$cmd > /dev/null 2>&1 & echo $!"); } function pid_exists ($pid) { // Checks whether a process with ID $pid is running // There is probably a better way to do this return (bool) trim(exec("ps | grep \"^$pid \"")); } $cmd = "/path/to/your/cpp arg_1 arg_2 arg_n"; // Start the C++ program $pid = exec_unix_bg($cmd); // Ignore user aborts to allow us to dispatch a signal to the child ignore_user_abort(1); // Loop until the program completes while (pid_exists($pid)) { // Push some harmless data to the client echo " "; flush(); // Check whether the client has disconnected if (connection_aborted()) { posix_kill($pid, SIGTERM); // Or SIGKILL, or whatever exit; } // Could be done better? Only here to prevent runaway CPU sleep(1); } // The process has finished. Do your thang here. 

Чтобы собрать выход программы, перенаправьте вывод в файл вместо /dev/null . Я подозреваю, что для этого вам понадобится pcntl а также posix , так как в руководстве по PHP указано, что константы SIGxxx определяются расширением pcntl хотя я никогда не устанавливал его без другого, поэтому я не уверен в любом случае.