始终`无法绑定到tcp:// my_ip_here:8080地址已在使用中

时间:2014-09-15 04:37:47

标签: php sockets zeromq ratchet

我试图部署我的websocket服务器并开始运行它,但始终给出:

PHP Fatal error:
Uncaught exception 'React\Socket\ConnectionException'
with message       'Could not bind to tcp://my_ip_here:8080:
                    Address already in use'
in                 /var/www/html/webscoket/vendor/react/socket/src/Server.php:29

这是我的server.php

<?php
require dirname(__DIR__) . '/vendor/autoload.php';

use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use React\Socket\Server;
use React\ZMQ\Context;

$loop   = React\EventLoop\Factory::create();
$app    = new onyxsocket();
$webSock = new Server($loop);
$webSock->listen(8080, 'my_ip_here');
$webServer = new IoServer(
    new HttpServer(
        new WsServer(
            $app
        )
    ),
    $webSock
);

$context = new Context($loop);
$pull = $context->getSocket(ZMQ::SOCKET_PULL);
$pull->bind('tcp://my_ip_here:5555');
$pull->on('error', function ($e) {
    var_dump($e->getMessage());
});
$pull->on('message', array($app, 'onbroadcast'));
$loop->run();

我到目前为止所做的是检查可在生产服务器中使用的可用端口:netstat - anp让我知道端口8080是免费的。但问题是它仍然显示已经使用的错误地址。我也尝试过管理员提供的其他端口,但没有运气。

我尝试部署的server.php在localhost上工作正常。但我不知道如何才能使它在生产服务器上运行。

需要帮助。感谢。

1 个答案:

答案 0 :(得分:6)

来自上述@ user3666197评论:

  

澄清代码,请。您的服务器代码ZeroMQ .bind()-s到端口#5555。那么,其代码绑定到localhost端口#8080,是否在上面的未处理异常中报告?你如何清理一个优雅的退出任何崩溃的EventLoop / Factory来释放资源并避免挂掉孤儿?

我决定重新检查netstat:netstat -tulpen并检查端口8080和5555,并发现当前连接的端口上存在已注册的PID。这些应用程序也是我想在控制台server.php上运行的相同脚本。

我杀了PID:kill PID_number并再次在控制台上运行server.php。它奏效了。