慢速php套接字服务器(约20秒延迟)

时间:2015-03-19 14:12:12

标签: php sockets

iOS端的一切看起来都不错。数据快速写入NSOutputStream。但是,下面的error_log会在大约20秒后更新,然后我会在我的应用中收到回复。

这是php:

#!/usr/local/bin/php –q
<?php

set_time_limit(0);

$server = stream_socket_server("tcp://---ip----:10001", $errno, $errorMessage);

while(true)
{
    $client = @stream_socket_accept($server);

    if ($client)
    {
        $client_data = stream_get_contents($client);
        if($client_data)
        {
            $json = json_decode($client_data, true);
            error_log("client data received: " . $client_data);

            //response code....
            fwrite($client, $output);

        }
        fclose($client);
    }
}

滞后是我主要担心的问题,但我也想知道这个代码是否适用于多个客户端。除了与一个客户的滞后之外,它似乎工作得很好。如果这对多个客户来说不好,有人可能会指出我正确的方向。感谢。

表观解决方案

我添加了以下代码:

$client_data = stream_get_contents($client, 1);
$meta = stream_get_meta_data($client);
$unread_bytes = $meta['unread_bytes'];
$client_data .= stream_get_contents($client, $unread_bytes, 1);

现在一切都很快。如果有人反对这个解决方案,请做。 PHP文档说不要使用unread_bytes但它似乎有点争议,在这种情况下它可以完成这项工作。

1 个答案:

答案 0 :(得分:0)

您的代码不适用于多个客户端。您应该使用stream_select或epoll(libevent等..)来处理多个客户端。

你可以在php中尝试一些异步框架。例如workermanphpdaemon

这是工人演示。 创建test.php。

<?php
require_once './Workerman/Autoloader.php';
use Workerman\Worker;

// A worker listen 10001
$worker = new Worker("Text://0.0.0.0:10001");
// Create 4 processes
$worker->count = 4;
// When a client connect.
$worker->onConnect = function($connection){};
// When a client send a message.
$worker->onMessage = function($connection, $data)
{
    echo "Recv data:".$data."\n";
    $connection->send('Recv success!');
};
// When a client close connection.
$worker->onClose = function($connection){};
// Run all worker.
Worker::runAll();

为调试模式运行宽度命令php test.php start或为守护进程模式运行php test.php start -d

然后你可以用telnet命令来测试。

telnet ---ip---- 10001
Trying ---ip----...
Connected to ---ip----.
Escape character is '^]'.

我希望这会对你有帮助。