2017-11-28 31 views
1

C++로 작성된 응용 프로그램과 PHP로 스크립팅 된 웹 서버 간의 통신을 구현해야했습니다. 기본 아이디어는 C++ 응용 프로그램으로 소켓을 만들고 바인딩 한 다음 PHP 연결을 수신 대기하는 것입니다. 그런 다음 PHP는 TCP를 통해 데이터를 요청하는 메시지를 보내고 C++은 대답을 다시 보냅니다. 단일 헤더 요청, 단일 문자열 (JSON) 응답. 지금까지 그렇게 좋았습니다. 는 C++ (서버 측) 전송 데이터와 PHP 측 (클라이언트 측과동일한 기계에서 소켓 연결, PHP to C++ 및 back

<?php 
error_reporting(E_ALL); 

$service_port = 8080; 
$address = 'localhost'; 


$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
if ($socket === false) { 
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; 
} 

echo "Attempting to connect to '$address' on port '$service_port'..."; 
$result = socket_connect($socket, $address, $service_port); 
if ($result === false) { 
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n"; 
} 


$in = "request1"; 

$out = ''; 

socket_write($socket, $in, strlen($in)); 

$buf = 'This is my buffer.'; 
if (false !== ($bytes = socket_recv($socket, $buf, 2048, MSG_WAITALL))) { 
    echo "Read $bytes bytes from socket_recv(). Closing socket..."; 
} else { 
    echo "socket_recv() failed; reason: " . socket_strerror(socket_last_error($socket)) . "\n"; 
} 
socket_close($socket); 

echo $buf . "\n"; 
//elaborate the $buf 
?> 

지금 나는 또한 데이터의 자동 업데이트를 구현하고 싶습니다 : 이 내가 PHP 측에 사용되는 코드입니다) 그들을 수집합니다. 데이터 업데이트는 1 분마다 완료해야합니다. 슬프게도 웹 개발에 대한 많은 경험이 없으므로 친절하게도 그에 대한 조언을 구하고 있습니다.

내가 할 수있는 가장 쉬운 방법은 알려진 메시지가 수신 될 때까지 PHP 코드를 반복하는 것입니다. 내가 직면 한 문제는 루프가 끝나고 PHP 스크립트가 끝날 때까지 데이터를 얻지 못한다는 것입니다. 문제를 극복하기 위해 PHP 측 소켓을 non-blocking으로 설정하려고 시도했습니다. socket_recv 옵션을 MSG_WAITALL에서 MSG_DONTWAIT로 바꾸었지만 아무 것도 변경되지 않았습니다. 그런 다음 PHP 스크립트를 벗어나려고했지만 매 초마다 데이터를 얻으려면주기가 필요하기 때문에 완료 할 수 없습니다. 플러스 루프 사이클 동안 PHP가 실행되는 아파치 서버에 503 오류가 발생했습니다. 서버를 사용할 수 없습니다. 왜 이런 일이 발생했는지, 수신 된 메시지 버퍼가 꽉 찼거나 스크립트가 너무 많은 리소스를 사용하는지 알 수 없습니다. 경험이 부족하여 그 이유를 이해할 수 없습니다. 내가 필요로하는 것을 수행 할 수있는 좋은 라이브러리가 있음을 알고 있지만 임베디드 머신에서 작업 중이므로 기본 라이브러리로 작업하는 데 한계가 있습니다.

Apache 서버에서 PHP를 사용하여 C++ 응용 프로그램에서 시간이 지정된 데이터를 얻으려면 어떻게해야합니까? 나는 무엇을 간과하고 있는가? 도움을 위해 미리 감사드립니다.

편집 : 수사학 질문이 삭제되었습니다.

+0

[올바른 방향으로 나를 가리킨다]는 실제 질문이 아닙니다.] (https://meta.stackexchange.com/questions/226103/are-point-me-in-the-right-direction- 질문 가능) –

답변

2

tcp/ip를 통해 다른 프로세스에서 데이터를 얻으려면 php를 사용하면 apache를 통해 실행되는 PHP 스크립트에서 tcp/ip 소켓을 사용하는 다른 프로세스로 데이터를 보내는 데 비해 약간의 노력이 필요합니다.

PHP 스크립트는 아파치 외부에서 시작해야하며 입력 데이터를 읽기 위해 주어진 포트를 지속적으로 청취하는 무한 루프가 필요합니다. following post은 내가 당신이 생각하는 것을 개략적으로 설명합니다. 같은 레디 스와 같이 메모리 데이터 저장에 사용할 수있는 웹 페이지에 결과를 표시하기 위해

편집

. PHP 서버 응용 프로그램은 redis에서 데이터 구조를 업데이트하고, 웹 페이지 onload는 redis에서 최신 값을 가져와 화면에 표시 할 수 있습니다. 그러나 페이지 새로 고침이 필요합니다.

서버 포스트 백없이받은 데이터를 즉시 새로 고쳐야하는 경우 일부 자바 스크립트가 필요합니다.사용자가 페이지를로드하면 websocket 연결을 websocket 서버로 초기화합니다 (사람들은 일반적으로이를 구현하기 위해 node.js 및 socket.io를 사용하지만 기술을 지원하는 모든 곳에서는 websocket 서버를 코딩 할 수 있습니다). websocket 서버는 redis 채널에 가입되어 업데이트되면 연결된 모든 클라이언트에 새 값을 보냅니다. 나는 이것이 당신의 요구 사항이 무엇인지에 따라 redis없이 수행 될 수 있다고 생각합니다. websocket 서버용 프로그램은 별도의 스레드를 사용하여 C++ 프로그램의 정보를 받아들이는 서버가 될 수도 있습니다. 데이터가 C++ 프로그램에서 제공되면 websocket을 통해 연결된 클라이언트로 직접 보낼 수 있습니다.

+0

나는 아파치 밖에서 PHP 스크립트로 무슨 뜻인지 알 수있다. 그런 다음 웹 페이지에서 어떻게 결과를 시각화 할 수 있습니까? – Podarce

+0

@Podarce updated 대답 – commanderZiltoid

1

바퀴를 재발 명하지 마십시오. 웹 소켓을 사용하십시오. 이 비동기 통신을 수행하도록 설계되었으며 JSON을 정상적으로 보낼 수 있습니다.

C++ 및 PHP 용 라이브러리가 있습니다. 이는 매우 쉬워야 함을 의미합니다.

+0

제안 해 주셔서 감사합니다. 헤더 만있는 경우가 아니면 외부 라이브러리를로드 할 수 없습니다. 어쩌면 웹 소켓 용 코드를 직접 작성할 수도 있습니다. 가능하다고 생각하십니까? – Podarce

+0

아니요, 웹 소켓이 없으면 JSON 객체가 소켓을 통해 앞뒤로 전달됩니다. 유일한 문제는 객체가 버퍼에서 완료 될 때를 모르기 때문에 길이를 먼저 보낸 다음 json 객체를 전송해야합니다. 그런 다음 다른 쪽에서 길이를 읽은 다음 해당 바이트를 읽고 호출합니다. JSON.parse()를 사용하여 다음 메시지를 위해 남겨진 항목을 유지합니다. – UserOneFourTwo