2016-12-14 5 views
2

Я некоторые проблемы в моем сценарии с inlcuding некоторые файлы с includeВключена ли команда включения буфера PHP?

я могу уменьшить его до небольшого кода, например:

<?php 

$res = 0; 
include "test.txt"; 
echo "RES = > $res".PHP_EOL; 

file_put_contents('./test.txt','<?php $res='.($res+1).';'.PHP_EOL); 

include "test.txt"; 
echo "RES = > $res".PHP_EOL; 

Я ожидаю выход

RES => 0 
    RES => 1 
    //On next Call I'm expecting ... 
    RES => 1 
    RES => 2 

Но что я получаю:

RES => 0 
    RES => 0 

Даже следующий вызов дает тот же результат (RES => 0). Когда я вспоминаю сценарий через 1-2 секунды, я получаю прирост ВИЭ.

Итак, мой вопрос: включен ли оператор включения буфера PHP? Я не видел некоторых частей в документации php о буферизации. В чем проблема с моим примером?

+0

Я работаю со стандартной установкой PHP/Apache под Ubuntu (v2.4.18/7.0.8-0ubuntu0 .16.04.3) – powerpete

+0

Я не могу воспроизвести. – AbraCadaver

+0

Этот код отлично работает для меня. Убедитесь, что пользователь 'www-data' имеет ** запись ** разрешений по этому пути. Также включите отображение ошибок в php.ini, чтобы получить больше информации о ваших проблемах в будущем. –

ответ

0

При запуске примера из командной строки или с отключенной opcache, скрипт работает отлично.

Отказ от opcache даст правильные результаты. Обходной с поддержкой opcache будет что-то вроде этого (это предотвратит кэширование файла):

//Instead of include "test.txt"; 
//we include the part manual by eval 
$cont = file_get_contents("test.txt"); 
//Strip of leading <?php and eval the string 
eval(substr($cont, 5)); 
1

Это зависит от наличия или отсутствия кеша OPCode. Если вы выполняете скрипт, он загружается из памяти после первого раза.

Я не уверен в поведении без кеша OPCode. PHP может загружать файл с диска каждый раз, когда вы вызываете include. Вы можете узнать с помощью strace и др. Вероятно, вы, вероятно, воспользуетесь преимуществами кеша файловой системы, даже если PHP вернется на диск при последующих вызовах include.

Как правило, я бы рекомендовал использовать кеш OPCode.

EDIT

теперь я вижу, вы изменяете содержимое файла перед вторым include ... Я попробовал ваш пример из командной строки, и это работает, как вы ожидаете. Попробуйте на своем сервере через CLI. Если он работает (что ему нужно), тогда есть хороший шанс, что вы включили кеш OPCode, а конкретная конфигурация предотвращает ожидаемое поведение.

Вы также должны проверить, что Apache записывает обновленный файл, как вы ожидаете. Возможно, когда вы пишете на диск с file_put_contents, вы также найдете log, что каждая версия сгенерированного файла. Нечто подобное после существующего file_put_contents вызова:

// For logging 
file_put_contents('./test-' . time() . '.txt','<?php $res='.($res+1).';'.PHP_EOL); 

 Смежные вопросы

  • Нет связанных вопросов^_^