我正在开发一个包含聊天系统的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
问题:
它工作正常,但是…如果我关闭终端(或用ctrl+Z停止进程),端口将停止侦听。如何让套接字从Apache启动的那一刻起一直侦听?
关闭终端后(情况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
命令发生。