Николай Ланец
15 окт. 2016 г., 5:03

Ext.Ajax.timeout и Ext.Panel.getUpdater().timeout. Ограничения на Ajax-запросы в 30 секунд.

Вот на решение этой задачки я убил сегодня три часа… Настраивал сегодня экспорт-импорт большого каталога с помощью modImporter-а. На формирование Эксель-файла импортеру чуть-чуть не хватало 30-ти секунд. Ну я не стал заморачиваться с оптимизацией, а просто решил поднять тайм-лимиты серверу. У меня связка nginx+php-fpm, прописал где надо конфиги (точнее в паппет-скрипт настройки сервера) и такой думаю всё, сейчас попрет. Но не тут-то было… Запрос по прежнему отваливался на 30 сек. Я уже конфиги и так, и эдак перекрутил, вроде все нормально, но все равно нет результата. Я начал грешить уже на MODX, может он что устанавливает (ведь есть у него системная настройка upload_maxsize для контроля веса загружаемых файлов, почему не иметь ему настройку на max_execution_time?). Но нет, перепроверил, все ОК с этим, ничего он не устанавливает. И тут я заподозрил неладное с самими Ajax-запросами… Вот здесь-то целый рассадник, как оказалось… Думаю, я только часть нашел. Судя по тому, какой там беспорядок, ограничений этих куча где прописано…
Во-первых, Ext.Ajax.timeout. По-умолчанию задано 30000 (в мсек). То есть Ext.Ajax.request() (как и MODx.Ajax.request()) отвалится через 30 секунд. Хотите, чтобы не отваливался — Пропишите Ext.Ajax.timeout = 0;
Во-вторых, Ext.Updater. Он используется у нас в компоненте Console, в котором так же запросы отваливались через 30 секунд (позже выпущу обновленную версию, если кому срочно — вот ревизия). У него тоже timeout прописан, только уже в секундах (по умолчанию 30 задано). Что примечательно, не смотря на то, что этот апдейтер запросы шлет через Ext.Ajax (в котором, напомню, прописан дефолтный лимит в 30 сек), зачем-то разрабам Экста захотелось в него тоже прописать эту настройку. joxi.ru/Q2KndEBs9YN8lm
В-третьих, Ext.form.BasicForm тоже имеет параметр timeout! (тоже в секундах). Этот объект формы используется в MODx.Window и Ext.form.FormPanel (и в итоге у нас в modImporter). Вот прежде чем отправлять запрос через form.getForm().submit(), надо этому объекту формы лимит тоже сбросить.
Короче, не получается в JS в одном месте лимит задать и радоваться. Для нескольких разных приложений может понадобиться сбросить лимиты в разных местах.
P.S. обновленный modImporter-1.6.3 без тайм-лимитов тоже выложил.

Добавить комментарий