当前位置: 首页 > 知识库问答 >
问题:

尽管进行了彻底的设置和调优,但无法禁用PHP缓存

苏宏逸
2023-03-14

周日快乐,

我为运行在Ubuntu 16上Azure上的Bitnami lamp打包实例上的缓存管理苦苦挣扎了3天(担心到月底会变得更大胆)。十、

我从事一个PHP5到PHP7迁移的大系统已经有几个星期了,即将完成任务。

我使用该系统的测试站点可在以下位置访问:https://stephanedeluca.com让你看看缓存。

不幸的是,我看到的是,我的PHP脚本没有立即反映我在部署(简单上传)到服务器后所做的更改。因此,用户体验有时会因为用户经常需要双重刷新而遭到破坏,在最坏的情况下,用户体验必须通过浏览器重新加载所有内容。

在以前的系统上,一切都很好,但是在这个新盒子上,我有问题。该框使用php-fpm。

到目前为止,我在缓存管理解决方案方面取得的成就:

>

<ifModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 0 seconds"
</ifModule>
<FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$">
    <ifModule mod_expires.c>
        ExpiresDefault "access plus 1 years"
    </ifModule>
    <ifModule mod_headers.c>
        #Header append Cache-Control "public"
    </ifModule>
</FilesMatch>
<FilesMatch "\.(gif|jpg|jpeg|png)$">
    <ifModule mod_expires.c>
        ExpiresDefault "access plus 1 weeks"
    </ifModule>
    <ifModule mod_headers.c>
        #Header append Cache-Control "public"
    </ifModule>
</FilesMatch>    
<FilesMatch "\.(xml|json|txt|html|js|css)$">
    <ifModule mod_expires.c>
        ExpiresDefault "access plus 2 hours"
    </ifModule>
    <ifModule mod_headers.c>
        #Header append Cache-Control "proxy-revalidate"
    </ifModule>
</FilesMatch>
<filesMatch "\.(php)$">
    FileETag None
    <ifModule mod_headers.c>
        Header unset ETag
        #Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
        Header set Pragma "no-cache"
        #Header set Expires "Tue, 15 Mar 1966 10:00:00 GMT+1"
    </ifModule>
</filesMatch>

我的所有PHP脚本(通过prepend)都会生成以下标题(在调用会话_start()之后):

// === No caching ===
session_cache_limiter('private');
session_cache_expire(0);

// === Start session (must be after session_cache_X())
session_start();

header('Cache-Control: private, max-age=0, s-max-age=0, no-cache, no-store, must-revalidate', true);
header("Last-Modified: $headerNow", true);

在查看浏览器请求和响应时,我发现一切看起来都很好,imho:

请求(由Chrome报告)

Request URL: https://stephanedeluca.com/
Request Method: GET
Status Code: 200 OK (from ServiceWorker)
Referrer Policy: no-referrer-when-downgrade

回应:

Cache-Control: private, max-age=0, s-max-age=0, no-cache, no-store, must-revalidate
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=UTF-8
Date: Sun, 28 Apr 2019 12:36:57 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive: timeout=5, max=100
Last-Modified: Sun, 28 Apr 2019 12:36:57 GMT
Pragma: no-cache
Server: Apache
Transfer-Encoding: chunked
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-Generated-On: Sun, 28 Apr 2019 12:36:57 GMT
X-Powered-By: ZID/Webengine v24.0b27 -- Copyright (c) 1995-2019 MagicApps (http://MgcApps.com) -- All Rights Reserved
Provisional headers are shown
Referer: https://stephanedeluca.com/map.php
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36

我还使用https://www.giftofspeed.com/cache-checker/报告也如预期的那样。

我的想法快用完了。

共有1个答案

龚奕
2023-03-14

我是比特纳米工程师。为了禁用服务器中的缓存并允许每次提供文件,请禁用Apache的PageSpeed和PHP的OPCache(默认情况下启用)。

要禁用PageSpeed,请注释掉httpd中的以下行。conf(/opt/bitnami/apache2/conf/httpd.conf)

#Include conf/pagespeed.conf
#Include conf/pagespeed_libraries.conf

要禁用OPCache,请更改OPCache。在php中启用。ini文件并将其设置为0(/opt/bitnami/php/etc/php.ini)

然后重新启动所有服务

sudo /opt/bitnami/ctlscript.sh restart
 类似资料:
  • 我希望存储在redis缓存中的数据在给定的时间段后自动从缓存中清除,而无需对其调用delete方法。在这个POC中,我将TTL设置为60秒。我曾尝试在缓存管理器中使用API SetDefaultExpire、setExpires设置它,并在RedisTemplate中使用API expire设置它。到目前为止,没有一个解决方案对我有效。 在使用的redis存储库中, 请给我指出正确的方向。感谢您的

  • 问题内容: 返回403。我可以使用firefox / chrome浏览网站,因此似乎是编码错误。 我不知道自己在犯什么错误。 谢谢。 问题答案: 如果通过对象发出请求,则此方法有效。 输出:

  • 问题内容: 我正在尝试将IBM的CPLEX库与我的Java应用程序集成。现在,我只是试图创建一个IloCplex对象。我添加了Cplex.jar,它可以很好地编译,但是当我运行它时: Cplex在抛出异常之前打印此消息: 我通过这个参数给JVM: 。这是cplex124.dll的位置。我看过的每个教程都给出了相同的步骤,我觉得自己很好地遵循了它们。 我究竟做错了什么?? 问题答案: 我在互连网上发

  • 我无法使用和,在上本地运行我的pod。我使用<code>gitbash</code>来执行所有这些命令。 不知道如何去调试它。 $docker图片 $ ku bectl run greet-foo-image = greet:latest-image-pull-policy = Never $kubectl获得豆荚

  • ldd找不到rpath定义中存在的dll。找到了其他一些库(check/./../lib/*) 这里是 ldd 的输出(我们可以看到在 ../lib,但不是自由 root@hyperstream:/DT/local/ADE-trunk4/build-ADE-Desktop-Default/bin#ldd./ade_adminlinux-vdso.so.1= root@hyperstream:/DT

  • 问题内容: 我正在尝试将接口绑定到其实现,如从配置文件中读取的那样,以便可以将其提供给IoC容器。这大致是我想做的事情: 是否有可能获得? 问题答案: 您需要将类显式传递给构造函数(并自行存储)。