在PHP中使用Reactphp为套接字,端口停止侦听


Using Reactphp for sockets in PHP, port stops listening

我正在开发一个包含聊天系统的iOS应用程序(使用这些说明)。该api运行在LAMP服务器上,因此我使用ReactPhp而不是Twisted for python作为套接字处理程序来在客户端/服务器和服务器/客户端之间进行通信。

这是我用于文件socket.php 的代码
<?
require 'vendor/autoload.php';
$port = 1337;
$host = '127.0.0.1';
$app = function ($request, $response) {
    $response->writeHead(200, array('Content-Type' => 'text/plain'));
    $response->end('Hello '.time()."'n");
};
$loop = React'EventLoop'Factory::create();
$socket = new React'Socket'Server($loop);
$http = new React'Http'Server($socket, $loop);
$http->on('request', $app);
echo 'Server running at http://'.$host.':'.$port."'n";
$socket->listen($port, $host);
$loop->run();
?>

然后我在终端上运行这个:

php socket.php

问题:

  1. 它工作正常,但是…如果我关闭终端(或用ctrl+Z停止进程),端口将停止侦听。如何让套接字从Apache启动的那一刻起一直侦听?

  2. 关闭终端后(情况1),如果我再次尝试运行php socket.php,我得到这个消息:无法绑定到tcp://127.0.0.1:1337:地址已经在使用 -如果端口已经在使用,那么为什么我无法访问它关闭终端后?

实际情况是,当您关闭终端会话时,将杀死该进程,除非您将其作为守护进程运行。

别急着救我!

从维基百科:

nohup是一个POSIX命令,用于忽略HUP(挂起)信号。的玫瑰按照惯例,信号是终端警告相关进程的方式注销。

通常输出到终端的输出到一个名为nohup。如果没有被重定向,则退出。

如果是基于debian的系统(即Ubuntu):

sudo apt-get install nohup

如果是基于fedora的系统(例如Centos):

sudo yum install nohup

然后,像这样运行你的PHP脚本:nohup php socket.php &

这将解决你的问题#1,这反过来也会解决#2。

如果您刚刚作为守护进程启动的进程向stdout写入任何内容,那么您可以从执行上述nohup php ...命令的文件夹中运行cat nohup.out来查看。

似乎php线程还在运行。从终端:

ps -ef | grep php
输出:

501  7286  3848   0 10:09AM ttys002    0:00.08 php socket.php

杀死线程:

kill 7286

Update for Nino:第二个问题也可以使用nohup命令发生。