Возможно записать STDOUT непосредственно в файл на PHP, что намного проще и проще, чем использование буферизации вывода.
Сделайте это в самом начале вашего сценария:
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);
$STDIN = fopen('/dev/null', 'r');
$STDOUT = fopen('application.log', 'wb');
$STDERR = fopen('error.log', 'wb');
Почему в самом начале вы можете спросить? Не нужно открывать файловые дескрипторы, поскольку при закрытии стандартных дескрипторов файлов ввода, вывода и ошибок первые три новых дескриптора станут НОВЫМИ стандартными дескрипторами файлов ввода, вывода и ошибок.
В моем примере я перенаправил стандартный ввод в / dev / null, а дескрипторы файла вывода и ошибок - в файлы журнала. Это обычная практика при создании скрипта-демона в PHP.
Для записи в файл application.log этого будет достаточно:
echo "Hello world\n";
Чтобы записать в error.log , нужно сделать:
fwrite($STDERR, "Something went wrong\n");
Обратите внимание, что при изменении дескрипторов ввода, вывода и ошибок встроенные PHP-константы STDIN, STDOUT и STDERR станут непригодными для использования. PHP не будет обновлять эти константы до новых дескрипторов, и ему не разрешается переопределять эти константы (в конце концов, они называются константами по причине).