Кэширование кода операции в APC и отсутствующие файлы - PullRequest
3 голосов
/ 13 мая 2009

Мы используем APC в качестве кэша кода операции. Есть ли способ заставить APC кешировать несуществование файла? Мы установили apc.stat = 0 и apc.include_once_override = 1. Есть ли что-то еще, чтобы улучшить производительность вызова include_once для файла, который может отсутствовать в файловой системе? Если он присутствует, очевидно, мы хотим включить его. Однако, если он отсутствует, он будет никогда , и мы не хотим, чтобы PHP вызывал open() для файла при каждом запросе для проверки.

Для справки: у нас есть один базовый сайт, но мы предоставляем настройки для сайта на индивидуальной основе. У некоторых клиентов есть пользовательская страница входа, у других - совершенно уникальные страницы и т. Д.

Мы используем Zend Framework немного необычным образом, чтобы позволить нам при необходимости переопределять контроллеры. Наш сайт может иметь контроллер с именем LoginController, определенный в файле controllers/LoginController.php. Однако у нашего клиента «Компания» может быть требование для пользовательской страницы входа в систему, поэтому мы напишем новый класс с именем Company_LoginController, определенный в каталоге controllers/company/LoginController.php. (Это соглашение об именах позволяет нам соответствовать понятию «модулей» Zend Framework.)

Когда мы имеем дело с классом, мы в основном делаем что-то вроде этого:

include_once APPLICATION_PATH . '/controllers/company/LoginController.php';
if (class_exists("Company_LoginController")) {
    echo 'customer-specific controller exists';
} else {
    include_once APPLICATION_PATH . '/controllers/LoginController.php';
    echo 'customer-specific controller does not exist; using default';
}

Если файл /controllers/company/LoginController.php существует, APC будет кэшировать его при первом запросе и никогда больше не извлекать его из файловой системы. Однако, если файл /controllers/company/LoginController.php действительно не существует, я не хочу, чтобы APC проверял наличие этого файла более одного раза. Есть ли способ сделать это?

Ответы [ 3 ]

3 голосов
/ 13 мая 2009

Можете ли вы просто создать пустые файлы в каталоге компании? Поскольку APC не будет загружать их дважды, нет ничего плохого в том, что некоторые пустые файлы «загружаются» при первом запуске сервера.

2 голосов
/ 13 мая 2009

Ответ jmucchiello получает мой голос за простоту, но если по какой-то причине это не практично, вы всегда можете сделать что-то трудное.

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

function conditional_include($file) {
  $key = 'file-exists-' . $file;
  //fetch cache key; if it does not exist, then...
  if(($fileExists = apc_fetch($key)) === false) {
    //actually hit the disk to look for the file, and store the result
    apc_store($key, $fileExists = (file_exists($file) ? 1 : 0));
  }

  //only include the file if it exists.
  if($fileExists)
   include_once $file;
}
0 голосов
/ 08 мая 2010

Если вы используете Zend Framework, я бы рекомендовал использовать магию автозагрузки Zend_Loader, чтобы убедиться, что нужные вам файлы загружены. Используя автозагрузчик, вы можете удалить почти все вызовы include_once из ZF (кроме тех, что в классе Zend_Loader) Предостережение - зависит от вашего класса и стиля именования файлов, но вы можете переписать / расширить автозагрузчик, чтобы противостоять этому.

Возможно, это не то, что вам нужно, но, тем не менее, я надеюсь, что это поможет ...

...