PHP в Docker – fopen() или file_put_contents() не могут писать в /proc/1/fd/2 для записи на стандартный выводPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 PHP в Docker – fopen() или file_put_contents() не могут писать в /proc/1/fd/2 для записи на стандартный вывод

Сообщение Anonymous »

Запуск приложения php-fpm в контейнере Docker на базе CentOS7.

Поскольку я использую Docker, мне приходится записывать выходные данные журнала всех процессов в PID 1 выход. Таким образом, механизм Docker может получить журналы для последующей обработки (чтобы они отображались в журналах Docker).

Я могу добиться этого, записав ВСЕ журналы в /proc/1/fd/2 без проблем ни в одном приложении. Я могу сделать это с помощью nginx и просто выполнить echo «test» > /proc/1/fd/2, и в журналах Docker это отображается нормально.

Однако с программным обеспечением PHP я хотел бы сделать то же самое, написать в /proc/1/fd/2, однако независимо от того, что я делаю, я похоже, не может обеспечить поток файлов.

PHP-FPM порождает множество дочерних процессов. Из-за этого мне приходится явно писать в стандартный вывод PID 1!

Поэтому я делаю что-то вроде этого:

Код: Выделить всё

$handle = fopen("/proc/1/fd/2", "w");
fwrite($handle, $msg);
fclose($handle);
Я получаю предупреждение: fopen(/proc/1/fd/2): не удалось открыть поток: такого файла или каталога нет< /strong>


ПРИМЕЧАНИЕ.
Я также пробовал это с https://www.php.net/ manual/en/function.file-put-contents.php, и результат тот же. По сути, это оболочка для fopen, fwrite, fclose.


Я попробовал бросить ее на символическую ссылку:

Код: Выделить всё

bash-4.2$ ls -l /tmp/stdout
lrwxrwxrwx. 1 nginx nginx 12 Apr 10 11:19 /tmp/stdout -> /proc/1/fd/2
а затем указав на него метод, например fopen("/tmp/stdout", "w");
Я получаю ту же ошибку. Предупреждение: fopen(/tmp/stdout): не удалось открыть поток: такого файла или каталога нет

Вот результат, который мне нужно записать:

Код: Выделить всё

bash-4.2$ ls -l /proc/1/fd/2
l-wx------. 1 nginx nginx 64 Apr 10 11:21 /proc/1/fd/2 -> pipe:[3523867]
Я могу без проблем писать в него (напрямую или через символическую ссылку), используя любое другое приложение, которое я пробовал, включая nginx и bash.

Процесс PHP ЗАПУСКАЕТСЯ ОТ ТОГО ЖЕ ПОЛЬЗОВАТЕЛЯ, КОТОРЫЙ ВЛАДЕТ ВЫХОДНЫМ ПОТОКОМ

Код: Выделить всё

bash-4.2$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
nginx        1     0  0 11:21 ?        00:00:00 php-fpm: master process (/etc/php-fpm.conf)
nginx        7     1  0 11:21 ?        00:00:00 php-fpm: pool www
nginx        8     1  0 11:21 ?        00:00:00 php-fpm: pool www
nginx        9     1  0 11:21 ?        00:00:00 php-fpm: pool www
nginx       10     1  0 11:21 ?        00:00:00 php-fpm: pool www
nginx       11     1  0 11:21 ?        00:00:00 php-fpm: pool www
nginx       12     1  0 11:21 ?        00:00:00 php-fpm: pool www

bash-4.2$ ls -l /proc/1/fd/2
l-wx------. 1 nginx nginx 64 Apr 10 11:21 /proc/1/fd/2 -> pipe:[3523867]
Я пробовал предоставить ему несколько диких разрешений, они не принимают:

Код: Выделить всё

bash-4.2$ chmod 777 /proc/1/fd/2
bash-4.2$ ls -l /proc/1/fd/2
l-wx------. 1 nginx nginx 64 Apr 10 11:21 /proc/1/fd/2 -> pipe:[3523867]
Вот каталог /dev/, я не могу его использовать, так как они указывают на proc/self, а не на /proc/1:

Код: Выделить всё

lrwxrwxrwx. 1 root root   11 Apr 10 11:21 core -> /proc/kcore
lrwxrwxrwx. 1 root root   13 Apr 10 11:21 fd -> /proc/self/fd
crw-rw-rw-. 1 root root 1, 7 Apr 10 11:21 full
drwxrwxrwt. 2 root root   40 Apr 10 11:21 mqueue
crw-rw-rw-. 1 root root 1, 3 Apr 10 11:21 null
lrwxrwxrwx. 1 root root    8 Apr 10 11:21 ptmx -> pts/ptmx
drwxr-xr-x. 2 root root    0 Apr 10 11:21 pts
crw-rw-rw-. 1 root root 1, 8 Apr 10 11:21 random
drwxrwxrwt. 2 root root   40 Apr 10 11:21 shm
lrwxrwxrwx. 1 root root   15 Apr 10 11:21 stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root   15 Apr 10 11:21 stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root   15 Apr 10 11:21 stdout -> /proc/self/fd/1

Я попробовал изменить символическую ссылку /dev/fd, чтобы она указывала на /proc/1/fd/2 и затем попытался записать в php://fd/2, и это тоже не сработало, та же ошибка.


Подробнее здесь: https://stackoverflow.com/questions/556 ... 1-fd-2-for
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»