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
但它似乎有点争议,在这种情况下它可以完成这项工作。
答案 0 :(得分:0)
您的代码不适用于多个客户端。您应该使用stream_select或epoll(libevent等..)来处理多个客户端。
你可以在php中尝试一些异步框架。例如workerman或phpdaemon。
这是工人演示。 创建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 '^]'.
我希望这会对你有帮助。