不使用 pcntl_fork() 对 PHP 脚本进行守护进程

发布于 2024-11-27 07:37:42 字数 222 浏览 0 评论 0原文

我正在开发一个使用 PHP 4.4.9 编程的嵌入式系统 - 不幸的是没有 PCNTL 扩展。

我需要创建一个作为守护进程在后台运行的脚本。您通常使用 fork() 来执行此操作,或者在 PHP 情况下使用 pcntl_fork() - 但此函数不可用。还缺少一个外壳,所以我无法使用标准工具。

那么,还有什么其他方法可以在后台干净地启动进程呢?

I'm working on an embedded system that is programmed with PHP 4.4.9 - unfortunately without the PCNTL extension.

I need to create a script that runs in the background as a daemon. You'd usually do this using fork(), or in the PHP case, pcntl_fork() - but this function is not available. A shell is also missing, so I can't use the standard tools.

So, what other ways are there to cleanly start a process in the background?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

您的好友蓝忘机已上羡 2024-12-04 07:37:42

正如 kingCrunch 所说,你确实应该升级。

首先,创建守护进程不仅仅是调用 pcntl_fork()。您可能想阅读 Unix 编程常见问题解答Unix 套接字常见问题

接下来,您没有提到打算如何解决并发问题 - 虽然分叉是解决此问题的一种方法,但它并不是在守护程序中使用 fork() 的唯一原因。

所以你确实有两个问题需要解决,首先是如何守护程序,然后是如何处理并发。

请注意,避免前者的后者的一种方法是从 [x]inetd 运行服务器。

解决并发问题的另一种方法是运行单线程服务器并使用socket_select(或stream_select)来复用连接 - 但我不确定 PHP 4 中支持的程度如何 - 有一个 这里是一个很好的例子

一个简单的解决方案是用 C 语言编写一个简单的包装程序,使用 daemon() 来引导程序。或者您可以直接从 inittab 启动它。或者,对于具有复杂管理设施的解决方案,请查看 DJB 的 daemontools

As kingCrunch says, you really should upgrade.

Firstly, there's more to making a daemon than just calling pcntl_fork(). You might want to read the Unix programming FAQ and the Unix socket FAQ.

Next, you've not mentioned how you intend to solve the problem of concurrency - while forking is one solution to this it is not the only reason for using fork() in a daemon.

So you've really got 2 problems to solve, first how you daemonize the program then how you handle concurrency.

Note that one approach to the latter which obviates the former is to run the server from [x]inetd.

Another approach to solving the concurrency problem is to run a single threaded server and use socket_select (or stream_select) to multiplex the connections - but I'm not sure how well that is supported in PHP 4 - there is a good example here.

A simple solution would be to write a simple wrapper program in C using daemon() to bootstrap the program. Or you could start it up directly from inittab. Or for a solution with complex management facilities have a look at DJB's daemontools

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文