PHP - эхо сделать другой клиент - PullRequest
0 голосов
/ 03 апреля 2012

Я делаю маленький php-сервер, который имеет 2 клиента, подключается к php (устройство a) и управляет другим (устройство b).

устройство a делает запрос get к php.Теперь я хочу отправить эту команду на устройство б.Есть ли способ, чтобы повторить на устройство б?или сделать запрос к устройству b?

(мне нужно отправить только один символ на устройство b)

Ответы [ 3 ]

2 голосов
/ 03 апреля 2012

Нажатие на устройство возможно, но зависит от вашего устройства. Решением было бы использование веб-сокетов, см. Следующие ссылки для дальнейшего чтения:

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 голос
/ 03 апреля 2012

Устройство B может открыть клиентское соединение с сервером и ожидать поступления данных.Если данные поступают, клиент, работающий на устройстве B, может их отобразить.

PHP предлагает доступ к сетевым сокетам, см. http://www.php.net/manual/en/book.sockets.php

Некоторые примеры кода PHP, использующие LibEvent и ZMQ , что обеспечивает более высокий уровень доступа к сокетам и очередям:

Сервер, управляемый событиями:

<?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 Client:

<?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());

Источник , Talk , Видео (~ 22:00) .

1 голос
/ 03 апреля 2012

Нет, если только на устройстве B не запущен какой-либо сервер (любое программное обеспечение, которое действительно принимает входящие соединения). В таком случае вы можете легко отправлять HTTP-запросы на устройство (например, даже с file_get_contents) или иметь собственный протокол подключения (с сокетами ). Есть и другие опции, которые предоставляют вам ту же функциональность, но работают немного по-другому.

Если на устройстве не запущены какие-либо серверы, лучшее, что вы можете сделать, это непрерывно опрашивать сервер, чтобы узнать, есть ли какие-либо команды для него. Это проще в настройке (сервер уже есть), но также неэффективно.

...