Php “如何修复”;touch():Utime失败:不允许操作;关于使用symfony保存缓存?
我想用symfony\cache缓存一些响应。但是我的缓存和symfony默认缓存都有一些错误 配置: vagrant上的Debian 9(带有到源代码目录的vagrant bindfs链接) 使用Apache2Php “如何修复”;touch():Utime失败:不允许操作;关于使用symfony保存缓存?,php,symfony,caching,Php,Symfony,Caching,我想用symfony\cache缓存一些响应。但是我的缓存和symfony默认缓存都有一些错误 配置: vagrant上的Debian 9(带有到源代码目录的vagrant bindfs链接) 使用Apache2 php 7.2/symfony 4.1 已启用apcu 为了缓存我的响应,我使用带有dir{projectDir}/var/cache/{env}/api cache和namespace app.cache的FilesystemAdapter 变量/缓存/ drwxrwxrwx 24
php 7.2/symfony 4.1
已启用apcu 为了缓存我的响应,我使用带有dir{projectDir}/var/cache/{env}/api cache和namespace app.cache的FilesystemAdapter 变量/缓存/
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失败:不允许操作
我已经找到了一个解决方案,但没有任何效果。
我认为这是缓存目录上的一个问题,可能是vagrant和vagrant binfs的问题,但我不理解
我可以做什么/检查来解决这个问题?如果您碰巧使用FAT/FAT32或另一个时间戳范围非常有限的文件系统,那么该警告是意料之中的 Symfony的
FilesystemCommonTrait::write()
方法调用unix时间戳为0的touch()
函数强制使缓存内容过期。Unix时间戳0表示1970-01-01日期。根据维基百科,在FAT文件系统中,允许的时间戳范围是1980-01-01到2099-12-31。因此,touch()
功能失败并发出警告
解决方法是修改第80行附近的FilesystemCommonTrait::write()
方法
查找行:
if (null !== $expiresAt) {
touch($this->tmp, $expiresAt);
}
在这些行之前插入:
if (0 === $expiresAt) {
$expiresAt = time() - 1;
}
通过立即使缓存内容过期,但不使用无效的文件系统时间戳,这将实现几乎相同的结果
或者,更改文件系统类型