【发布时间】:2010-04-12 14:07:16
【问题描述】:
我有一个用 PHP 编写的守护进程,它在我的 linux 机器上运行。
我正在尝试通过另一个 php 文件向它发送信号。 为此,我正在尝试 posix_kill 函数。但它不起作用。
当我运行php页面时,我得到一个错误,php是在没有--enable-grep的情况下编译的
我想知道如何启用它?或者向守护进程发送信号的替代方式是什么?
【问题讨论】:
我有一个用 PHP 编写的守护进程,它在我的 linux 机器上运行。
我正在尝试通过另一个 php 文件向它发送信号。 为此,我正在尝试 posix_kill 函数。但它不起作用。
当我运行php页面时,我得到一个错误,php是在没有--enable-grep的情况下编译的
我想知道如何启用它?或者向守护进程发送信号的替代方式是什么?
【问题讨论】:
在 PHP 脚本上处理信号的唯一方法是使用 PCNTL 库重新编译 PHP,该库将为您提供所需的工具/功能。
http://php.net/manual/en/book.pcntl.php
否则,您需要使用诸如Quamis mentioned 之类的变通方法:文件标志或锁定等。
【讨论】:
如果你知道进程的 ID,你就可以
exec( "kill -SIGKILL 1234", $return );
print_r( $return );
或者如果你不知道进程 ID
exec( "pkill -KILL myDaemon", $r );
print_r( $return );
要查找all the available signals,您可以发送:
shell> kill -l
如果遇到问题,请将stderr 重定向到标准输出:
exec( "pkill -KILL myDaemon 2>&1", $r );
print_r( $return );
这将向您显示任何可能出现在终端上的错误消息(如果您一直以这种方式执行命令!)。
【讨论】:
exec() 的第三个参数来检查错误的返回码php.net/manual/en/function.exec.php
stderr 从脚本中获取错误消息
尝试使用共享内存、锁或文件。如果进程属于不同的用户,则在进程之间发送信号可能不起作用。
如果您需要扩展,例如使用文件或锁可能会对您有所帮助,因为它比使用信号更容易复制。
像我所说的信号问题是守护程序必须定期查找事件...通过使用信号,守护程序中的某个触发器会立即被调用,如果您需要快速响应,这会让生活变得更轻松.
【讨论】: