如何修复“ touch():Utime失败:不允许操作”用symfony保存缓存? [英] How to fix "touch(): Utime failed: Operation not permitted" on saving cache with symfony?
问题描述
我想用symfony\cache缓存一些响应。但是我的缓存和symfony默认缓存有时会出错。
I want to caching some response with symfony\cache. But I've got some error with my cache and sometime with the symfony default cache.
配置:
Debian 9在vagrant上(通过vagrant的bindfs链接到源代码目录)
和Apache2
php 7.2 / symfony 4.1
apcu已启用
Debian 9 on vagrant (with vagrant bindfs link to source code directory)
with Apache2
php 7.2 / symfony 4.1
apcu enabled
要缓存我的响应,我使用FilesystemAdapter和dir {projectDir} / var / cache / {env} / api-cache和命名空间app.cache
For caching my response I use the FilesystemAdapter with dir {projectDir}/var/cache/{env}/api-cache and namespace app.cache
var / 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 /
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代码:
Log for default symfony code :
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\组件\缓存\适配器\AbstractAdapter-> commit()中记录了有关该异常的一些信息:
ErrorException
touch():Utime失败:不允许操作
When I log some information about the exception in Symfony\Component\Cache\Adapter\AbstractAdapter->commit() I got this :
ErrorException
touch(): Utime failed: Operation not permitted
我已经搜索了解决方案,但没有任何效果。
我认为这是缓存目录上的问题,也许是vagrant和vagrant-binfs的问题,但我不明白。
I already search a solution but nothing works. I think it's a problem of right on the cache directories and maybe a problem with vagrant and vagrant-binfs but I do not understand it.
我该怎么办?做/检查解决这个问题?
What can I do/check to solve this ?
推荐答案
如果您碰巧使用FAT / FAT32或时间戳范围受到严格限制的其他文件系统,
If you happened to use FAT/FAT32 or another file system with severely limited timestamp range, then that warning is to be expected.
Symfony的 FilesystemCommonTrait :: write()
方法调用 touch()
函数(unix时间戳为0)强制过期缓存的内容。 Unix时间戳0代表1970-01-01日期。根据Wikipedia,在FAT文件系统中,允许的时间戳范围是1980-01-01至2099-12-31。因此, touch()
函数失败并发出警告。
Symfony's FilesystemCommonTrait::write()
method calls touch()
function with unix timestamp 0 to force expire cached content. Unix timestamp 0 represents 1970-01-01 date. In FAT file system the allowed timestamp range is 1980-01-01 to 2099-12-31, according Wikipedia. So the touch()
function fails and a warning is issued.
解决方法是修改 FilesystemCommonTrait :: write()
方法,在第80行附近。
The workaround is to modify the FilesystemCommonTrait::write()
method, around line 80.
查找行:
if (null !== $expiresAt) {
touch($this->tmp, $expiresAt);
}
在这些行之前插入:
if (0 === $expiresAt) {
$expiresAt = time() - 1;
}
这应该通过立即使缓存的内容过期而获得几乎相同的结果,但是没有使用无效的文件系统时间戳记。
This should achieve virtually the same result by instantly expiring the cached content, but without using an invalid file system timestamp.
或者,更改文件系统类型。
Alternatively, change the file system type.
这篇关于如何修复“ touch():Utime失败:不允许操作”用symfony保存缓存?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!