Laravel项目部署后,出现 file_put_contents ()

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 问题: 部署博客,服务器经常500排查:查看laravel日志: file_put_contents () ,failed to open stream: No such file or directory;

问题: 部署博客,服务器经常500

排查:查看laravel日志file_put_contents () ,failed to open stream: No such file or directory;

02fbd4e298cac38ef479c7e51abd4d24_articles_1587561194_dWPNvcV9sH.png

出现几率为偶尔性,不常出现;

结合百度搜索,猜测可能出现的原因:

  • storage 目录权限问题【已赋予:storage、bootstrap/cache文件夹 777权限,还是会报错】
  • inode 耗尽 【inode 足够,使用不到 10%】
  • 磁盘空间不够 【硬盘空间足够】
  • 服务器不支持共享锁 【参见阿里云 部分服务器不支持共享锁 ,file_put_contents ($path, $contents, $lock ? LOCK_EX : 0); LOCK_EX 改为 LOCK_SH, 依然无效】
  • 缓存问题。 执行了 php artisan cache:clear
  • log 文件日志过大问题。【log 文件不到 4KB】
  • 目录不存在问题。【查看 /storage/framework/cache/data/61/66/61662d13be54459cafad9d52f19137b34a4d42c9 目录及文件存在, 查看目录及文件生成时间 和 laravel 报错时间一致, 精确到秒】

按照上述步骤解决后,还是会偶尔性出现;

于是便查看storage/logs文件,看到log文件属于 root 权限;

为什么是log会是 root 创建的,而不是 www 创建的???

明明用chmod给过权限,为什么是log会是 root 创建的

发现问题根源

经过筛查,原来

  • 在项目文件夹中有些文件权限不是www,而是root权限(storage/logs/laravel.log文件不是www权限而是root权限,可用ll命令查看当前目录下文件的权限)
  • 执行 crontab 的命令,在定时器中有报错,所以在定时器中生成了日志,故权限为 root
  • 是在root用户下执行命令,文件相关权限就会变成root(包括git、php artisan 、mkdir 、touch等);

如何修复

排查是什么文件引起的,可以在项目目录中查看当前目录下文件的权限(重点看storage文件夹下的相关文件)

#当前目录下文件的权限
ll
#当前目录下文件的权限


查找出为什么文件会是 root 创建的原因(我这里是因为 crontab 的命令的问题)

让日志文件,在定时任务中不要以 root 的形式执行

crontab -u www -e ;


执行完命令后执行,把所有者改为 www

chown -R www:www * .*


2022年更新

如果你的项目是刚刚部署,出现这个状态且都不是上面的问题;

那么你可以打开项目下 storage/framework/cache/data 文件夹看是否权限为 664

如果是 644 则直接修改 config/cache.php

...
'file' => [
    'driver' => 'file',
    'path' => storage_path('framework/cache/data'),
    'permission' => 0664,
],
// 将 0664 改为 0775
'file' => [
    'driver' => 'file',
    'path' => storage_path('framework/cache/data'),
    'permission' => 0775,
],
...


最后一定记得运行命令

php artisan config:cache
php artisan cache:clear

问题总结

Laravel 在使用 Cache 时使用了 file 类型,然后 file 使用的是 0664 导致 www 用户无法执行 Cache 下的文件。

当然你可以可以将 Cache 类型换成:RedisMemcached

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
遇到Error saving license data.C:\Users|yyh\idea.key(拒绝访问。) CORP\AppDatalRoamingVetBrainslIntellilldea20的解决思路
今日进行云桌面迁移后,发现已激活的IDEA软件失效,并且每次启动都需要重新激活,极为不便。经过一番调查与尝试多种解决方案后,最终通过第4种方法解决了问题:先进入特定设置界面移除原有激活信息,再重新输入激活码完成激活过程,从而确保下次启动不再需要重复激活步骤。
|
Linux
svn踩坑-xxx is not valid as filename in directory
svn踩坑-xxx is not valid as filename in directory
107 0
|
缓存 前端开发 PHP
PHP - Laravel The stream or file “/storage/logs/.“ could not be opened in append
PHP - Laravel The stream or file “/storage/logs/.“ could not be opened in append
519 0
|
Web App开发 XML 算法
file_put_contents利用技巧(php://filter协议)
file_put_contents利用技巧(php://filter协议)
379 0
|
移动开发 PHP
file_put_contents追加 一个很简单的php记录日志的函数
$str="我是日志内容!"; $str=$str.date("Y-m-d H:i:s",time())."\r\n"; file_put_contents('log.txt',$str,FILE_APPEND); file_put_contents() 的行为实际上等于依次调用 fopen(),fwrite() 以及 fclose() 功能一样。 FILE_APPEND:在文件末尾以追加的方式写入数据 ———————————————— 版权声明:本文为CSDN博主「娃娃菜001」的原创文章,遵循CC
244 0
file_put_contents追加 一个很简单的php记录日志的函数
|
前端开发
前端 ✘ http://eslint.org/docs/rules/quotes Strings must use singlequote 报错解决方法
前端 ✘ http://eslint.org/docs/rules/quotes Strings must use singlequote 报错解决方法
314 0
|
Go PHP
go file_put_contents,go语言file_put_contents,go file_get_contents,go语言file_get_contents
go file_put_contents,go语言file_put_contents,go file_get_contents,go语言file_get_contents
314 0
|
JavaScript
解决ecshop出现Warning: file_put_contents
解决ecshop出现Warning: file_put_contents
274 0
|
JavaScript PHP 前端开发
PHPStorm File and Code Template
有时候我们想新建某类型文件的时候,默认出现一些基础代码,而不是空白的。 比如当新建一个 html 文件 基础代码是这样的: 同理,当新建php文件,我希望是这样:
1407 0