PHP - socket_accept让浏览器无休止地加载

时间:2014-02-24 16:11:54

标签: php sockets

民间,

我正在尝试用PHP编写一个简单的套接字示例代码。 以下代码似乎正常工作:

if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);

    die("Couldn't create socket: [$errorcode] $errormsg \n");
}

echo "Socket created \n";

// Bind the source address
if( !socket_bind($sock, "127.0.0.1" , 5000) )
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);

    die("Could not bind socket : [$errorcode] $errormsg \n");
}

echo "Socket bind OK \n";

if(!socket_listen ($sock , 10))
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);

    die("Could not listen on socket : [$errorcode] $errormsg \n");
}

echo "Socket listen OK \n";

echo "Waiting for incoming connections..... \n";

但是当我添加$ client = socket_accept($ sock)行时;作为下一步,我的应用程序保持加载状态约5分钟并失败!

我研究了一些东西,但我找不到线索,更不用说解决方案了。

谢谢!

3 个答案:

答案 0 :(得分:1)

来自socket_accept()的文档:

  

如果没有挂起的连接,socket_accept()将阻塞,直到连接出现。

您是否有任何尝试连接到该应用程序的内容?如果你不这样做,最终socket_accept()会因default_socket_timeout而超时。

答案 1 :(得分:0)

这些是我的工作套接字脚本的片段。这是骨骼,但你会抓住漂移。

除非您这样做,否则这是一个阻止通话:

@socket_set_nonblock($sock);

然后循环使用您的连接及其发送的数据继续处理。

while(true){

    if(($newc = @socket_accept($sock)) !== false) {
        $con=1;
    }

    if($con==1){
        //There is a socket. Read data from it, write data to it or close it here:
        if($dataIn = socket_read($newc, 1024)){
            echo "Client: " . $dataIn  . "\r\n<BR>";
        }

        if($dataIn==""){
            socket_close($newc);
            return();
        }
    } 
sleep(1);
}

答案 2 :(得分:0)

尝试在CLI上运行脚本。应该像你想要的那样工作。在浏览器上运行它最终会导致超时。