Автозагрузка класса php - кажется, кэшируется?

Недавно я реализовал следующий код для автоматической загрузки классов в моем php-коде:

function my_autoloader($class) {
    include 'classes/class_' . $class . '.php';
}
spl_autoload_register('my_autoloader');

Код содержится в файле, который включается в начало всех файлов, необходимых для создания веб-страницы. Итак, я приступил к удалению вызовов require_once из своего кода. Вот пример:

require_once('classes/class_web_page.php');

Как вы, вероятно, поняли из вышеизложенного, различные страницы моего сайта (это интернет-сообщество, поэтому есть форум, галерея и т. д.) используют класс web_page для создания заголовков страниц, меню и т. д. Различные фрагменты кода создают объект web_page, установить различные параметры, чтобы определить, какие опции меню и т. д. необходимы, дать странице некоторый контент и сгенерировать html.

Все было хорошо, пока я не внес изменения в файл class_web_page.php. Изменения были сразу заметны на большей части сайта... кроме домашней страницы.

Я обновил свой браузер, выключил и снова включил :-) попробовал позвонить http://www.terragenesis.co.uk/index.php, а не просто http://www.terragenesis.co.uk/ и даже останавливал и перезапускал apache на сервере. Несмотря на все это, изменения не отображались на главной странице. В конце концов, я поместил строку require_once обратно в index.php... и вуаля: изменения, которые я сделал в class_web_page.php, появились на домашней странице.

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

Кто-нибудь еще испытал это? Я сделал что-то не так с кодом автозагрузчика? Как я могу это исправить... или мне придется вернуть все операторы require_once на место? :-(

На моем сервере установлена ​​версия PHP 5.1.6.


person Andy Slater    schedule 23.01.2013    source источник
comment
У вас загружены какие-нибудь модули типа APC?   -  person hank    schedule 23.01.2013
comment
Я так не думаю. Я только что позвонил в phpinfo() и искал APC — ничего не нашел.   -  person Andy Slater    schedule 25.01.2013


Ответы (2)


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

Оказывается, в какой-то момент в прошлом я случайно загрузил копию class_web_page.php в домашний каталог сайта, а не в подкаталог классов. Так он существовал дважды.

Таким образом, может показаться, что, несмотря на то, что мой автозагрузчик говорит php искать в подкаталоге классов, он сначала будет искать в том же каталоге, что и основной скрипт (index.php в случае домашней страницы моего сайта). Все остальные скрипты страниц сайта находятся в подкаталогах (форум, галерея и т. д.), поэтому они «правильно» использовали /classes/class_web_page.php.

Теперь я удалил копию class_web_page.php, которая находилась в домашнем каталоге... и все работает как надо.

person Andy Slater    schedule 29.01.2013

Вы уверены, что этот файл действительно загружен (или его кешированная версия)?

person Zim84    schedule 23.01.2013
comment
Мой класс web_page создает весь html для страницы, поэтому класс должен быть доступен для index.php, иначе я бы не увидел страницу. Однако он не показывал изменений, которые я сделал в class_web_page.php (который определяет класс). Я не могу придумать, как это могло бы произойти, кроме как если бы использовалась кешированная версия class_web_page.php. - person Andy Slater; 25.01.2013
comment
Что происходит, когда вы удаляете этот файл? - person Zim84; 26.01.2013