为啥我的代码更改没有立即反映?

Posted

技术标签:

【中文标题】为啥我的代码更改没有立即反映?【英文标题】:Why are my code changes not reflected immediately?为什么我的代码更改没有立即反映? 【发布时间】:2011-11-15 23:06:16 【问题描述】:

我正在维护一个大型 wordpress 站点,我试图通过在代码中添加跟踪语句来解决不相关的问题,这些语句只不过是对 error_log() 的调用。简而言之,我的服务器设置是一个文件服务器,它通过 nfs 共享网站的文档根目录。有 2 个 Web 服务器正在运行 nginx+apc+php/fpm。我直接在文件服务器上编辑 php 文件,当我从 Web 服务器查看文件时,我可以看到我的更改,但是当我跟踪错误日志时,我可以观察到我的更改没有立即反映。我继续看到旧的跟踪语句,就好像我根本没有进行更改一样。

我的运行理论是代码被缓存在 apc (duh) 或客户端 nfs 缓存中(不太可能,因为我可以使用 vi 看到编辑)。我尝试通过使用运行 apc_clear_cache() 的脚本刷新 apc 缓存来缓解这种情况。此外,我已经重新启动了 nginx 和 php-fpm,希望某些东西能够刷新旧的缓存 php 代码。这些方法都不起作用,我必须等待一个小时或更长时间才能看到我的代码更改反映在日志中。

我正在排除故障的网站流量相当大,因此重新安装 nfs 共享对我来说并不是一个真正的选择。我的假设是 apc 操作码缓存实际上并没有清除,但我一直在用 apc.php 观察统计数据,并且在运行我的刷新脚本后,我确实看到了缓存正在重建的样子。我已经为此工作了几天,解决一个简单的问题已经变成了一个巨大的头痛。任何人都可以提供任何其他的想法来查看或尝试使我的代码更改更直接吗?

【问题讨论】:

为什么要直接在高流量生产服务器上编辑文件? 因为我正在排查的问题不会出现在沙盒环境中,只会出现在实时服务器上。 所以您正在清除 apc 缓存并在两个 Web 服务器上重新启动 nginx...您可以通过在 PHP 中插入一些不可见的 html 来缩小搜索范围。例如<!--newcode--> 如果您在前端查看源代码时出现这种情况,那么您知道您的新代码正在运行,您可以排除 APC 和 nginx。可能是对错误日志的写入只是被缓冲了,所以当你拖尾日志时会看到旧条目出现? 您是否正在为 WordPress 运行缓存模块? 【参考方案1】:

一些想法:

    如果您正在调整,暂时将 apc.stat 设置为 true 可能会很有用;这意味着性能上的小幅损失,但会迫使 APC 在每次请求之前重新检查 opcache。

    这是我刷新 APC 缓存的霰弹枪方法(强制使每个单独的文件失效)。

    FPM 是否总是共享缓存(手册似乎是这样说的);还是有更多的缓存? (不确定!我对 FPM 不是很熟悉)。

$info = apc_cache_info(); $files = $info['cache_list']; $前缀 = "/"; if (isset($_GET['PREFIX'])) $prefix = $_GET['PREFIX']; $user = apc_cache_info("用户"); $cachestore = 数组(); // 将用户缓存保存到数组中 foreach ($user['cache_list'] as $info) $cachestore[$info['info']] = apc_fetch($info['info']); apc_clear_cache(); apc_clear_cache('用户'); // 重新缓存之前在 opcache 中的所有文件.. foreach ($files 作为 $file) if (strpos($file['filename'], $prefix) === 0) 打印 $file['filename'] 。 “:”; 打印 apc_compile_file($file['filename']) ? "成功\n" : "失败 D\n"; foreach ($cachestore as $key => $value) apc_store($key,$value);

【讨论】:

1.这已经设置为 true。说实话,我刚刚得知这一点,并计划在解决此问题后立即将其关闭。 3.是的 fpm 是唯一一个有共享缓存的 我完全关闭了 apc 并验证这不是问题 2.缩进有问题,它没有显示脚本的第一部分【参考方案2】:

我从未找到解决此问题的令人满意的原因,但我们选择从等式中删除 NFS,我们的问题已经消失。感谢大家的帮助。

【讨论】:

以上是关于为啥我的代码更改没有立即反映?的主要内容,如果未能解决你的问题,请参考以下文章

useState 设置方法不会立即反映更改

为啥在构建后源代码的更改并不总是反映在机器代码中而重建工作?

Eclipse 更改未反映在输出中

为啥即使禁用缓存,服务器也会忽略代码文件中的更改?

(PyQt) 为啥我不能更改我的 QTextEdit 小部件的字体?

如何在可观察集合的 UI 中立即反映任何添加、删除、字段更改