PHP включает в себя порядок пути и статус кеша

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

set_include_path(MY_PRODUCT_ROOT.'/' . PATH_SEPARATOR . MY_FRAMEWORK_ROOT.'/');

Так что если я позвоню include('view-users.php'); сначала он будет искать в MY_PRODUCT_ROOT файл /view-users.php, а если он не найден, то будет искать файл MY_FRAMEWORK_ROOT/view-users.php.

Эта процедура работает очень хорошо, пока я не добавлю файлы в корень продукта. Я знаю, что PHP/Apache кеширует включения, и можно было бы подумать, чтобы запустить clearstatcache(true); очистить любой статус кеширования. PHP, вероятно, использует file_exists внутри include(); и думает, что новый файл все еще не существует. Я попытался перезапустить Apache безрезультатно.

К сожалению работает clearstatcache(true); тоже не помогает. Только после того, как я удалил MY_FRAMEWORK_ROOT / файл, он думает очистить кеш и повторить попытку, найдя, таким образом, MY_PRODUCT_ROOT/file.

Я немного озадачен, я знаю, что нам нужно обновить понимание PHP/Apache о том, существуют файлы или нет, но clearstatcache(true); не помогает...

Есть идеи?

ОБНОВЛЕНИЕ: Исправление, перезапуск Apache, кажется, теперь помогает. Я повторяю, что это происходит только при попытке ДОБАВИТЬ файл в MY_PRODUCT_ROOT, чтобы перекрыть существующий файл MY_FRAMEWORK_ROOT, для настройки

ОБНОВЛЕНИЕ: Средой разработки является Zend Server CE PHP 5.3.14 для Windows, производственная среда Centos linux httpd, PHP 5.3+. Тот факт, что Zend-оптимизатор включен в моей среде разработки, может оказать влияние, также не используя APC или любые другие сценарии кэширования.

1 ответ

Решение

Zend Optimizer+ ускоряет выполнение PHP за счет кэширования и оптимизации кода операции. Он хранит предварительно скомпилированный байт-код скрипта в общей памяти. Это исключает этапы чтения кода с диска и его компиляции при последующем доступе. Для дальнейшего повышения производительности сохраненный байт-код оптимизирован для более быстрого выполнения.

Это кэширует содержимое файла, найденное во включениях, поэтому clearstatcache не работает. Я отключил свой Zend Optimizer, и теперь он работает.

Другие вопросы по тегам