Функция PHP file_exists() возвращает false в/usr/bin/mysql

Я прочитал многочисленные сообщения по этой проблеме, и ни одна из них не соответствует моей проблеме. У меня есть сайт WordPress (в настоящее время 3.5) на виртуальном хосте GoDaddy. В ноябре я решил обновить O/S от CentOS 5 до CentOS 6.3, в котором была задействована полная переустановка O/S, над которой у меня не было контроля и о которой у меня не было никакой информации. После переустановки O/S я перестроил сайт из резервной копии, которую я сделал непосредственно перед запуском.

После восстановления, плагин WordPress, который мы использовали в течение многих лет, WP-DBManager внезапно прекратил резервное копирование нашей базы данных mysql. Резервное копирование завершается сбоем, поскольку панель резервного копирования утверждает, что "путь MYSQL не существует". Раздражающе, когда вы переходите на страницу "Параметры БД" и говорите ему, чтобы автоматически определить путь mysql, страница параметров создает /usr/bin/mysql, что является правильным. Я могу войти на сайт с SSH, и вот он. Разрешения:

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

СЛЕДУЕТ работать. SOMETHING в моих разрешениях сайта изменился с этой перестройкой, и я не знаю, что; до сих пор я только документировал конфигурации 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/локальные/бен:/бен:/USR/бен:/USR/локальные/SBIN:/USR/SBIN:/SBIN:/Главная/lrservice/бен

Я не знаю, является ли это проблемой переменной окружения, вот записи безопасного режима для этого:

safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH

Эти настройки не все одинаковы на рабочем тестовом сайте, и вы читаете:

safe_mode_allowed_env_vars = PHP_ LANG LANG_

Поскольку сайт полностью работоспособен, кроме этого, я знаю, что разрешения mysql, как правило, правильны. Это звонит какой-нибудь звонок для кого-то? Почему я получаю все это, если безопасный режим официально отключен? У меня есть ощущение, что есть что-то очевидное и глупое, что мне не хватает.

Ответ 1

У вас есть доступ к двоичному файлу mysql из сеанса ssh в каталоге /usr/bin, но php не может найти его в том же месте. Я предполагаю, что ваша система использует веб-сервер apache2.

Указывает ли директива ChrootDir в файле конфигурации apache (обычно находится в /etc/httpd/conf/httpd.conf)?

Если это случай, вы можете проверить каталог, указанный этой директивой, если есть ссылка на двоичный файл mysql. Если нет, просто добавьте его, выполнив следующую команду (если у вас есть привилегии для этого) в сеансе ssh:

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

с /chroot/path заменяется директивой ChrootDir.


В одном из комментариев упоминается параметр open_basedir PHP, который можно настроить либо в php.ini, httpd.conf, либо в .htaccess файлы.

Этот параметр ограничивает доступ к определенному каталогу файловой системы, доступному для PHP. Возможное исправление заключается в том, чтобы удалить это ограничение для скриптов, выполняемых используемым вами плагином, если этот параметр не защищен:

  • найдите скрипты, установленные плагином в вашем каталоге wordpress,
  • создайте файл .htaccess, отменив ограничение в каталоге, содержащем скрипты, со следующими командами:

    $echo 'php_value open_basedir none' → .htaccess

Вышеприведенный текст добавит текст между простой цитатой в конце файла .htaccess, создав его, если необходимо. Это решение, вероятно, является самым безопасным, так как оно снижает безопасность, ограничиваясь только этими сценариями. Вы должны опасаться, что вы дадите эти сценарии потенциально доступ к гораздо большему, чем они действительно должны работать.

Если вышеуказанное не работает, это означает, что этот параметр защищен и должен быть изменен либо в httpd.conf, либо в php.ini, который должен находиться как в каталоге /etc. См. Этот вопрос SO для деталей.