Решили мы себе под конец скрипта зарегистрировать некую shutdown функцию и чего-либо записать в файл. Пишем и упорно получаем ошибку доступа. Ну вот предположим код:
function shutdown () { $open = fopen('logfile.log', 'a+'); flock($open, LOCK_EX); fwrite($open, "данные"); flock($open, LOCK_UN); fclose($open); } register_shutdown_function('shutdown');
Permission denied ошибка при записи обеспечена.
Сделав var_dump(shell_exec(‘pwd’)); внутри функции получим / — внезапно корневой каталог, прав на запись в который естественно нет. В общем, пока въехал, мне понадобилось проверить конфиги nginx, fpm настройки, phpinfo(). Потом решил посмотреть pwd вне функции. И лишь когда я увидел, что вне функции директория такая, как должна собственно быть, в памяти всплыл этот комментарий с php.net просмотренный как обычно мельком.
Так вот, не только Apache грешит этим, но и nginx. Однако «магические» константы, такие как __DIR__ и __FILE__ внутри register_shutdown_function() остаются прежними, также как и серверная DOCUMENT_ROOT, поэтому как выход — на основе их юзать абсолютные пути.