1

我正在开发一个包含聊天系统的 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:地址已在使用中- 如果端口已在使用中,那为什么关闭终端后无法访问?

4

2 回答 2

0

发生的情况是,当您关闭终端会话时,您会终止该进程,除非您将其作为daemon运行。

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 ...命令的文件夹中运行来查看。

于 2016-11-17T09:35:35.650 回答
-1

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

ps -ef | grep php

输出:

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

杀死线程:

kill 7286

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

于 2016-11-17T09:15:34.817 回答