CodeIgniter - загрузка библиотек, если они еще не загружены
То, что я пытаюсь сделать, это загрузить библиотеки, если они еще не загружены (либо библиотеки CI, либо пользовательские) во многих различных точках веб-сайта. Поэтому я хочу проверить это.
Я выполнил поиск в библиотеке Loader и нашел функцию is_loaded(), так что я мог бы сделать это, например:
if ($this->load->is_loaded('form_validation') === false) {
$this->load->library('form_validation');
}
Странная вещь с этим (с включенным профилировщиком) состоит в том, что память увеличивается, что заставляет меня задаться вопросом, правильный ли это путь или нет.
1 ответ
Вокруг строки 914 в system/core/Loader.php, Codeigniter выполняет проверку, загружена ли библиотека, и не будет загружать ее снова. Тем не менее, эти проверки также занимают немного памяти. Чтобы сделать вывод, какой способ лучше всего подходит для загрузки библиотек, я сделал небольшой тест (очистка памяти после каждой попытки), и вот вывод:
Просто загрузите библиотеку как обычно
$this->load...
и пусть Codeigniter справится с этим
Ориентир:
$this->load->library('session');
После начальной загрузки сеансового класса Codeigniter я тестировал различные способы загрузки библиотеки и / или проверки, не загружена ли она уже. Каждая из этих строк была выполнена отдельно 20 раз:
ТЕСТ ПОТРЕБЛЕНИЯ ПАМЯТИ (не скорость!)
if(!$this->load->is_loaded('session')) $this->load->library('session');
Это потребляет 48.256 байт
if(!class_exists('ci_session')) $this->load->library('session');
Это потребляет 39,824 байт
if(!isset($this->session)) $this->load->library('session');
Это потребляет 31,904 байт
$this->load->library('session');
Это потребляет 21,790 байт
После повторения теста еще раз результаты были такими же, поэтому я думаю, что это может быть просто актуально! Пожалуйста, прокомментируйте, если я ошибаюсь!
07.08.2014. ОБНОВЛЕНИЕ с использованием Codeigniter 2.2.0: тест был повторен с использованием 1000 итераций (а не 20, как раньше). Результаты остаются прежними. Потребление памяти было следующим: 2128b, 1856b, 1688b, 1456b
@Tim Dev отмечает в комментарии, что в этом тесте нет необходимости показывать самый быстрый код, а только код с самым низким потреблением памяти.