Можно ли сделать следующее?
register_shutdown_function('my_shutdown'); function my_shutdown () { file_put_contents('test.txt', 'hello', FILE_APPEND); error_log('hello', 3, 'test.txt'); } 
Кажется, не работает. BTW я на PHP 5.3.5.
Это зависит от того, какой SAPI вы используете. На странице документации для register_shutdown_function () указано, что на определенных серверах, таких как Apache, меняется рабочий каталог скрипта.
  Файл записывается, но не там, где находится ваш .php файл ( DocumentRoot ), но в папке сервера Apache ( ServerRoot ). 
  Чтобы этого не произошло, вам нужно что-то вроде hotwire изменить рабочую папку.  Как только ваш скрипт начнет выполнение (в первых нескольких строках), вам нужно как-то сохранить реальную рабочую папку.  Создание константы с помощью define() идеально подходит для этого. 
 define('WORKING_DIRECTORY', getcwd()); 
И вам нужно изменить часть функции shutdown следующим образом:
 function my_shutdown () { chdir(WORKING_DIRECTORY); file_put_contents('test.txt', 'hello', FILE_APPEND); error_log('hello', 3, 'test.txt'); } register_shutdown_function('my_shutdown'); 
  Таким образом, рабочая папка будет немедленно заменена на реальную, когда вызывается функция, и файл test.txt появится в папке DocumentRoot . 
  Некоторая модификация: лучше объявить register_shutdown_function() после того, как функция была объявлена.  Вот почему я написал ее под кодом функции, а не над ней. 
проверьте это: ( отсюда )
 Note: Working directory of the script can change inside the shutdown function under some web servers, eg Apache. 
  проверьте его с помощью getcwd();