Кэширование включает в PHP для повторного использования - PullRequest
3 голосов
/ 23 июня 2011

Есть ли способ эффективно кэшировать PHP include для повторного использования, без APC и т. Д.

Простой ( хотя и глупый ) пример:

// rand.php
return rand(0, 999);

// index.php
$file = 'rand.php';
while($i++ < 1000){
    echo include($file);
}

Опять же, хотя и смешно, эта пара скриптов сбрасывает 1000 случайных чисел.Тем не менее, для каждой итерации PHP должен обращаться к файловой системе ( Правильно? Я не пропустил ни одной функции наследования кэширования, не так ли? )

По сути, как я могу предотвратить предыдущеесценарий, приводящий к 1000 попаданиям в файловую систему?

Единственное соображение, к которому я пришел, до сих пор глупое, и оно может вообще не оказаться эффективным ( не проверял, написал егоздесь возможны ошибки, но вы получите идею ):

// rand.php
return rand(0, 999);

// index.php
$file = 'rand.php';
$cache = array();
while($i++ < 1000){
    if(isset($cache[$file])){
        echo eval('?>' . $cache[$file] . '<?php;');
    }else{
        $cache[$file] = file_get_contents($file);
        echo include($file);
    }
}

Более реалистичный и менее глупый пример:

При включении файловдля генерации представления данный файл представления используется несколько раз в данном запросе ( виджет или что-то еще ). Существует ли реалистичный способ захвата и переоценки сценария представления без попадания в файловую систему?

Ответы [ 4 ]

5 голосов
/ 23 июня 2011

Это имело бы смысл только в том случае, если доступ к включаемому файлу осуществлялся по сети.

Я не пропустил ни одной функции наследования кэширования, не так ли?

Все операционные системы очень оптимизированы для уменьшения количества физических операций ввода-вывода иускорить файловые операции.В правильно сконфигурированной системе в большинстве случаев система редко возвращается на диск для получения кода PHP.Сядьте с электронной таблицей и подумайте, сколько времени займет обработка кода PHP, если каждый файл должен быть извлечен с диска - это было бы нелепо, например, предположим, что ваш скрипт находится в / var / www / htdocs / index.php и включает /usr/local/php/resource.inc.php - это 8 операций поиска, чтобы просто найти файлы - по 8 мс каждый, это 64 мс, чтобы найти файлы!Запустите несколько тестов для своего тестового примера - вы увидите, что он работает намного, намного быстрее, чем этот.

1 голос
/ 23 июня 2011

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

Этот один коллективinclude можно хранить в течение часа, проверив время изменения файла, а затем переписав и включив включенные только один раз в час.

0 голосов
/ 17 июня 2015

Другой вариант:

while($i++ < 1000) echo rand(0, 999);
0 голосов
/ 23 июня 2011

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

// rand.php
function get_rand() {
    return rand(0, 999);
}

// index.php
$file = 'rand.php';
include($file);

while($i++ < 1000){
    echo get_rand();
}
...