关于 file 缓存,偶尔出现 file_put_contents () error 的疑惑

环境:LNMP;PHP 版本7.0;Laravel 版本5.5.40。uclound 云服务器。代码管理 git。

异常表现:
偶见的, file_put_contents() 错误,failed to open stream: No such file or directory;有时一天内能出现4-5次,有时候接连几天都不会出现。

    [2018-09-13 19:52:29] production.ERROR: file_put_contents(/var/www/blog/storage/framework/cache/data/61/66/61662d13be54459cafad9d52f19137b34a4d42c9): failed to open stream: No such file or directory {"exception":"[object] (ErrorException(code: 0): file_put_contents(/var/www/blog/storage/framework/cache/data/61/66/61662d13be54459cafad9d52f19137b34a4d42c9): failed to open stream: No such file or directory at /var/www/blog/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:122)"} 

猜测可能出现的原因:
1.storage 目录权限问题【改为777权限,依然偶尔会报出该异常】
2.inode 耗尽 【inode 足够,使用不到11%】
3.磁盘空间不够 【硬盘空间足够】
4.服务器不支持共享锁 【参见阿里云 部分服务器不支持共享锁 ,file_put_contents($path, $contents, $lock ? LOCK_EX : 0); LOCK_EX 改为LOCK_SH, 依然无效】
5.缓存问题。 执行了 php artisan cache:clear
6.log文件日志过大问题。【log文件不到 4KB】
7.目录不存在问题。【查看 /var/www/blog/storage/framework/cache/data/61/66/61662d13be54459cafad9d52f19137b34a4d42c9 目录及文件存在, 查看目录及文件生成时间 和 laravel 报错时间一致, 精确到秒】

    代码上传方式
        `git pull
        sudo -u nginx php artisan migrate
        sudo -u nginx php artisan config:clear
        sudo -u nginx php artisan cache:clear
        sudo -u nginx php artisan route:clear
        sudo -u nginx php artisan optimize`

该问题,虽然发生频率比较低不影响正常生产,不过依然很烦人。排查半天无果,希望能得到帮助。非常感谢。

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 14

@Shawngu 以上方法都不能一劳永逸解决的。其根本原因在于,我们有时候使用root账号去执行命令,生成的日志文件拥有者是root,而通过浏览器访问时,使用的账号是www-data,而该用户没有前面root拥有的文件的读取权限。好在Laravel5.6有个改进可以很简单解决这个问题,在config/cache.php文件中的file键,添加权限配置,如:

 'file' => [
            'driver' => 'file',
            'path' => storage_path('framework/cache/data'),
            'permission' => 0664,   // 新添加的,权限为rw-rw-r,即所有用户都可读取
        ],

这时,我们使用root账号运行artisan命令时,生成的文件是这样子的:

file
www-data也有了访问权限。
相关commit:https://github.com/laravel/framework/commi...

4年前 评论
zozero 2年前

有可能是上传文件超过 php 文件上传大小限制,你改大点试试

5年前 评论

@yanthink 非常感谢你的回复。这个是普通数据查询而已,与上传文件是无关的。

5年前 评论

@shuaili 我刚测试了一下,你这个和 上传文件超过 php 文件上传大小限制的 错误提示好像确实不一样

file

不过我把限制调大了就可以了

file

5年前 评论
csm668

老哥我想知道这问题解决了么

5年前 评论
tenacity

同样遇到这个问题 ,偶尔出现 ,诡异得很,不知从何下手

5年前 评论

项目目录的 storage 文件夹没有写入权限。在项目目录执行 chmod -R 777 storage

4年前 评论

也遇到这个问题了,找到什么原因造成的吗

4年前 评论

我也碰到了一样的问题

4年前 评论
EthanYep

我也遇到了相同的问题

我在网上查找了相关资料,最后找到了解决办法

执行下面的方法即可

php artisan config:cache
4年前 评论

有人解决了这个问题吗?还是偶尔会报这个错 :cry:

4年前 评论

同样遇到这个问题啊,有人解决了没

4年前 评论

@Shawngu 以上方法都不能一劳永逸解决的。其根本原因在于,我们有时候使用root账号去执行命令,生成的日志文件拥有者是root,而通过浏览器访问时,使用的账号是www-data,而该用户没有前面root拥有的文件的读取权限。好在Laravel5.6有个改进可以很简单解决这个问题,在config/cache.php文件中的file键,添加权限配置,如:

 'file' => [
            'driver' => 'file',
            'path' => storage_path('framework/cache/data'),
            'permission' => 0664,   // 新添加的,权限为rw-rw-r,即所有用户都可读取
        ],

这时,我们使用root账号运行artisan命令时,生成的文件是这样子的:

file
www-data也有了访问权限。
相关commit:https://github.com/laravel/framework/commi...

4年前 评论
zozero 2年前

同样遇到这个问题 发现是ThrottleRequests hit的时候报的错
尝试过cache:clear
尝试过修改LOCK_EX => LOCK_SH
fpm权限确认正常 nginx权限确认正常
尝试过config/cache.php 修改permission
无果。。

4年前 评论

@JohnYep 你的解决了我的问题,我改动config配置,忘了清缓存了

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!