【问题标题】:PHP file_exists() function returns false on /usr/bin/mysqlPHP file_exists() 函数在 /usr/bin/mysql 上返回 false
【发布时间】:2012-12-06 07:24:00
【问题描述】:

我已经阅读了很多关于这个问题的帖子,但没有一个完全符合我的问题。我在 GoDaddy 虚拟主机上有一个 WordPress 网站(目前是 3.5)。 11 月,我选择将 O/S 从 CentOS 5 升级到 CentOS 6.3,这涉及到完全的 O/S 重新安装,对此我无法控制,也没有任何信息。在重新安装 O/S 之后,我从开始之前的备份中重建了站点。

重建后,我们使用多年的 WordPress 插件 WP-DBManager 突然停止备份我们的 mysql 数据库。备份失败,因为备份面板声称“MYSQL 路径不存在”。令人讨厌的是,当您进入 DB Options 页面并告诉它自动检测 mysql 路径时,选项页面会生成 /usr/bin/mysql,这是正确的。我可以使用 SSH 登录该站点,它就在那里。权限是:

-rwxr-xr-x 1 root root 338184 Jun 22 05:58 /usr/bin/mysql

这应该有效。我的网站权限中的某些内容随着这次重建而改变,我不知道是什么;到目前为止,我只记录了 WordPress 配置。我所做的研究表明这可能与 PHP 安全模式有关。我们运行 PHP 5.3.3,来自 phpinfo() 的配置列表不显示

--enable-safe-mode

这意味着应该关闭安全模式。启动时 php.ini 中的安全模式设置为:

safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH
safe_mode_exec_dir = 
safe_mode_include_dir = 
safe_mode = off
safe_mode_gid = off

我已将 safe_mode_gid 更改为 ON,但没有任何效果。我有一个从生产站点构建的测试站点,其中 safe_mode_include_dir = ~ 所以我尝试了,但没有效果。测试站点运行 PHP 5.3.14,除了 safe_mode_include_dir 之外,上面的安全模式设置相同。我检查了 ENV 变量并且 /usr/bin 包含在 PATH 中:

PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/lrservice/bin

我不知道这是否是环境变量问题,这里是安全模式条目:

safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH

这些设置在工作测试站点上并不完全相同,其中写道:

safe_mode_allowed_env_vars = PHP_ LANG LANG_

由于网站除此之外功能齐全,我知道mysql的权限通常是正确的。这会为任何人敲响警钟吗?如果安全模式被正式关闭,为什么我会得到这一切?我有一种感觉,我遗漏了一些明显而愚蠢的东西。

【问题讨论】:

  • /usr/bin 和 /usr 的权限是什么?
  • 试试:if (stream_resolve_inlcude_path('/usr/bin/mysql'))
  • @cryptic 你的意思是stream_resolve_include_path
  • 如果可能的话,这个问题应该移到serverfault。

标签: php permissions


【解决方案1】:

您可以从/usr/bin 目录中的ssh 会话访问mysql 二进制文件,但php 无法在同一位置找到它。 我假设您的系统正在使用 apache2 网络服务器。

ChrootDir 指令是否存在于 apache 配置文件中(通常位于 /etc/httpd/conf/httpd.conf)?

如果是这种情况,您可以检查该指令指向的目录是否有指向 mysql 二进制文件的链接。如果没有,只需在 ssh 会话中执行以下命令(假设您有这样做的权限)来添加它:

$ ln /usr/bin/mysql /chroot/path/usr/bin/mysql

/chroot/path 替换为ChrootDir 指令路径。


其中一个 cmets 提到了 open_basedir PHP setting,可以在 php.inihttpd.conf.htaccess 中进行配置 文件。

此设置限制对 PHP 可用的文件系统的某些目录的访问。如果该设置不受保护,一个可能的解决方法是取消对您正在使用的插件执行的脚本的此限制:

  • 在您的 wordpress 目录中找到插件安装的脚本,
  • 使用以下命令在包含脚本的目录中创建一个 .htaccess 文件以解除限制:

    $ echo 'php_value open_basedir none' >> .htaccess

上面将在 .htaccess 文件末尾添加简单引号之间的文本,如有必要,请创建它。 此解决方案可能是最安全的,因为它降低了仅对这些脚本的安全性。您应该小心,您将让这些脚本可能访问比它们真正需要操作的更多内容。

如果上述方法不起作用,则表示该设置受到保护,必须在 httpd.confphp.ini 中进行更改,两者都应位于在/etc 目录中。有关详细信息,请参阅此SO question

【讨论】:

  • 还可以设置 php.ini open_basedir 指令
  • 回答几个问题,这里是 /usr 和 /usr/bin 的权限: drwxr-xr-x 13 root root 4096 Sep 28 2011 usr
  • 回答@cryptic 的问题,这里是/usr 和/usr/bin 的权限:
    drwxr-xr-x 13 root root 4096 Sep 28 2011 usr drwxr-xr-x 2 root root 20480 Nov 11 15:21 bin 我将查看 stream_resolve_include_path 命令。 httpd.conf 中不存在 ChrootDir 指令,当我尝试 cd 到 /usr/bin/mysql 时,bash 告诉我它不是目录。 (哦。这就是它在 ExtraPutty 中加粗的原因。它是一个符号链接。)我正在运行 Apache 2.2.15。设置了 php open_basedir 指令,它是 open_basedir = "/var/www/vhosts/lifering.org/:/tmp/"
  • @hedera dualed 找到原因了,补救方法和我一样,做个链接,或者复制文件。
  • 我想可能就是这样。所以我需要 /tmp 目录中的 /usr/bin/mysql 的符号链接?复制文件似乎有风险。
猜你喜欢
  • 2013-06-30
  • 2012-09-02
  • 2011-06-05
  • 2017-08-15
  • 2013-10-12
  • 1970-01-01
  • 2015-09-14
  • 2012-02-23
  • 2016-01-13
相关资源
最近更新 更多