2012-04-03 3 views
0

나는 2 개의 클라이언트가있는 작은 PHP 서버를 만들고, php (장치 a)에 연결하고 다른 장치 (장치 b)를 제어한다.PHP - echo do other client

장치 a는 PHP에 대한 요청을 만듭니다. 지금은 그 명령을 장치 b에 푸시하고 싶습니다. 장치 B에 에코 할 수있는 방법이 있습니까? 또는 장치 b에 요청을하려면? 장치 B가 어떤 종류 (들어오는 연결 진짜로을 받아 소프트웨어)의 서버를 실행하지 않는

답변

2

기기로 푸시 중은 가능하지만 기기에 따라 다릅니다. http://en.wikipedia.org/wiki/Push_technology#Long_polling

매우 간단합니다 :

http://www.websocket.org/

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

또 다른 방법은 PHP에서 구현하기 쉽습니다 longpolling 것 : 해결책은 추가 읽기는 다음 링크를 참조 WebSocket을 것 서버 측 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); 
} 

클라이언트 측에서는 일종의 아약스 호출을 보내면됩니다.

+1

while 루프 내에 'sleep'호출을 추가하는 것을 잊지 마십시오. 그렇지 않으면 엄청난 양의 CPU 시간이 소비됩니다. – enricog

+0

귀하의 의견을 보내 주셔서 감사합니다. 나는 그것을 잊었다. :) –

1

아니오 (난 단지 장치 B에 한 문자를 보낼 필요). 그렇다면 기기에 대한 HTTP 요청 (예 : file_get_contents 포함)을 쉽게 만들거나 나만의 맞춤 연결 프로토콜 (sockets)을 사용할 수 있습니다. 또한 동일한 기능을 사용할 수 있지만 약간 다른 방식으로 작동하는 다른 옵션이 있습니다.

장치에서 서버가 실행되고 있지 않으면 서버를 계속 폴링하여 명령이 있는지 확인하십시오. 이것은 설정하기 쉽지만 (서버가 이미 있음) 효율적이지 않습니다.

+0

의견을 보내 주셔서 감사합니다. 그래서 당신의 제안은 명령의 대기열을 만드는 것입니다, 장치 b가 연결될 때마다 그에게 맨 위 줄을 줄까요? 이 대기열을 어떻게 구현합니까? – Tobrun

+0

@ user1281750 : 장치 B가 장치를 받기 위해 연결할 때/모르는지 확실하지 않기 때문에 명령을 잃지 않으려면 반드시 대기열을 만들어야합니다. 표준 배열 ('array_push' /'array_pop')로 큐를 아주 쉽게 구현할 수 있습니다. – Jon

1

장치 B는 서버에 대한 클라이언트 연결을 열어 데이터 수신을 기다릴 수 있습니다. 데이터가 들어 오면 장치 B에서 실행중인 클라이언트가이를 반향시킬 수 있습니다.

PHP 볼, 네트워크 소켓에 대한 액세스를 제공합니다 http://www.php.net/manual/en/book.sockets.php

소켓 및 대기열에 대한 더 높은 레벨의 액세스 권한 허용 LibEventZMQ의 일부 PHP 예제 코드 만들기 사용 :

이벤트 기반 서버 :

<?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 클라이언트 :

01 23,516,
<?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()); 

Source, Talk, Video (~22:00).