2016-11-03 3 views
1

PHP 서버에서 노드 서버로 일부 데이터를 보내야합니다. 성공적으로 내 노드 서버 및 출력이 메시지를 전송다시 쓰기 전에 socket_write가 완료 될 때까지 기다리십시오.

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
$result = socket_connect($socket, '127.0.0.1', '3000'); 
socket_write($socket, "Hello World", 11); 
socket_close($socket); 

이 코드를 실행 :

는 여기에 지금까지 PHP 측에서 무슨의 단순화 된 버전입니다.

그러나 소켓으로 둘 이상의 메시지를 다시 보내야합니다. 실제로 수천 건의 응답을 보내야합니다. 내가 였다면과 같이 루프 내에서 socket_write() 함수를 호출합니다 : 함께 모든 데이터를 추가하고 스크립트의 끝에서 한 번에 보낼 것으로 보인다

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
$result = socket_connect($socket, '127.0.0.1', '3000'); 
for($i=0;$i<1000;$i++){ 
    socket_write($socket, "Hello World", 11); 
} 
socket_close($socket); 

. 실시간으로 데이터를 다시 보내야합니다. PHP에서이 작업을 수행 할 수있는 방법이 있습니까?

+0

소켓이 성공한 답을 보내는 곳은 어디입니까? 리소스를 사용할 수 있는지 확인하는 방법은 무엇입니까? 보내기, 성공한 메시지 받기, 다시 보내기. 왜 소켓을 사용하여 대답 할 필요가 없다면? 정적 파일로 제공. – dsgdfg

+0

@dsgdfg 노드 서버가 데이터를 수신했다는 확인을받을 필요가 없습니다. 소켓에 대한 연결이 실패하면 예외가 발생합니다. –

+0

@dsgdfg 노드 서버가 성공 응답을 반환하도록해야합니까? 어쩌면 그게 PHP의 루프의 다음 반복에 가서 멋지다 내 유일한 방법이 될 것입니다 –

답변

1

많은 PHP 소켓 라이브러리를 살펴본 결과 거의 모든 소켓이 소켓을 보낸 후에 usleep(1000000)을 구현 한 것으로 나타났습니다. 이것이 최선의 방법인지는 확실하지 않지만 PHP의 한계로 인해 유일한 방법 일 수 있습니다.

결국 데이터가 소켓에 마지막으로 기록 된 시간을 저장하기로 결정했습니다. 그런 다음 경과 된 시간을 계산하고이를 1000000 마이크로 초에서 뺍니다. 이렇게하면 스크립트가 필요한 것보다 오래 기다리지 않습니다.

public function send(array $payload){ 
    $json = json_encode($payload); 
    $write = socket_write($this->socket, $json, strlen($json); 
    $sleep_time = 1000000 - (microtime(true) - $this->last_sent); 
    if($sleep_time > 0) usleep($sleep_time); 
    $this->last_sent = microtime(true); 
    return $write !== false ? true : false; 
} 
+0

나는 또한'socket_write' 여러 JSON 개체를 함께 추가 한 것 같습니다 문제가 실행됩니다. 왜 이런 일이 발생했는지 정확히 알았습니까? 'usleep (1000000)'솔루션을 구현하는 것은 모든 것이 완벽하게 작동합니다. –

+0

@ Stephan-v 나의 모호한 추측은 소켓이 보내질 때, 사람이 아직도 보내지고있는 경우에, 그들은 뒤죽박죽이되어 결국 얻는다이다. 실제로 위의 솔루션을 사용하는 작은 클래스를 썼습니다 : https://github.com/danjohnson95/PHP-Socket-Emitter –

+0

좋은 물건, 고마워. 그것은 내 프로젝트에 도움이 될 것입니다. 나는 아직도 이것을 정확히 일으키는 원인을 알고 싶다. :) –

관련 문제