PHP - TCP / IP fsockopen

时间:2014-05-01 12:56:11

标签: php tcp tcp-ip

我想知道是否有人曾经有过这方面的经验。我试图编写一个简单的脚本,它将不断从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();
}

1 个答案:

答案 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插座类型,否则,使用两侧的对插座。