【问题标题】:Linux Daemon in C++ to process PHP requestsC++ 中的 Linux 守护进程处理 PHP 请求
【发布时间】:2026-01-28 14:00:01
【问题描述】:

操作系统:Linux(红帽) 编程语言:C++

我需要使用 C++ 为 Linux 创建一个守护程序(进程),它将持续在自定义端口上侦听 PHP 请求。 PHP 会将 XML 形式的请求数据发送给守护进程,守护进程将使用 Xerces 解析 XML 并将 XML 形式的适当回复发送回 PHP 页面。

我已经成功创建了一个监听本地主机端口 4646 的守护进程,但我不知道来自 PHP 的请求将如何到达守护进程以及守护进程将如何发送回复。

我尝试用谷歌搜索这个特定问题,但根本找不到解决方案。 非常感谢您对此问题的任何帮助。

我还阅读了一些关于 PHP 守护程序的信息,但我不确定它们是否适用于这种特定场景。

这种方法并不难且快速,因此任何替代方法也可以。唯一困难和快速的是结果,即 PHP 页面和守护程序之间的成功通信。

【问题讨论】:

  • 你试过 curl 了吗?
  • 你为什么需要它,你把 PHP 请求称为什么? (通常使用 PHP,请求是 HTTP 请求!)。
  • @Ignacio Vazquez-Abrams 不,我还没有尝试过 curl,但如果我仍然卡住,我会调查并回复你,非常感谢......
  • @BasileStarynkevitch 你是对的,实际上请求来自 PHP 页面,但我不确定它们是否会是 HTTP,这取决于我的守护程序设置接收的请求类型..
  • 根据您的应用程序,编写一个加载到 PHP 解释器中的库也是值得的。

标签: php c++ linux sockets


【解决方案1】:

问题比较混乱。

我需要使用 C/C++ 为 Linux 创建一个守护进程(进程)

为什么必须用 C 或 C++ 编写?

我也读过一些关于 PHP 守护进程的文章,但我不确定它们是否适用

这是否意味着它不需要用 C/++ 编写?为什么您认为它们可能不适用?

守护进程将使用 Xerces 解析 XML

为什么必须使用 Xerces?据推测,守护进程应该做的不仅仅是解析 XML 和编写响应——它还能做什么?

Writing a daemon 不是一个简单的过程。写一个socket server 不是一个简单的过程。通过在每一端实现一个定义良好的协议,它在某种程度上被简化了。

...这就引出了一个问题,为什么不直接使用 HTTP 作为协议和一个网络服务器来实现服务器的东西,并将特定于应用程序的逻辑分离到一个 [f]CGI 程序中。更进一步,为什么不使用 PHP 实现特定于应用程序的逻辑。

唯一困难和快速的是结果,即 PHP 页面和守护程序之间的成功通信

一些选项:

  1. 将应用程序特定部分编写为 PHP 页面,然后使用 curl 通过 HTTP 请求调用它

  2. 将服务器编写为单任务 stdio 服务器并使用 [x]inetd 调用它,将客户端连接作为网络套接字处理(需要您定义协议)

  3. 在 PHP 中编写一个分支server daemon,将两端的连接作为网络套接字处理(需要您定义协议)

  4. 在 PHP 中编写一个单线程 server daemon (using socket_select),将两端的连接作为网络套接字处理(需要您定义协议)

当然,我在上面提到的任何地方都可以使用 C、C++、Perl、Java....等。

【讨论】:

  • @symcbean,非常感谢您的帮助,我完全同意您的建议,但正如我之前提到的,我对低级别的东西很陌生,并且朝着不同的方向前进并遇到同样的问题不是将提供帮助,所以到目前为止,我坚持在 c 中创建一个套接字服务器守护进程,并使用 PHP 套接字进行两者之间的通信,说实话,我快到了……但再次感谢您抽出宝贵的时间和为我提供替代方案,以后肯定会考虑,但现在,我需要完成手头的任务,因为现在时间对我来说非常重要......
  • @SoapBox 根本没有任何限制,正如我在问题中提到的方法并不难,问题是我对这些东西很陌生,我有一个实施的想法我自己的系统和我在前面的问题中指定的方法只是一个朋友的建议,由于这位朋友无法用他指定的方法指导我,我提到任何解决我问题的替代方案都是受欢迎的。 ..如果这是作业,我肯定会指定...无论如何感谢您调查问题..
【解决方案2】:

最好你可以使用php socket库来连接你系统中运行的守护进程,然后你可以将数据传递给守护进程,并可以处理守护进程发回的结果。

您可以参考PHP Socket Library 来创建代码以与守护进程进行套接字连接...

我认为这是一个比使用 CURL 更好的选择,因为守护程序也是自定义套接字接口,CURL 将最适合 HTTP 请求,但我认为这里的守护程序不是 HTTP 的..

【讨论】:

  • 自定义守护进程的好处是协议可以是任何想要的。并且挂钩到现有的 HTTP 守护程序很容易。
  • @IgnacioVazquez-Abrams 再次感谢,实际上我是 C、套接字和守护进程的初学者,因为我通常使用 PHP 和 Java 编写代码。我还没有弄清楚如何为我的守护进程设置请求类型并为传入的请求提供服务,截至目前,我的守护进程是一个聊天服务器,它在端口上侦听传入请求并写入从接收到的所有文本客户,到一个文件。每次我的客户端断开连接时,守护进程都会死掉,知道问题可能是什么吗?
  • 您可能忘记为套接字断开连接时发送的信号设置处理程序。
  • @IgnacioVazquez-Abrams 我猜是这样,因为我已经复制粘贴了教程中的信号处理程序代码,但忘记对其进行编辑以适合我的守护进程。再次感谢...感谢你们所有人的帮助...
  • @IgnacioVazquez-Abrams 套接字断开的信号是什么?我试着找,但找不到
【解决方案3】:

xinetd / inetd 可能有点老了,但可以使这变得简单且可扩展(有限制)

Inetd 将调用您的程序并将流量发送到标准输入,您的标准输出将转到连接。只要您不需要共享信息,它就不必担心使程序没有错误/没有内存泄漏等......

西蒙加载器

【讨论】:

  • @SimonLoader 非常感谢,也会调查一下,事实上,在 Google 上搜索解决方案时,我确实遇到了一些使用 inetd 的代码,我仍然将它添加为书签,所以一定会尝试它.. .