Такое поведение не проявлялось постоянно, просто появилось из ничего около месяца назад, а затем внезапно исчезло. Проблема в том, что я не могу определить, что произошло. У меня нет инструмента отладки сервера, потому что он выполняется только в производственной среде. Примерно 100 запросов ajax запускаются одновременно с использованием некоторого цикла, например:
let url = "example.com/";
var methods = ["method1", "method2", "method3", "method4"]; //Roughly 100
$.each(methods, function(index, value) {
$.ajax({
url: url + value,
method: "POST",
data: { params: "whatever", otherParams: "whatever" }
}).done(function(data) {
console.info(data);
});
});
На стороне сервера (apache + php) есть выборки, обновления и вставки в реляционной базе данных. Каждый запрос выполняет отдельный поток, так как apache слышит.
Когда я вижу сетевую консоль, все запросы запускаются одновременно (примерно), но вот в чем проблема. Ответы приходят один за другим финишем. Если запрос 1 начинается с 0 и занимает 5 секунд, запрос 2 начинается с 5, а запрос 3 начинается после завершения запроса 2. Все браузеры ведут себя одинаково.
Лучшее логическое объяснение, которое я подумал, заключается в том, что база данных блокирует некоторую таблицу при выполнении обновления или вставки. Некоторые таблицы огромны и без индексов могут провести слишком много времени. Ну, промежуточная среда указывает на ту же базу данных и работает идеально асинхронно. Так, что происходит? Возможно ли, что php или Apache по какой-то причине застряли таким образом? Я подумал о другой безумной идее, что некоторые проблемы с записью файлов журнала в ОС (debian), но я понятия не имею, как это работает. Так что я был бы рад, если бы кто-нибудь мог дать мне какое-нибудь предложение. Возможно, я смогу воспроизвести проблему в контролируемой среде и сделать что-нибудь, чтобы это не повторилось.
Некоторая дополнительная информация, у API есть два клиента, один в angular, другой в javascript + php. Точно такое же поведение с обоими клиентами.
Вы используете какие-либо фреймворки на бэкэнде? Может быть Symfony?
@AnthonyB Я не могу воспроизвести это, потому что не знаю, что делать. Я должен регистрировать каждый раз, когда трачу на каждый процесс, я не вижу возможности, но, может быть, это единственный способ.
@mochalygin без рамки.
Трудно исправить то, что мы не можем воспроизвести. В MySQL вы можете регистрировать запросы, которые занимают более X секунд, это конфигурация в my.cnf. Это может помочь вам регистрировать запросы, которые занимают слишком много времени.
Взгляните на это: stackoverflow.com/questions/15686572/…
@xyzale Интересно, что ответил Дариен. У меня нет проблем с сессией (у одного клиента вообще нет сессии). К сожалению, я не работаю с xdebug или zend, но это интересная точка зрения.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если у вас есть возможность воспроизвести его в производственной среде, вы, вероятно, будете контролировать свой веб-сервер и сервер баз данных. Без какого-либо мониторинга действительно сложно найти, что это такое. Но, как вы сказали, это май из-за блокировки таблицы. Это не из-за одного запроса, если ваш сервер работает медленно, а из-за набора запросов, поэтому их трудно воспроизвести. Попробуйте зарегистрировать список процессов вашего сервера, и вы увидите, действительно ли таблица используется и нуждается в индексе или чем-то подобном.