PHP - echo做其他客户端

时间:2012-04-03 07:01:12

标签: php client-server push

我正在制作一个有两个客户端的小型php服务器,连接到php(设备a)并控制另一个(设备b)。

设备a向php发出get请求。现在我想将该命令推送到设备b。有没有办法回应设备b?或者向设备发出请求b?

(我只需要向设备b发送一个字符)

3 个答案:

答案 0 :(得分:2)

可以推送设备,但取决于您的设备。 解决方案是websockets,请参阅以下链接以进一步阅读:

http://www.websocket.org/

http://code.google.com/p/phpwebsocket/

另一个解决方案是longpolling,它很容易在php中实现: http://en.wikipedia.org/wiki/Push_technology#Long_polling

在服务器端非常简单地实现longpolling:

$ts = time();
while(true) {
    // if there's something new, send the response to the server
    // if not, continue with the loop
    if($response = getSuperAwesomeResponse()) {
        print $response;
        break;
    }

    // timeout after 60 seconds
    if( ($ts + 60) > time()) {
        break;
    }

    sleep(1);
}

在客户端,你只需要发送某种ajax调用

答案 1 :(得分:1)

不,除非设备B正在运行某种类型的服务器(任何真正接受传入连接的软件)。如果是这种情况,那么您可以轻松地向设备发出HTTP请求(例如,即使使用file_get_contents),也可以拥有自己的自定义连接协议(使用sockets)。还有其他选项可以让您使用相同的功能,但工作方式略有不同。

如果设备没有运行任何服务器,那么您可以做的最好是连续轮询服务器以查看是否有任何命令。这更容易设置(服务器已经存在)但也没有效率。

答案 2 :(得分:1)

设备B可以打开与服务器的客户端连接并等待输入数据。如果数据进入,则设备B上运行的客户端可以回显它。

PHP提供对网络套接字的访问,请参阅http://www.php.net/manual/en/book.sockets.php

一些PHP示例代码使用LibEventZMQ,它允许更高级别的套接字和队列访问:

事件驱动的服务器:

<?php
// create base and event
$base = event_base_new();
$event = event_new();

// Allocate a new context
$context = new ZMQContext();

// Create sockets
$rep = $context->getSocket(ZMQ::SOCKET_REP);

// Connect the socket
$rep->bind("tcp://127.0.0.1:5555");

// Get the stream descriptor
$fd = $rep->getsockopt(ZMQ::SOCKOPT_FD);

// Define event callback function
$fnc = function ($fd, $events, $arg) {
    static $msgs = 1; 
    echo "CALLBACK FIRED" . PHP_EOL;
    if($arg[0]->getsockopt (ZMQ::SOCKOPT_EVENTS) & ZMQ::POLL_IN) {
        echo "Got incoming data" . PHP_EOL;
        var_dump ($arg[0]->recv());
        $arg[0]->send("Got msg $msgs");
        if($msgs++ >= 10) event_base_loopexit($arg[1]);
    }
};

// set event flags
event_set($event, $fd, EV_READ | EV_PERSIST, $fnc, array($rep, $base));

// set event base
event_base_set($event, $base);

// enable event
event_add($event);

// start event loop
event_base_loop($base);

ZeroMQ客户端:

<?php
// Create new queue object
$queue = new ZMQSocket(new ZMQContext(), ZMQ::SOCKET_REQ, "MySock1");
$queue->connect("tcp://127.0.0.1:5555");

// Assign socket 1 to the queue, send and receive
var_dump($queue->send("hello there!")->recv());

SourceTalkVideo (~22:00)