Вычисление "вешает" 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... |
Как вариант - выделить для данной процедуры своего апача.
|
Demiurg,
А заказчик требует, чтобы действие сразу выполнялось? Во-первых, конечно, действие не должен выполнять тот скрипт, который реагирует на нажатие кнопки. Лучше сделать скриптик с аяксом, который будет показывать сколько осталось времени до завершения (или в крайнем случае надпись типа "действие ещё не завершено, пожалуйста перезагрузите страницу позже"). Данный скрипт должен запускать другой процесс, который уже выполняет само действие. А ещё раз такой длинный процесс, может его организовать по-другому, чтобы легче было контролировать? Например, через ПХП скрипт, который будет обновлять каждый раз 5% результатов и писать текущее состояние процесса, далее опять 5%...и так пока все строчки не обновлены. |
...немного уточню... запрос 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. Так войти нельзя только в тот проект, где запущена процедура вычисления, в остальные - нормально логинишься, нормально работаешь... !??? |
Demiurg,
Если это PHP-скрипт, то не вызывайте его через апач, вызываейте через командную строку просто ПХП и Апач там совсм не нужен, функция exec() + неблокирующий вызов и всё. Какая там оперативка?? (в зависимости от оперативной системы ныжно составить неблокирующий вызов через командную строку) Цитата:
Может другие проекты имеют виртуальные хосты? |
Demiurg,
дурацкий вопрос. А нельзя все так делать по крону, результаты куда-нибудь кешировать, а по канапульке выдавать уже эти - предварительно сосчитанные результаты? |
Дико перед всеми извиняюсь. Мне позвонили, сказали что целый отдел не может работать (я в этот момент через свой браузер как раз запустил процедуру начислений). Открываю приложение в соседнем табе, и правда не могу залогиниться в приложении. Иду к ним, действительно "ничего не работает". Только к вечеру хватило ума заглянуть у них в настройки браузеров... прописанные ранее прокси отсутствовали. Сейчас в отделе все работает и при начислении. Осталось только выявить "умника", который прокси убрал... а заодно и прокси прозрачным сделать.
Да, но факт остается фактом, при долговременном запросе в соседнем табе действительно нельзя зайти в приложение (признаться, для меня это новость). P.S. Еще раз спасибо всем за отклики... в благодарность, после выявления, могу скинуть асю того "умника"... :) |
Время: 19:25. |
Время: 19:25.
© OSzone.net 2001-