php-fpm workers' log get silenced with config `catch_workers_output = yes` and `error_log = syslog`

未关闭
#25,077 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
3/5
预计耗时
1-2 天
新手友好度
70/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
c, php
领域
backend

调研方向

Investigate sapi/fpm/fpm/fpm_stdio.c and zlog.c where stderr is hardcoded instead of using zlog() when error_log=syslog. First read fpm_stdio.c around line 195 and trace master process logging. Done when php-fpm with catch_workers_output=yes emits worker errors to syslog/journald.

由索引模型根据 Issue 内容生成。

描述

Bug Status: Needs Triage
Description

Follow up of Syslog broken on FPM since PHP 7.3.0 https://bugs.php.net/bug.php?id=79342.

When the php-fpm config catch_workers_output is enabled, and error_log is syslog, all workers' log won't go syslog.


I saw /proc/<php-fpm master pid>/fd/2 points to /dev/null, this is expected as
https://github.com/php/php-src/blob/136e049ac10b032c83018e65b63b6df858943750/sapi/fpm/fpm/fpm_stdio.c#L130-L132
https://github.com/php/php-src/blob/136e049ac10b032c83018e65b63b6df858943750/sapi/fpm/fpm/fpm_stdio.c#L63-L66
https://github.com/php/php-src/blob/136e049ac10b032c83018e65b63b6df858943750/sapi/fpm/fpm/fpm.c#L82
point stderr to stdout when php-fpm config error_log = syslog, and stdout was previously pointed to /dev/null:
https://github.com/php/php-src/blob/136e049ac10b032c83018e65b63b6df858943750/sapi/fpm/fpm/fpm_stdio.c#L27-L36
https://github.com/php/php-src/blob/136e049ac10b032c83018e65b63b6df858943750/sapi/fpm/fpm/fpm.c#L57

This was introduced in #1432 to fix https://bugs.php.net/bug.php?id=69865.
Also I guess this can prevent seeing duplicate logs from php-fpm in journalctl when using systemd service unit with the default value journal of option StandardError= to run php-fpm with daemonize = off as php-fpm itself already reporting logs to syslog and journald should be syslogd on many distros using systemd.


With php-fpm config catch_workers_output = yes, all workers' stderr are piped to master process, assume one of the worker's pid is 404:

$ ls -l /proc/404/fd/2
l-wx------ 1 root root 64 Oct 31 05:58 /proc/404/fd/2 -> 'pipe:[1853673300]'
$ find /proc -lname 'pipe:\[1853673300]' 2>/dev/null # https://superuser.com/q/401066/1777086#comment2862240_401619
/proc/317/task/317/fd/11
/proc/317/fd/11
/proc/404/task/404/fd/2
/proc/404/fd/2
$ lsof -d ^mem -a -p 317 # fd used by master process

So workers' stderr such as PHP error should be pipe to master process and then journald via syslog, but there's only log from master process in journalctl -u <php-fpm unit name>, such as NOTICE: ready to handle connections.

When I strace into the master process:

$ echo '<?php 1' > test.php
$ strace -p 317 -e read,write -vs 999 &
strace: Process 317 attached
$ SCRIPT_FILENAME=$PWD/test.php REQUEST_METHOD=GET cgi-fcgi -bind -connect localhost:9000 # or path to unix domain socket of php-fpm
Status: 500 Internal Server Error
Content-type: text/html; charset=UTF-8

read(11
, "NOTICE: PHP message: PHP Parse error:  syntax error, unexpected end of file in /foo/bar/test.php on line 2\n\0fscf\0", 1023) = 113
write(2, "[31-Oct-2026 06:41:53] WARNING: [pool roundcube] child 407 said into stderr: \"NOTICE: PHP message: PHP Parse error:  syntax error, unexpected end of file in /foo/bar/test.php on line 2\"\n", 186) = 186
read(11, 0x7fff1dc02980, 1023)          = -1 EAGAIN (Resource temporarily unavailable)

it just pipe the fd/11 that piped from worker process's stderr to its stderr, which is /dev/null.

I guess it's caused by this hardcoded stderr destination:
https://github.com/php/php-src/blob/136e049ac10b032c83018e65b63b6df858943750/sapi/fpm/fpm/fpm_stdio.c#L195
https://github.com/php/php-src/blob/136e049ac10b032c83018e65b63b6df858943750/sapi/fpm/fpm/zlog.c#L528-L556
that introduced in commit https://github.com/php/php-src/commit/3e5afbf0a80317216d98c6e5c0dd2eb54f34e438#diff-5af9050ab2bfafe95720d7badd345919c64c8fcd41a16089facf80a439ce86b0R144 of #2458 which appeared in https://github.com/php/php-src/releases/tag/php-7.3.0RC1, before that it's using zlog():
https://github.com/php/php-src/blob/2a78006adb42ac535fa3ac373170181859cccbf5/sapi/fpm/fpm/fpm_stdio.c#L189-L190
https://github.com/php/php-src/blob/2a78006adb42ac535fa3ac373170181859cccbf5/sapi/fpm/fpm/zlog.h#L9
https://github.com/php/php-src/blob/2a78006adb42ac535fa3ac373170181859cccbf5/sapi/fpm/fpm/zlog.c#L198-L201
which supports writing to syslog:
https://github.com/php/php-src/blob/2a78006adb42ac535fa3ac373170181859cccbf5/sapi/fpm/fpm/zlog.c#L129-L138
when error_log = syslog:
https://github.com/php/php-src/blob/2a78006adb42ac535fa3ac373170181859cccbf5/sapi/fpm/fpm/fpm_stdio.c#L286-L299

PHP Version
PHP 8.5.12 (fpm-fcgi) (built: Oct 19 2026 17:02:46) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.5.12, Copyright (c) Zend Technologies
    with Zend OPcache v8.5.12, Copyright (c), by Zend Technologies
Operating System

No response

主要语言
C
星标
41.8k
派生
8.5k
平均合并
2 天 13 小时
30 天内合并 PR
145

环境准备

  • 没有 Dockerfile 或 Docker Compose 文件
  • 没有 Pull Request 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

php/php-src 的其他 Issue

查看 php/php-src 的全部 Issue

相似的 Issue

更多 C Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。