gpt4 book ai didi

PHP include 不读取源文件的更改

转载 作者:可可西里 更新时间:2023-10-31 23:05:21 24 4
gpt4 key购买 nike

我的问题(可能不会出现在你的电脑上)

我有 2 个 PHP 脚本。

第一个脚本读取包括第二个脚本获取变量,更改值,并执行 file_put_contents 以更改第二个脚本。

<?php
include('second.php'); // in second.php, $num defined as "1"
$num ++; // now $num should be "2"
// Change content of second.php
file_put_contents('second.php', '<?php $num='.$num.'; ?>');
include('second.php'); // Now here is the problem, $num's value is still "1"
echo $num; // and I get an unexpected result "1"
?>

第二个脚本只包含一个变量

<?php $num=1; ?>

我希望结果是“2”,但似乎第二个包含没有读取 file_put_contents 所做的更改。

我的第一个猜测是 file_put_contents 函数中可能存在并发问题,因此在执行第二个 include 时第二个文件并没有真正改变。

我尝试通过将第一个脚本更改为以下内容来验证我的猜测:

<?php
include('second.php');
$num ++;
file_put_contents('second.php', '<?php $num='.$num.'; ?>');
// show the contains of second.php
echo '<pre>' . str_replace(array('<','>'), array('&lt;', '&gt;'),
file_get_contents('second.php')) . '</pre>';
include('second.php');
echo $num;
?>

我真的很惊讶地发现程序的结果是这样的:

<?php $num=4; ?>
3

这意味着 file_put_contents 正确读取了文件(换句话说,文件确实发生了物理更改),但“include”仍然使用第一个值。

我的问题

  1. 谁能解释一下?
  2. 是否有任何解决方法(而不是“sleep()”)让“include”读取更改?

我已经阅读了这个问题,但没有找到答案:

Dynamically changed files in PHP. Changes sometimes are not visible in include(), ftp_put()

临时解决方法

使用 eval 似乎是临时的解决方法。这并不优雅,因为 eval 通常与安全漏洞相关联。

<?php
require('second.php');
$num ++;
file_put_contents('second.php', '<?php $num='.$num.'; ?>');
echo '<pre>' . str_replace(array('<','>'), array('&lt;', '&gt;'), file_get_contents('second.php')) . '</pre>';
require('file.php');
echo $num . '<br />';
eval(str_replace(array('<?php','?>'), array('', ''), file_get_contents('second.php')));
echo $num;
?>

这是结果:

<?php $num=10; ?>
9
10

最佳答案

可能您已经安装并启用了 OPcache(自 Php 5.5: OPcache extension added 起),正在缓存您的 second.php 文件?

查看phpinfo()是否为真。

如果是这样,使用 opcache_invalidate('second.php') 使缓存文件无效或使用 opcache_reset() 重置所有缓存文件。

<?php
include('second.php');
$num ++;

file_put_contents('second.php', '<?php $num='.$num.'; ?>');

opcache_invalidate('second.php');//Reset file cache

include('second.php');
echo $num;//2
?>

关于PHP include 不读取源文件的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24074220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com