操作系统与硬件

自己东拼西凑手写了一个服务端渲染 KaTeX\KaTeX(现在本站上的所有数学公式都在服务端渲染完成)的 WordPress 插件。确实有功能相近的轮子,但是跟我以前写的文章格式不相符,客户端渲染又不对我的胃口,我不想用。PHP 在 WP 上二次开发抓取页面内容,本机开另一端口让 node.js 监听,渲染好以后返回。

于是有开启、关闭异步进程的需求。原先采用 proc_open,发送 POST 请求用 file_get_contents,插件关闭时暴力 kill 服务端进程。发现 PHP 开子线程没有什么权限,所以被迫将标准输入输出重定向到 pipe。然后进一步改进成用 cURL 处理通用请求(这样就可以给服务端发送类似命令一样的东西,更优雅地检测监听状态和关闭进程),期间服务端加了不少调试信息,用 console.log 输出。然后爆炸了。

本来以为是处理 HTTP 请求的地方出锅,但最诡异的是我手动在远程控制台运行时没有任何问题,调试信息正常输出;但一旦用 PHP 自动开子线程启动,处理完最多两个请求之后就直接 defunct,重开一次爆炸一次。排查其他可能性之后怀疑是调试信息输出有问题。于是去掉若干 console.log,正常运行。

Python 中的 os.popen 函数 与 Pipe 管道的坑

More
  • 2022年11月10日