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

时间:2014-06-19 15:45:54

标签: php sockets reactphp

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

这是我用于 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:已经是地址正在使用 - 如果该端口已被使用,那么为什么我在关闭终端后无法访问它?

2 个答案:

答案 0 :(得分:0)

当您关闭终端会话时,您将终止该进程,除非将其作为守护程序运行。

Nohup救援!

来自维基百科:

  

nohup是一个忽略HUP(挂断)信号的POSIX命令。 HUP   按照惯例,信号是终端警告依赖过程的方式   注销。

     

通常发送到终端的输出将转到名为的文件   nohup.out,如果它还没有被重定向。

如果在基于Debian的系统(即Ubuntu)上:

sudo apt-get install nohup

如果在基于Fedora的系统(即Centos)上:

sudo yum install nohup

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

这将解决您的问题#1,这也将解决#2问题。

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

答案 1 :(得分:-1)

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

lxml

输出:

ps -ef | grep php

杀死线程:

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

Nino的更新: 第二个问题也可以使用kill 7286 命令发生。