PHP套接字程序挂起

时间:2015-10-28 09:44:37

标签: php sockets

我有一个用PHP编写的套接字服务器程序,由Fedora 21-apache运行,监听端口。

<?php

set_time_limit (0);

$address = '1.2.3.4';

$port = "19000";
$con = 1;
$word = "";

$sock = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
$bind = socket_bind($sock, $address, $port) or die("Could not bind to socket\n");

socket_listen($sock);
while ($con == 1)
{
    $client = socket_accept($sock);
    $input = socket_read($client, 50);

    if ($input == 'exit')
    {
        $close = socket_close($sock);
        $con = 0;
    }
    else {
        $input = trim($input) . "," . date('Y-m-d H:i:s') . "\n";
        $file= "/home/xyz/data/" . "uls_" . date("Ymd_His") . ".dat";
        file_put_contents($file, $input);
    }

}

?>

客户端实际上是一个设备。目前只有一台设备在运行。 根据设备提供的文档, “它充当TCP客户端并打开到服务器的TCP套接字会话 然后,设备发送消息并断开套接字会话。连接失败强制重试“

现在我可以从这个客户端获取数据了。问题是,说4-5小时后客户端无法推送数据。服务器套接字挂起。 netstat -taun命令显示以下内容。

tcp 0 0 1.2.3.4:19000 0.0.0.0:* LISTEN

tcp 0 0 1.2.3.4:19000 3.4.5.6:20721 ESTABLISHED

有时可以看到多个客户端连接。

我可以确认客户端在此期间仍在运行。我试图通过另一个客户端套接字脚本连接到此服务器套接字。 结果说,客户端请求已经发出但服务器套接字没有响应。

如果重新启动Web服务器,并再次运行服务器脚本,则每次都可以正常工作。

任何人都可以帮我识别问题。

1 个答案:

答案 0 :(得分:0)

我遇到同样的问题,我通过关闭socket_accept()

构建的资源来修复它
while ($con == 1)
{
    $client = socket_accept($sock);
    $input = socket_read($client, 50);

    if ($input == 'exit')
    {
        $close = socket_close($sock);
        $con = 0;
    }
    else {
        $input = trim($input) . "," . date('Y-m-d H:i:s') . "\n";
        $file= "/home/xyz/data/" . "uls_" . date("Ymd_His") . ".dat";
        file_put_contents($file, $input);
    }

     // @param2 - 1 => block writing in socket ...
     socket_shutdown ($client , 1) ;
     socket_close    ($client )    ;
}