php访问项目外文件

前言:docker中做日志服务,因为镜像会随build消失,日志如果在项目里,也会消失,临时解决方法,把日志写在项目外的根目录下的logs文件夹中,挂载出来,结果死活写不进。

以下是网上搜的19个关键字,解决办法随着搜索的逻辑一点点出来的

  1. php 无法写入非项目目录下的文件
  2. php 写项目外的目录
  3. php怎么访问本地根目录外的文件
  4. php读取站外目录
  5. php 如何访问网站根目录以外的文件
  6. php可以访问/tmp
  7. php 日志文件写入项目外
  8. php访问项目外文件
  9. php 写入项目外的文件夹
  10. php 项目外文件夹的权限
  11. linux下 php访问项目外文件夹
  12. nginx open_basedir不生效
  13. php设置open_basedir,重启服务后不生效
  14. lnmp中遇到open_basedir配置无效问题
  15. “message”: “opendir(): open_basedir restriction in effect. File
  16. File(/) is not within the allowed pat
  17. LNMP下防跨站、跨目录安全设置
  18. php 如何进行环境隔离
  19. 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]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。