PHP fopen () не работает на файлах даже с широко открытыми разрешениями - PullRequest
9 голосов
/ 09 сентября 2011

В настоящее время я переношу свою LAMP с моего Windows Server на VPS с Debian 6. Почти все работает, однако один из сценариев PHP не смог записать в сконфигурированный файл журнала.Я не мог определить, почему, поэтому я написал новый, простой, PHP-скрипт для проверки проблемы.

<?php
        ini_set('display_errors', 1);
        error_reporting(E_ALL);
        echo exec('whoami');
        $log = fopen('/var/log/apache2/writetest/writetest.log', 'a');
        if ($log != NULL)
        {
                fflush($log);
                fclose($log);
                $log = NULL;
        }
?>

Однако, это не дает результата:

www-data Warning: fopen(/var/log/apache2/writetest/writetest.log): failed to open stream: Permission denied in /var/www/_admin/phpwritetest.php on line 5 
  • Хотя я никогда не делал бы это нормально, чтобы помочь в диагностике, я установил /var/log/apache2/writetest/writetest.log на chmod 777.
  • И каталог, и файл принадлежат www-data:www-data.
  • Файл был создан с помощью touch.

Я запустил strace, чтобы проверить, какой процесс выполнял открытие:

[pid 21931] lstat("/var/log/apache2/writetest/writetest.log", 0x7fff81677d30) = -1 EACCES (Permission denied)
[pid 21931] lstat("/var/log/apache2/writetest", 0x7fff81677b90) = -1 EACCES (Permission denied)
[pid 21931] open("/var/log/apache2/writetest/writetest.log", O_RDWR|O_CREAT|O_TRUNC, 0666) = -1 EACCES (Permission denied)

Я проверил иpid 21931 действительно был одним из дочерних процессов apache2, работающих под www-data.Как вы можете видеть, я также включил echo exec('whoami'); в скрипт, который подтвердил, что скрипт запускался www-data.

Другие примечания:

  • PHP не работает в безопасном режимережим
  • PHP open_basedir не установлен
  • Информация о версии: Apache/2.2.16 (Debian) PHP/5.3.3-7+squeeze3 with Suhosin-Patch mod_ssl/2.2.16 OpenSSL/0.9.8o
  • uname -a: 2.6.32-238.19.1.el5.028stab092.2 #1 SMP Thu Jul 21 19:23:22 MSD 2011 x86_64 GNU/Linux
  • Это на VPSработает под OpenVZ
  • ls -l (файл): -rwxrwxrwx 1 www-data www-data 0 Sep 8 18:13 writetest.log
  • ls -l (каталог): drwxr-xr-x 2 www-data www-data 4096 Sep 8 18:13 writetest
  • родительский процесс Apache2 работает под root,и дочерние процессы под www-data
  • selinux не установлены (спасибо Фабио за напоминание мне упомянуть об этом)
  • Я много раз перезапускал apache и также перезагружал сервер

Ответы [ 3 ]

13 голосов
/ 09 сентября 2011

Помните, что для доступа к файлу ВСЕ родительские каталоги должны быть доступны для чтения через www-данные. Кажется, вы выводите вывод, что даже доступ к /var/log/apache2/writetest не выполняется. Убедитесь, что www-data имеет разрешения для следующих каталогов:

  • / (r-x)
  • /var (r-x)
  • /var/log (r-x)
  • /var/log/apache2 (r-x)
  • /var/log/apache2/writetest (rwx)
  • /var/log/apache2/writetest/writetest.log (rw-)
0 голосов
/ 09 сентября 2011

Может быть проблема с SELinux, даже если Debian не поставляет ее в установке по умолчанию, которую ваш провайдер мог включить. Ищите сообщения в /var/log с

grep -i selinux /var/log/{syslog,messages}

Если это причина, и вам необходимо отключить ее, вот инструкции: найдите файл /etc/selinux/config, здесь это содержимое по умолчанию. Измените директиву SELINUX на disabled и перезагрузите систему.

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#   enforcing - SELinux security policy is enforced.
#   permissive - SELinux prints warnings instead of enforcing.
#   disabled - SELinux is fully disabled.
SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:
#   targeted - Only targeted network daemons are protected.
#   strict - Full SELinux protection.
SELINUXTYPE=targeted
0 голосов
/ 09 сентября 2011

Правильно ли установлены права доступа для файла php, выполняющего запись?Попробуйте изменить их, чтобы понять, в этом ли проблема.

...