如何在 linux 系统上用 PHP 启动后台进程并将用户 ajax 输入重复写入其标准输入

Posted

技术标签:

【中文标题】如何在 linux 系统上用 PHP 启动后台进程并将用户 ajax 输入重复写入其标准输入【英文标题】:How to start a background process in PHP on a linux system and repeatedly write user ajax input to its stdin 【发布时间】:2012-12-03 03:34:56 【问题描述】:

在 linux web 服务器上的一个新 php 会话中,我想启动一个在后台以控制台输入模式运行的进程(特别是 ghostscript),然后重复地将新数据写入其输入。每次新的用户数据通过 ajax 到达时,都需要进行这种数据写入。用户数据由 PHP 脚本解释为 ghostscript 的 postscript 命令,然后需要发送到 gs。 gs 输出将输出到一个命名文件。这样做的原因是我需要速度并且希望避免在用户的每个新输入上启动 gs 的开销。 (一旦 gs 运行并等待输入,处理我的数据大约需要 40 毫秒,但重新启动 gs 并处理数据大约需要 250 毫秒。)虽然我可以让 gs 在后台运行并接受来自 shell 的输入,但我是很难从 PHP 脚本中执行此操作。我已经经历了我能想到的 exec、shell_exec、popen、system、coproc 等的所有变体,但我似乎遗漏了一些基本的东西。感谢您提供任何见解。

【问题讨论】:

我看不出这有什么帮助。一切都由用户输入驱动;在任何特定时间都不需要运行任何东西。你想到了什么? 【参考方案1】:

如果您在服务器上有适当的访问权限,可以启动一个套接字并让 ghostscript 接受来自该套接字的输入。

例如

在 tty 上:$ socket -sl 11555

在另一个 tty 上:$ nc 0 11555 | ghostscript

现在,无论您向套接字写入什么内容,gs 都会将其作为输入接收。当您的 AJAX 请求到达服务器时,您可以进行任何您需要的处理,然后将生成的 postscript 命令从 PHP 写入套接字。

【讨论】:

学习创建一个 php 守护进程并在守护进程内部编写脚本来读取套接字。您的 ajax php 脚本应该写入该套接字。

以上是关于如何在 linux 系统上用 PHP 启动后台进程并将用户 ajax 输入重复写入其标准输入的主要内容,如果未能解决你的问题,请参考以下文章

Linux中从后台启动进程,应在命令结尾处加上啥符号

Linux中启动进程的方法都有哪些?哪种更好用?

Linux守护进程的启动方法

在 Linux 上用 c++ 编写类似 pexpect 的程序

Linux系统管理-进程管理

我如何制作一个启动Python脚本的linux后台进程(在c中)