Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   [решено] Вычисление "вешает" web-приложение на время выполнения хранимой процедуры (http://forum.oszone.net/showthread.php?t=90017)

Demiurg 10-09-2007 20:19 641117

Вычисление "вешает" web-приложение на время выполнения хранимой процедуры
 
Есть многопользовательский web-интерфейс (ajax+php) к приложению базы данных (postgresql+plpgsql). Нужно ежеквартально производить начисления контрагентам (10-20 тыс. контрагентов, в будущем с увеличением до 60-100), процесс начисления длится довольно длительно (20-30 мин.). Изначально хранимая-процедура для начислений запускалась по cron'у, все было нормально. Но... заказчик захотел, цитирую "канапульку для начислений" в web-интерфейсе... лана, в конфиге php увеличил максимальное время выполнения скрипта, вывел эту самую "канапульку"... и при нажатии на эту канапульку весь apache "стопорится" до тех пор, пока не закончит выполнение хранимка в базе... ни с другого таба, ни с другого компа в это время до apache не достучаться... !??? причем по базе в это время "лазию" свободно, что через psql, что через PgAdmin, что локально, что удаленно... Что можно сделать с apache'м, чтобы остальные клиенты могли работать, не то что комфортно, но хотя бы хоть как-то работать в это время? (Вариант "по нажатию этой канапульки ночью" не проходит по требованию заказчика, в противном случае я это сделал бы и по cron'у)
P.S. apache-2.0.59, php-5.2.3 (php5-pcre,php5-session,php5-dom,php5-pgsql), postgresql-8.2.4, FreeBSD_CURRENT...

Coutty 10-09-2007 20:48 641127

Как вариант - выделить для данной процедуры своего апача.

vadimiron 11-09-2007 03:16 641240

Demiurg,
А заказчик требует, чтобы действие сразу выполнялось?

Во-первых, конечно, действие не должен выполнять тот скрипт, который реагирует на нажатие кнопки. Лучше сделать скриптик с аяксом, который будет показывать сколько осталось времени до завершения (или в крайнем случае надпись типа "действие ещё не завершено, пожалуйста перезагрузите страницу позже").
Данный скрипт должен запускать другой процесс, который уже выполняет само действие.
А ещё раз такой длинный процесс, может его организовать по-другому, чтобы легче было контролировать? Например, через ПХП скрипт, который будет обновлять каждый раз 5% результатов и писать текущее состояние процесса, далее опять 5%...и так пока все строчки не обновлены.

Demiurg 11-09-2007 10:19 641348

...немного уточню... запрос XMLHhttpRequest на выполнение процедуры отправляется на сервер php-скрипту (который в свою очередь запускает хранимку, и по ее завершении посылает ответ клиенту) по клику из web-интерфейса... в интерфейсе отображается, что идет выполнение процедуры... но... другие пользователи уже не могут залогинится в системе, или те что уже залогинились (из других систем) не могут продолжать работу до тех пор как пока не завершится выполнение хранимки, которую запустили с другой машины... меня вот это удивляет... apache получается какой-то "однозадачный"... :)

"Как вариант - выделить для данной процедуры своего апача"... cross-site extensions to XMLHttpRequest в мазиллах/фоксах разве уже сть?
http://www.w3.org/TR/XMLHttpRequest/ - [Note: A future version or extension of this specification will most likely define a way of doing cross-site requests.]

Что еще заметил: на рабочей станции, на которой все это разрабатывается, куча проектов... грубо говоря - /приложение1/ , /приложение2/, etc. В каждом проекте свой index.xhtml, login.php, etc. Так войти нельзя только в тот проект, где запущена процедура вычисления, в остальные - нормально логинишься, нормально работаешь... !???

vadimiron 11-09-2007 16:25 641602

Demiurg,
Если это PHP-скрипт, то не вызывайте его через апач, вызываейте через командную строку просто ПХП и Апач там совсм не нужен, функция exec() + неблокирующий вызов и всё. Какая там оперативка?? (в зависимости от оперативной системы ныжно составить неблокирующий вызов через командную строку)

Цитата:

Цитата Demiurg
Что еще заметил: на рабочей станции, на которой все это разрабатывается, куча проектов... грубо говоря - /приложение1/ , /приложение2/, etc. В каждом проекте свой index.xhtml, login.php, etc. Так войти нельзя только в тот проект, где запущена процедура вычисления, в остальные - нормально логинишься, нормально работаешь... !??? »

А вот это странно - надо покопаться...

Может другие проекты имеют виртуальные хосты?

mar 11-09-2007 18:56 641693

Demiurg,
дурацкий вопрос. А нельзя все так делать по крону, результаты куда-нибудь кешировать, а по канапульке выдавать уже эти - предварительно сосчитанные результаты?

Demiurg 11-09-2007 22:34 641820

Дико перед всеми извиняюсь. Мне позвонили, сказали что целый отдел не может работать (я в этот момент через свой браузер как раз запустил процедуру начислений). Открываю приложение в соседнем табе, и правда не могу залогиниться в приложении. Иду к ним, действительно "ничего не работает". Только к вечеру хватило ума заглянуть у них в настройки браузеров... прописанные ранее прокси отсутствовали. Сейчас в отделе все работает и при начислении. Осталось только выявить "умника", который прокси убрал... а заодно и прокси прозрачным сделать.
Да, но факт остается фактом, при долговременном запросе в соседнем табе действительно нельзя зайти в приложение (признаться, для меня это новость).

P.S. Еще раз спасибо всем за отклики... в благодарность, после выявления, могу скинуть асю того "умника"... :)


Время: 19:25.

Время: 19:25.
© OSzone.net 2001-