前言:docker中做日志服务,因为镜像会随build消失,日志如果在项目里,也会消失,临时解决方法,把日志写在项目外的根目录下的logs文件夹中,挂载出来,结果死活写不进。
以下是网上搜的19个关键字,解决办法随着搜索的逻辑一点点出来的
- php 无法写入非项目目录下的文件
- php 写项目外的目录
- php怎么访问本地根目录外的文件
- php读取站外目录
- php 如何访问网站根目录以外的文件
- php可以访问/tmp
- php 日志文件写入项目外
- php访问项目外文件
- php 写入项目外的文件夹
- php 项目外文件夹的权限
- linux下 php访问项目外文件夹
- nginx open_basedir不生效
- php设置open_basedir,重启服务后不生效
- lnmp中遇到open_basedir配置无效问题
- “message”: “opendir(): open_basedir restriction in effect. File
- File(/) is not within the allowed pat
- LNMP下防跨站、跨目录安全设置
- php 如何进行环境隔离
- laravel日志写到项目外
从不报错到报错
有的时候,不报错才是最难的,首先,文件写不进,肯定有异常,异常不显示,肯定是关闭了报错信息。
ini_set('error_reporting',E_ALL);ini_set('display_errors',1);
先把报错打印出来。
从nginx权限开始
接受参数的第一步是nginx提供服务的80端口,是否是nginx用户所在用户组没有权限呢?查看nginx.conf,发现一切正常,查看fastcgi.conf,最底部有PHP的配置,fastcgi_param PHP_ADMIN_VALUE "open_basedir=/logsa/";。前面加个#号注释掉,继续。
文件夹是否有写权限
chmod 777 /logs,这个权限安排的明明白白。
php.ini配置(解决方法)
[PATH=/home/www/shop] open_basedir=/home/www/shop/:/tmp/:/logs/
两种任选一种,上面是绝对路径,下面是host映射
[HOST=test.cn] open_basedir=/home/www/shop/:/tmp/:/logs/
重启后解决。
难点在2个,1是很久不开debug了,2是我用的环境是docker,给排查增加了一层难度。刚开始还以为是挂载的问题呢。其实docker就是一个独立的系统,路径就是/home/root之类的。windows下的C:\D:\在docker里写入,肯定是not found。
后续
查看PHP手册,发现这两种配置是在PHP5.3中新增的,叫做配置段列表。可以为自己指定的域名或者路径配置独特的PHP.ini配置。
比如a.com可以设置display_error=off和上面的全局配置不冲突并且在此域名下优先级更高。
这仅在CGI/FASTCGI模式下生效,并且可以在nginx的fastcgi_params里设置。
PS,这也让我找到了不生效的问题所在,在nginx.conf里,我的server使用fastcgi_params来配置了open_basedir。
所以优先级为php.ini<nginx.conf<fastcgi.conf<[PATH]or[HOST]