2016-11-16 6 views
5

Я пытаюсь понять, почему Apache все еще может обслуживать PHP-файл после того, как я установил разрешения 000 и предоставил право собственности на файл.Apache все еще обслуживает PHP-файл с некорректными разрешениями

Если я создаю файл PHP, принадлежащий веб-серверу с разрешениями 644, его обслуживание выполняется правильно. Если я затем изменю разрешения на 000 и изменим права собственности на root, файл все равно будет обслуживаться, но я не думаю, что это должно быть!

Если я перезапустил Apache, файл не будет обслуживаться. Я получаю 500, и журнал ошибок ворчит о том, что вы не можете открыть файл, и это именно то, что я ожидал.

После перезагрузки, когда файл не будет обслуживаться, если я вернусь обратно на веб-сервер и вернусь к 644, файл будет снова загружен без необходимости перезапуска apache.

Это поведение верны только для файлов PHP. Файлы HTML ведут себя так, как я ожидал, как только вы удалите разрешения, файлы не будут обслуживаться.

Мне было предложено, чтобы Apache мог поддерживать дескриптор файла в файле PHP и что он не видел изменений разрешения до его перезапуска. Я пробовал использовать lsof в файле, но не видел никаких открытых дескрипторов файлов.

Я также пробовал и экспериментировал, где я начал с владения веб-сервера и 644 разрешений, и проверил, что файл может быть отправлен. Затем я переименовал файл, изменил разрешения на 000 и права собственности на root, а затем переместил файл обратно. После этого файл был еще, обслуживаемый Apache.

Может ли кто-нибудь проливать свет на то, что здесь происходит?

+0

Поэкспериментируйте с этим: войдите в «my.hostname/index.php» до и после изменения, а затем получите доступ к «my.hostname/index.php? Itok = randomnumbers», если второй запрос терпит неудачу, а затем он кэшируется. – apokryfos

+0

Вы уверены, что сайт не обслуживается кешем? – dev0

+0

@apokryfos Я проверил и его определенно не кеширование. Я изменил сценарий, чтобы показать время в секундах и показать строку запроса. Результаты тестов, которые я описал в моем сообщении, совпадают, и время обновляется, и отображается строка запроса (которую я меняю каждый раз). – Dom

ответ

5

Скорее всего, что происходит, у вас работает opcache. PHP компилируется во время выполнения. Чтобы сохранить накладные расходы, PHP 5.5 или новее имеет Opcache, что сохраняет этот шаг компиляции. Поэтому Apache, вероятно, кэширует файл. Затем Apache сохранит файл кэша с собственными разрешениями. Apache также может кэшировать его и в памяти. При перезапуске Apache он должен вернуться к базовому файлу PHP, к которому у него больше нет разрешений.

+0

Yup, только что проверил и его работает. Я не думал, что он установлен. – Dom

+1

Двойной проверял все мои результаты с помощью opcache.enable = 0, и он работает так, как я ожидал, - отказав в доступе к файлам с тысячами разрешений. благодаря – Dom

 Смежные вопросы

  • Нет связанных вопросов^_^