Очень высокая задержка в первом HTTP-запросе проекта CodeIgniter

Мы с другом начали работать в проекте, который другие люди перестали развиваться пару лет назад, и мы пытаемся его воскресить. Мы уже решили большинство проблем, связанных с установкой, но есть очень раздражающие, которые мы не можем понять.

В наших локальных хостах все страницы занимают много времени, чтобы загрузить / обновить. И я не имею в виду активы, скрипты или что-то еще, проблема заключается в задержке до завершения первого запроса. В большинстве случаев это занимает от 15 до 30 секунд, что неприемлемо, а иногда даже доходит до 1 или 2 минут.

Например, вот скриншот вкладки «Сеть» в инструментах Chrome dev. Первая строка – это вид, другие – это активы.

Пример сумасшедшей задержки

Мы часами работали в Интернете и пробовали несколько разных вещей, но никто из них не работал. Некоторые решения, подобные этому, указывают на некоторые параметры httpd.conf для Apache, но я отбросил это, поскольку я использую один и тот же сервер для других проектов, и этого никогда не было (я все равно пробовал, но не работал). Другие указывают на конфликты в PHP-версии, поэтому я попытался изменить PHP в своем MAMP с 5.4.10 до 5.2.17 (для проекта требуется 5.2.3+), но это тоже не сработало.

Помимо моей установки MAMP, мы также протестировали ее на Windows-машине с WAMP (PHP5.5), а также на другом Mac с чистым MAMP (PHP5.5), и то же самое происходит в обеих средах. Итак, теперь мы задаемся вопросом, может ли проблема быть в самом CodeIgniter (что кажется маловероятным) или в некоторой конфигурации проекта, но мы довольно новичок в CodeIgniter (а также не PHP-эксперты) и ничего не нашли.

О, и мы также попытались связаться с оригинальными разработчиками, но они сказали, что это было два года назад и звучало так, как будто они не хотят помогать. Я действительно надеюсь, что у них не было этой проблемы при разработке проекта тогда, потому что работа с 30-секундным временем загрузки просто безумная.

Кто-то знает или знает что-то еще, что мы могли бы попытаться найти проблему? При необходимости я мог бы отправить код.


Обновление: я только что нашел этот нерешенный вопрос, когда у пользователя возникла аналогичная проблема с Laravel, но только иногда. Как я уже сказал, в моем случае это происходит всегда , причем время ожидания составляет от 10 секунд до нескольких минут.


Обновление 2: Как было предложено Wrikken, я запускал его через профайлер xdebug, но я не уверен, как интерпретировать результаты, чтобы увидеть, где проблема. Я открыл моментальный снимок с помощью инструмента «Анализ Xdebug Profiler» из PHPStorm и отсортировал его по времени, используемому в каждом вызове. Вот несколько скриншотов:

Вкладка «Статистика выполнения»Вызов дерева

И отсортировано по собственному времени:

Сортировка по собственному времени

То, что CashewModel появляется в некоторых строках, это некоторая специальная библиотека, созданная предыдущими разработчиками, что также вызывало некоторые проблемы, которые мы уже разрешили. Я надеюсь, что проблема не скрыта там, потому что я понятия не имею, как работает большинство этого пользовательского кода.

Есть идеи? Опять же, я могу отправить код, если это необходимо.


Обновление 3: MY_Controller кода, что MY_Controller на скриншоте выше – это файл, в котором предыдущие разработчики создали некоторые пользовательские контроллеры, расширяющие CI_Controller . Я только узнал, что они перебросили весь код кешью в GitHub, вот файл MY_Controller .

Я также вставляю сюда весь соответствующий код по строке 467 (в версии GitHub – 464), которая включает функцию _remap внутри CashewController и где профайлер говорит, что все время тратится. Я перевел некоторые комментарии и имена на английский.

 /** * * Extension of the default controller, adding support for templates * * Usage example: * * class Dummy extends EC_Controller * { * public function index() * { * $this->add_section('id_in_template', 'page_name'); * $this->render_page(); // Renders the default template. * } * } * */ class CashewController extends CI_Controller { // // Some attributes here // function __construct() { ... } /** * We use this _remap to automatically create the CRUD method calls * * @param string $method * @param string $params */ public function _remap($method, $params = array()) { // NEW if ($method == 'new') { $method = '_new'; } // CREATE else if ($method == 'index' && $this->request_method() == 'post') { $method = '_create'; } else if (is_numeric($method) && $this->request_method() == 'post' && count($params) == 0) { $params[0] = $method; $method = '_create'; } // SHOW else if (is_numeric($method) && count($params) == 0) { $params[0] = $method; $method = '_show'; } else if (is_numeric($method) && count($params) == 1 && $params[0] == 'edit') { // EDIT if ($this->request_method() == 'get') { $params[0] = $method; $method = '_edit'; } // UPDATE else if ($this->request_method() == 'post') { $params[0] = $method; $method = '_update'; } } // DELETE else if (is_numeric($method) && count($params) == 1 && $params[0] == 'delete') { $params[0] = $method; $method = '_delete'; } if (method_exists($this, $method)) { return call_user_func_array(array($this, $method), $params); } show_404(); } // // Some more functions // } 

Так что-то происходит внутри этого call_user_func_array(array($this, $method), $params) , правильно?

Solutions Collecting From Web of "Очень высокая задержка в первом HTTP-запросе проекта CodeIgniter"

Я нашел проблему благодаря комментарию, опубликованному выше, но пользователь не написал ответ, поэтому я размещаю его здесь.

Код, написанный предыдущими разработчиками, довольно интенсивно использует расширение memcached , которое я никогда раньше не использовал, поэтому я не знал, что это было или что мне нужно было включить на моем компьютере. Я последовал за шагами здесь, и все, теперь время загрузки приемлемо.

Всем спасибо!

Это звучит как тайм-аут для поиска домена или имени хоста (или IP-разворота), неправильного локального хоста для IPv6 ::1 (с отступлением от 127.0.0.1) или HTTPS-запроса, который тайм-ауты при выполнении проверка списка отзыва сертификатов (вам нужно удалить эту опцию из любой функции, которая обрабатывает это).

У меня такая же проблема. Некоторые из возможных решений:
1. Возможно, вы включили режим отладки.
2. Кэш не может быть настроен. Установите его для автоматического кеширования.

Если ни один из них не работает, попробуйте использовать докер для codeigniter, который выработал против меня.

Надеюсь, поможет.