【问题标题】:How to fix "touch(): Utime failed: Operation not permitted" on saving cache with symfony?如何在使用 symfony 保存缓存时修复“touch(): Utime failed: Operation not allowed”?
【发布时间】:2019-12-15 02:04:37
【问题描述】:

我想用 symfony\cache 缓存一些响应。但是我的缓存有一些错误,有时 symfony 默认缓存也有问题。

配置:

关于 vagrant 的 Debian 9(带有指向源代码目录的 vagrant bindfs 链接) 使用 Apache2
php 7.2 / symfony 4.1
启用 apcu

为了缓存我的响应,我将 FilesystemAdapter 与 dir {projectDir}/var/cache/{env}/api-cache 和命名空间 app.cache 一起使用

var/cache/

drwxrwxrwx 24 vagrant www-data 768 Apr 24 09:09 dev/
drwxrwxrwx 13 vagrant www-data 416 Apr 18 16:02 test/

var/cache/dev/

-rw-rw-rw-   1 vagrant www-data  165 Apr 24 09:09 annotations.map
-rw-rw-rw-   1 vagrant www-data  12K Apr 24 09:09 annotations.php
drwxrwxrwx   3 vagrant www-data   96 Apr 23 17:47 api-cache/
drwxrwxrwx 399 vagrant www-data  13K Apr 23 17:46 ContainerBrT4sD3/
-rw-rw-rw-   1 vagrant www-data    0 Apr 24 09:07 ContainerBrT4sD3.legacy
drwxrwxrwx 404 vagrant www-data  13K Apr 24 09:09 ContainerSaE63B9/
drwxrwxrwx   3 vagrant www-data   96 Apr 23 17:46 doctrine/
drwxrwxrwx   6 vagrant www-data  192 Apr 23 17:47 jms_serializer/
drwxrwxrwx   5 vagrant www-data  160 Apr 24 09:07 pools/
-rw-rw-rw-   1 vagrant www-data 220K Apr 24 09:09 srcDevDebugProjectContainerCompiler.log
-rw-rw-rw-   1 vagrant www-data 1.1K Apr 24 09:09 srcDevDebugProjectContainerDeprecations.log
-rw-rw-rw-   1 vagrant www-data  767 Apr 24 09:09 srcDevDebugProjectContainer.php
-rw-rw-rw-   1 vagrant www-data  58K Apr 24 09:09 srcDevDebugProjectContainer.php.meta
-rw-rw-rw-   1 vagrant www-data  49K Apr 23 17:46 srcDevDebugProjectContainerUrlGenerator.php
-rw-rw-rw-   1 vagrant www-data 5.4K Apr 23 17:46 srcDevDebugProjectContainerUrlGenerator.php.meta
-rw-rw-rw-   1 vagrant www-data  78K Apr 23 17:46 srcDevDebugProjectContainerUrlMatcher.php
-rw-rw-rw-   1 vagrant www-data 5.4K Apr 23 17:46 srcDevDebugProjectContainerUrlMatcher.php.meta
-rw-rw-rw-   1 vagrant www-data 519K Apr 24 09:09 srcDevDebugProjectContainer.xml
-rw-rw-rw-   1 vagrant www-data  58K Apr 24 09:09 srcDevDebugProjectContainer.xml.meta
drwxrwxrwx 108 vagrant www-data 3.4K Apr 23 17:46 translations/
drwxrwxrwx 142 vagrant www-data 4.5K Apr 24 09:09 twig/
-rw-rw-rw-   1 vagrant www-data   91 Apr 24 09:09 validation.php

默认 symfony 代码的日志:

 cache.WARNING: Failed to save key "%5B%5BC%5DApp%5CEntity%5CReport%5CReportItem%24hasBeenPushed%5D%5B1%5D" (integer) {"key":"%5B%5BC%5DApp%5CEntity%5CReport%5CReportItem%24hasBeenPushed%5D%5B1%5D","type":"integer","exception":"[object] (ErrorException(code: 0): touch(): Utime failed: Operation not permitted at /vagrant-bindfs/vendor/symfony/cache/Traits/FilesystemCommonTrait.php:90)"} []

使用我的代码记录:

php.DEBUG: User Warning: Failed to save key "my_tag" (string) {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\SilencedErrorContext: {\"severity\":512,\"file\":\"/vagrant-bindfs/vendor/symfony/cache/CacheItem.php\",\"line\":184,\"trace\":[{\"file\":\"/vagrant-bindfs/vendor/symfony/cache/Adapter/AbstractAdapter.php\",\"line\":242,\"function\":\"log\",\"class\":\"Symfony\\\\Component\\\\Cache\\\\CacheItem\",\"type\":\"::\"}],\"count\":1})"} []
app.ERROR: Cache not save : my_tag [] []

当我在 Symfony\Component\Cache\Adapter\AbstractAdapter->commit() 中记录有关异常的一些信息时,我得到了这个: 错误异常 touch(): Utime failed: Operation not permitted

我已经搜索了解决方案,但没有任何效果。 我认为这是缓存目录的正确问题,可能是 vagrant 和 vagrant-binfs 的问题,但我不明白。

我可以做/检查什么来解决这个问题?

【问题讨论】:

    标签: php symfony caching


    【解决方案1】:

    如果您碰巧使用 FAT/FAT32 或其他时间戳范围受到严格限制的文件系统,那么该警告是意料之中的。

    Symfony 的 FilesystemCommonTrait::write() 方法使用 unix 时间戳 0 调用 touch() 函数来强制缓存内容过期。 Unix 时间戳 0 代表 1970-01-01 日期。根据维基百科,在 FAT 文件系统中,允许的时间戳范围是 1980-01-01 到 2099-12-31。所以touch()函数失败并发出警告。

    解决方法是修改 FilesystemCommonTrait::write() 方法,在第 80 行附近。

    找线:

    if (null !== $expiresAt) {
        touch($this->tmp, $expiresAt);
    }
    

    在这些行之前插入:

    if (0 === $expiresAt) {
        $expiresAt = time() - 1;
    }
    

    这应该通过立即使缓存内容过期来实现几乎相同的结果,但不使用无效的文件系统时间戳。

    或者,更改文件系统类型。

    【讨论】:

      猜你喜欢
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 2019-07-24
      相关资源
      最近更新 更多