@r2sada2r

Почему после сохранения файла, при подключении через include, остается старое содержимое?

ob_start();
include(ROOT_DIR . '/core/data/config_test.php');
echo ob_get_clean();

if(isset($_POST['title'])) {
	$file = fopen(ROOT_DIR . '/core/data/config_test.php', 'w');
	fwrite($file, uniqid());
	fclose($file);
	
	header("location: /index.php");
	exit;
}


<form method = "post">
	<input type = "text" name = "title" value = "Demo page" />
	<button type = "submit">Отправить</button>
</form>


После того, как пользователь нажимает кнопку Отправить, новые данные летят на сервер.
На сервере данные сохраняются и происходит редирект. После редиректа, пользователь видит старые данные, притом, что все данные сохранены в файл. Если обновить страницу вручную, то все верно отображается. Почему так происходит?

P.S. Веб-сервер: Nginx. Вроде кеширование отключено.
  • Вопрос задан
  • 233 просмотра
Пригласить эксперта
Ответы на вопрос 3
butteff
@butteff
Раз в тысячу лет заправляю свитер в носки
> Вроде кеширование отключено.
Это немножко смущает.

Вообще такого быть не должно, вроде все ок в коде.

Возможно данные пишутся дольше, чем Вы открываете страницу редиректом. Но я очень сомневаюсь в этом. Мне кажется, что все же кэширование вызывает проблему.

Попробуйте сделать проверку на изменения файла, а потом редиректить. Сделать отдельную функцию, вызывать ее и в ней считать контрольные суммы md5 до записи и после записи. Если md5 разный - вернуть true в переменную. Проверить если переменная true - после этого редиректить.

Т.е. пока не выполнится функция и пока не будет true, редиректа тоже не будет, как я понимаю. Если редирект пройдет, значит проблема в кэшировании, имхо.
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
чтобы проверить версию о браузерном кэше добавь к редиректу случайный параметр, например time()
Ответ написан
Комментировать
He11ion
@He11ion
PHP-monkey
Опкеш или что-то подобное может быть? Может просто не успевает отследить изменения в файле.
Ну и да, на дворе 2015, пробуйте хранить данные в мемкеше/редисе, а не в файлах.
И да, прямая запись в исполняемый файл - адова дыра в безопасности.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы