【问题标题】:PHP: Different results with is_readable() between CLI and ApachePHP:CLI 和 Apache 之间的 is_readable() 结果不同
【发布时间】:2015-12-22 05:48:12
【问题描述】:

当使用 is_readable() 函数获取本地文件是否可读时,从浏览器运行时获得的结果与从命令行运行时不同。

脚本使用:

<?php
var_dump(php_ini_loaded_file());
var_dump(phpversion());
var_dump(posix_getuid());
var_dump(is_readable('/dev/shm/rrds'));
?>

我正在检查相同的 php.init 文件、phpversion 和用户,全部相等,但仍然从浏览器获取 is_readable() 为 false,从 cli 获取 true。

浏览器输出:

string(12) "/etc/php.ini" string(5) "5.3.3" int(48) bool(false)

CLI 输出

string(12) "/etc/php.ini"
string(5) "5.3.3"
int(48)
bool(true)

/dev/shm/rrds 的权限:drwxr-xr-x。

/dev/shm 作为 tmpfs 挂载在 /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")

有人知道为什么吗?!

【问题讨论】:

  • 使用浏览器执行时,is_readable 也应该返回 true...

标签: php linux file


【解决方案1】:

Apache 用户是 www-data。 Cli 用户是运行命令的用户。

识别运行cli命令的用户

whoami

从 www-data 运行命令

sudo -u www-data command

【讨论】:

  • 由于 posix_getuid() 获得了相同的 ID,我使用的是同一个用户,即我系统中的 apache。
  • posix_getuid — 返回当前进程的真实用户 ID。您的 cli 用户不是 www-data。如果您通过 root 用户 posix_getuid 运行脚本,则返回 root 用户的 uid,而不是 apache。
  • 我的 apache 服务器配置了“User apache”,所以使用的是 apache 用户。在我的系统中,www-data 不存在...
  • 你说得对。检查你的 apache 配置,禁用模块 suexec、userdir 和类似的。
  • 在 apache 配置中也将 open_basedir 设置为“none”
【解决方案2】:

最后是 SELinux。我需要禁用它!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2018-07-30
    • 2020-11-03
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多