Skip to content

7.6.2

Choose a tag to compare

@vadymk-rollun vadymk-rollun released this 14 Sep 11:19
  • Background jobs no longer inherit the php-fpm worker's low-numbered descriptors (Trello py2Gb7O7). A worker holds dup()s of the master's stdout/stderr catch-pipes on fds 3-9 (rollun-logger's php://stdout writer; fd 6/7/8 in production), and Interrupter\Process / ProcessByName spawned jobs with shell_exec("php … 1>X 2>X & echo $!"), which redirects only 1 and 2. A job that kept such a dup alive past the worker's exit made the master read EAGAIN instead of EOF; the freed child's event stayed in the master's queue and the replacement worker's pipe was never registered in epoll, so it wedged forever in pipe_write after 64 KB of output (php-src GH-8517; on PHP >= 8.1.20 the symptom is lost logs instead). The spawn command now appends 3>&- 4>&- 5>&- 6>&- 7>&- 8>&- 9>&-.
  • Limits: /bin/sh is dash on our images and only parses single-digit redirections, so descriptors >= 10 are still inherited; the listening socket and the FastCGI connection are usually there. This is the limited change agreed for the services that stay on their current PHP for now; the complete fix (proc_open with a full descriptorspec) is tracked in the same ticket. Pair it with rollun-logger >= 6.2.9 / 7.8.2 / 8.0.2, which stops the writer from holding the dup in the first place.
  • No change for PidKiller/WorkerManager: $! is still the job's own PID and the job's argv is unchanged. Verified with dash on PHP 7.2 and 8.0: closing a descriptor that is not open is not an error, OUTPUT_STREAM file paths and /dev/null behave as before, and the test suites give the same results as the previous release.