MICUU
微资讯
声卡
创新2024全套教程
5.1声卡全套
创新声卡驱动
板载声卡调试全套教程
Sam机架安装
Sam机架
音效助手
专题
文档
技术文档汇总
站内文档
更多
软件
更新日志
关于
装机必备
Gramos模板
光年后台模板
Betube模板
美图
友情链接
站内导航
关于
搜索
退出登录
登录
原创
史上最全:解决tp框架cli脚本创建的文件所属root,php-fpm创建文件所属Nginx:apache导致log文件写入不了
2021-12-02
88.68w热度
tp框架cli脚本创建的文件所属root,php-fpm创建文件所属Nginx:apache导致log文件写入不了。具体场景重现如下: 每月1号,系统会报错,主要原因是无权限写入缓存文件如 runtime/log/202112/xxx.log。几经分析发现,PHP-fpm的权限也属于NginxApache,没有问题,但是创建的文件夹属于root组。 [![](http://micuer.com/data/avatar/20211202/cff86ac650273d0ab5553bb43e1461cb.png)](http://micuer.com/data/avatar/20211202/cff86ac650273d0ab5553bb43e1461cb.png) 所以,当用url形式访问的时候会报错。因为Nginx组无法操作root组下的文件。 一开始我们觉得是php-fpm的用户组不对,但是排除了。最终定位是cli脚本导致的。由于定时任务执行的cli脚本属于root组,所以创建的文件夹也属于root组,当url形式再访问的时候就无法写入了。 情况已经说明的很清楚了,具体解决办法如下: 1:cli脚本时候,当需要用的log写入的时候,可以自建一个方法。 ``` function logWrite($info, $filename = '', $path = '') { if (!$filename) { $filename = date('Ymd') .'.log'; } if (!$path) { $path = './runtime/log/'. date('Ym') .'/'; if (!is_dir($path)) { mkdir($path, 0755, true); } exec("chown apache:apache -R {$path}"); } return file_put_contents($path . $filename, $info . PHP_EOL, FILE_APPEND); } ``` 这里注意,exec函数需要开启才行。 2:定时任务 以 Nginx:Apache运行 修改定时脚本的运行机制,移动到/etc/crontab ,并指定用户为apache /etc/crontab 指定用户配置格式 * * * * * user-name command 参考:https://www.cnblogs.com/wangxiangdong/p/15068623.html 小编未做尝试。 3:修改代码底层框架 以thinkphp5示例 ``` 编辑脚本文件//thinkphp/library/think/log/driver/File.php $destination = $this->getMasterLogFile(); $path = dirname($destination); if (PHP_SAPI != 'cli') { !is_dir($path) && mkdir($path, 0755, true); }else{ !is_dir($path) && mkdir($path, 0777, true) && chmod($path, 0777); } ``` 但是上面只能修改文件夹的权限,并没有修改文件夹下具体的.log文件的权限。 【解决办法】: 修改文件:\thinkphp\library\think\log\driver\File.php里的write()函数 ``` protected function write($message, $destination, $apart = false, $append = false) { ... if (PHP_SAPI == 'cli') { $message = $this->parseCliLog($info); } else { // 添加调试日志 $this->getDebugLog($info, $append, $apart); $message = $this->parseLog($info); } //return error_log($message, 3, $destination); /** By micuer.com Start */ if (!is_file($destination)) { $first = true; } $ret = error_log($message, 3, $destination); try { if (isset($first) && is_file($destination)) { chmod($destination, 0777); unset($first); } } catch (\Exception $e) { } return $ret; /** By micuer.com End */ } ```
注:原创不易,转载请注明出处(
https://micuu.com/new/2417.html
),本站所有资源来源于网络收集,如有侵权请联系QQ245557979进行清除。
最后修改与 2022-02-22
上一篇:
时间过的快,转眼已经12月了
下一篇:
每次想写的心情相关的文章,最终也没有写完
留言反馈
请先登录
问题反馈渠道,如有软件无法下载或者其他问题可反馈。【由于某种原因,目前留言不展示】
用户需要登录后才能留言反馈
立即留言
珍藏视频
10分钟高效燃脂
30天高效瘦脸操
5分钟缓解颈椎操
友人
微博
全民K歌
唱吧
今日头条
悠悠网
科技小锅盖
彼岸桌面
阮一峰
laravel社区
V2ex
掘金
更多>