我想知道是否有人曾经有过这方面的经验。我试图编写一个简单的脚本,它将不断从TCP / IP流中读取数据,但由于某种原因,脚本会读入一堆数据,将其写出然后停止。
$fp = fsockopen("xxxx", 3000, $errno, $errstr, 5);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
while (!feof($fp)) {
echo fgets($fp, 128)."\n";
fflush($fp);
}
fclose($fp);
}
我希望它有一个恒定的流量,而不是回显出一堆数据然后等待30秒并输出更多的数据。有人有什么想法吗?
----编辑----
ZMQ代码
include 'zmsg.php';
$context = new ZMQContext();
$client = new ZMQSocket($context, ZMQ::SOCKET_DEALER);
// Generate printable identity for the client
$identity = sprintf ("%04X", rand(0, 0x10000));
$client->setSockOpt(ZMQ::SOCKOPT_IDENTITY, $identity);
$client->connect("tcp://xxxx:3000");
$read = $write = array();
$poll = new ZMQPoll();
$poll->add($client, ZMQ::POLL_IN);
$request_nbr = 0;
while (true) {
// Tick once per second, pulling in arriving messages
for ($centitick = 0; $centitick < 100; $centitick++) {
$events = $poll->poll($read, $write, 1000);
$zmsg = new Zmsg($client);
if ($events) {
$zmsg->recv();
echo $zmsg->body()."\n";
//printf ("%s: %s%s", $identity, $zmsg->body(), PHP_EOL);
}
}
$zmsg = new Zmsg($client);
//$zmsg->body_fmt("request #%d", ++$request_nbr)->send();
}
答案 0 :(得分:0)
如果您的目标只是提取数据(读取),则以下是连接服务器(作为客户端)的方式。
<?php
$context = new ZMQContext();
$sock = new ZMQSocket($context, ZMQ::SOCKET_PULL);
$sock->connect("tcp://ADDRESS:3000");
while (true)
{
$request = $sock->recv(); # recv is blocking by default, no need to put timers.
printf ("Received: %s;%s", $request, PHP_EOL);
}
?>
如果你想回复,你需要使用一对套接字(ZMQ :: SOCKET_PAIR),然后你可以使用:
$sock->send("data to send");
此外,如果客户端连接到客户端而不是连接到您,请使用bind方法而不是connect。
编辑:如果你在这里拉,请使用另一侧的PUSH插座类型,否则,使用两侧的对插座。