为什么我的代码更改没有立即反映出来?

时间:2011-11-15 23:06:16

标签: nginx apc nfs php

我正在维护一个大型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观察统计数据,我确实看到在运行我的flush脚本后看起来像重建的缓存。我已经在这里工作了几天,对一个简单的问题进行故障排除已经变得非常令人头痛。任何人都可以提供其他任何想法,或者尝试让我的代码更改更直接吗?

2 个答案:

答案 0 :(得分:0)

一些想法:

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

  2. 这是我用于刷新APC缓存的霰弹枪方法(强制每个文件无效)。

  3. FPM始终是共享缓存(手册似乎也是如此);还是有更多的缓存? (不确定!我对FPM不是很熟悉。)

  4.     $info = apc_cache_info();
        $files = $info['cache_list'];
        $prefix = "/";
        if (isset($_GET['PREFIX']))
        {
            $prefix = $_GET['PREFIX'];
        }
        $user = apc_cache_info("user");
        $cachestore = array();
        // save the user cache to an array
        foreach ($user['cache_list'] as $info)
        {
            $cachestore[$info['info']] = apc_fetch($info['info']);
        }
        apc_clear_cache();
        apc_clear_cache('user');
        // Recache all the files that were in the opcache before..
        foreach ($files as $file)
        {
            if (strpos($file['filename'], $prefix) === 0)
            {
                print $file['filename'] . " : ";
                print apc_compile_file($file['filename']) ? "SUCCESS\n" : "FAILE             D\n";
            }
        }
    
        foreach ($cachestore as $key => $value)
        {
            apc_store($key,$value);
        }
    

答案 1 :(得分:0)

我从未找到过这个问题的令人满意的原因,但我们选择从等式中移除NFS,我们的问题已经消失。谢谢大家的帮助。