Как отрубить процесс при отключении клиента?

DDT

Новичок
Как отрубить процесс при отключении клиента?

Привет.

Ситуация:
есть веб приложение (Apache, PHP, Postgres), с которым работаем порядка 50-60 пользователей.

Бывают случаи, когда пользователь запускает формирование какого-то отчета, понимает, что указал неверные критерии и останавливает выполнение скрипта. Т.е. нажимает кнопку Стоп в эксплорере.

Заметьте, что процесс postgres все еще обрабатывает его запрос.

Вопрос:
Можно ли отлавливать такие случаи и убивать повисшие процессы на сервере для сохранения работоспособности?

Спасибо.
 

DDT

Новичок
Идея вцелом понятна. Спасибо.

Прошу пояснить вот что. Есть обращение к серверу:
PHP:
$DB->makeQuery("вызов офигенной процедуры на сервере");

if(connection_aborted())
{
   // отрубаем процесс на сервере
}
Т. к. процедура по определению выполняется очень долго, то РНР будет ждать пока она выполниться или пойдет дальше и начнет выполнять if()?
 

Alexandre

PHPПенсионер
А вот я что-то недогоняю...
Клиент нажал кнопку СТОП....
А вот WEB сервер об этом не знает... и пхп скрипт ждет ответа, пока продолжается выполняться запрос офигенной процедуры на сервере БД.
Вопрос в том - как пхп скрипт узнает - обрублен HTTP запрос или нет, если идет последовательная обработка и скрипт ждет выполнения офигенной процедуры на сервере БД.

во всяком случае должна быть не последовательная, а какая-то тредовая модель.
пхп скрипт запустил поток, в котором осуществляется выполнение офигенной процедуры на сервере БД...
далее анализируем не пришол-ли обруб с сервера connection_aborted(), если пришел обруб, то ликвидируем поток и аварийно завершаем сам скрипт.
 

DDT

Новичок
Что-то не пойму. Commit (или rollback) относяться к БД, а connection_aborted() - к РНР.

Как они могут связаны между собой? Если выполнение программы зависло на вызове процедуры, то как тогда осущестлять проверку connection_aborted() и запускать Commit (или rollback)?

-~{}~ 10.11.06 10:26:

P.S.

может тут в сторону настройки Апача надо грести? Я специально в этот форум пришел, а не в программирование РНР. ;)
 

DDT

Новичок
Alexandre

а можешь пример тредовой модели привести?
 

DDT

Новичок
Автор оригинала: Alexandre
к сожалению нет, могу помочь только теоретически (мне на практике не приходитось с тредами работать)
:) давай хотя бы на теории. Или ссылочку, где почитать.
 

MiRacLe

просто Чудо
DDT
вопрос в том чтобы "убить" процесс, или избавить базу от "лишних" данных?
 

DDT

Новичок
MiRacLe
"убить" процесс. Т.к. он подвешиваешь сервер почем зря :)
 

Alexandre

PHPПенсионер
может это
Пример 1. Process Control Example
PHP:
declare(ticks=1);

$pid = pcntl_fork();
if ($pid == -1) {
     die("could not fork"); 
} else if ($pid) {
     exit(); // we are the parent 
} else {
     // we are the child
}

// detatch from the controlling terminal
if (!posix_setsid()) {
    die("could not detach from terminal");
}

// setup signal handlers
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");

// loop forever performing tasks
while (1) {

    // do something interesting here

}

function sig_handler($signo) 
{

     switch ($signo) {
         case SIGTERM:
             // handle shutdown tasks
             exit;
             break;
         case SIGHUP:
             // handle restart tasks
             break;
         default:
             // handle all other signals
     }

}
-~{}~ 10.11.06 11:01:

http://ru.php.net/pcntl
http://ru.php.net/manual/en/ref.posix.php
 

Alexandre

PHPПенсионер
DDT набросаешь код -выложи.... интересно самому

тут есть еще вариант - запускать не в потоке а в отдельном процессе.
 

DDT

Новичок
Автор оригинала: Alexandre
DDT набросаешь код -выложи.... интересно самому

тут есть еще вариант - запускать не в потоке а в отдельном процессе.
Запускать типа "монитор мертвых процессов"? Которому скармливать PID процесса с офигенной процедурой?
 

hermit_refined

Отшельник
Чего-то вы все в какую-то странную степь...
Апач вообще не узнает, что кто-то там оборвал соединение, "нажав на кнопку стоп", пока не попытается передать какие-то данные клиенту.
тут есть еще вариант - запускать не в потоке а в отдельном процессе
pcntl_fork() - это и есть порождение процесса. Но - по понятным причинам - pcntl-функции недоступны при установке php в качестве модуля, да и, честно говоря, не должна возникать потребность в них.
 
Сверху