【问题标题】:PHP socket server closes when connect client to server将客户端连接到服务器时PHP套接字服务器关闭
【发布时间】:2014-08-11 23:01:06
【问题描述】:

我正在编写一个在 ubuntu 上运行的 php 套接字服务器脚本。

它运行良好,客户端可以连接/断开与此服务器的连接。 但是当一个客户端连接到这个长时间没有任何客户端连接的服务器时,服务器正在静默关闭。

我将超时设置为 0(无限制),但服务器正在停止,没有任何错误或消息......就像这样。

root@exfl:/home/projectap/sec/server_core# php socket_server.php
[exfl.kr] Starting AbsolutePitch socket server...
[2014.06.21 16:50:58] Server is listening. PID: 6442
[2014.06.21 17:28:48] Client [192.168.0.1:8795] connected to the server.
root@exfl:/home/projectap/sec/server_core#

我是这样为这个服务器编码的。

<?php
set_time_limit(0);
error_reporting(E_ALL);
ini_set("memory_limit","2048M");
ini_set("max_execution_time", "0");

if(posix_getpid() == true) { 
    echo "[exfl.kr] Starting AbsolutePitch socket server...\n"; 
} else {
    echo getTimeToStr()."Server is already running.\n"; 
}

$cSock = array();
$socketsInformation = array();
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$bind = socket_bind($socket, "0.0.0.0", "24180");

$listen = socket_listen($socket, 5);
echo getTimeToStr()."Server is listening. PID: ".posix_getpid()."\n"; 

while(true) {

    $sockArr = array_merge(array($socket), $cSock);
    if(socket_select($sockArr, $tWrite = null, $tExcept = null, null) > 0) {
        foreach($sockArr as $sock){

            if($sock == $socket){

                $tSock = socket_accept($socket);
                socket_getpeername($tSock, $sockIp, $sockPort);
                array_push($cSock, $tSock);
                array_push($socketsInformation, array("SOCKETINDEX"=>(count($cSock)-1), "IP"=>$sockIp, "USERID"=>"", "STATUS"=>"", "AUTH"=>false));
                echo getTimeToStr()."Client [".$sockIp.":".$sockPort."] connected to the server.\n";
            } else {
                ...
            }
        }
    }
}

echo getTimeToStr()."Server closed.\n";
...
?>

当服务器突然停止时,它不会输出“服务器关闭”消息..

请帮忙。

对不起,我的英语不好。

【问题讨论】:

  • 请正确缩进您的代码。这很难阅读。没有乐趣。
  • 对不起,我刚刚编辑了它。
  • 你的真实代码会检查各种socket_*()调用失败的结果吗?
  • 我只是检查了一下,但效果很好。结果也很正常。

标签: php sockets php-socket


【解决方案1】:

您可能想尝试使用 SO_KEEPALIVE 的 socket_set_options()。要了解有关您的选项的更多信息,请使用 socket_get_options 页面:

https://www.php.net/manual/en/function.socket-get-option.php

要了解有关 socket_set_options() 用法的更多信息,请使用:

https://www.php.net/manual/en/function.socket-set-option.php

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2017-02-25
    • 2014-11-05
    • 1970-01-01
    • 2013-02-17
    • 2011-10-13
    相关资源
    最近更新 更多