2011-12-21 4 views
4

이 질문에 대한 답변 (예 : here, herehere)에는 모두 비 로컬 소켓 연결을 지원하는 pfsockopen()이 관련되어 있습니다. 그러나, 지금까지 작성한 코드는 PHP를 사용하여 로컬 연결을 통해 C++ 서버에 액세스합니다. 이 연결을 영구적으로 유지하고 싶습니다. (필자는 부수적으로 Comet을 사용할 수있게되었습니다.) 여기 내 비 영구적 인 버전이다 :PHP의 영구 로컬 도메인 소켓

<?php 
session_start(); 

... 

if (($sock = socket_create(AF_UNIX, SOCK_STREAM,0)) === false) 
{ 
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; 
     exit(); 
} 
$sess_id = $_SESSION['sess_id']; 
$sock_str = '/tmp/sockdir/' . $sess_id; //The socket is named after the php session, not important 
if (socket_connect($sock, $sock_str) === false) 
{ 
     echo "socket_connect() to " . $sock_str . " failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n"; 
     socket_close($sock); 
     exit(); 
} 

$msg = $_GET['message']; 

// ... do things with $msg 

socket_close($sock); 
?> 

가 지금은 단순히 $ _SESSION 변수로 '$ 양말'를 저장할 수 없습니다 단순히 그것을이 스크립트가 호출 될 때마다 액세스, 나는 발견했습니다. 이것을 영구 연결로 바꿀 수있는 방법에 대한 조언

+1

여기서 문제는 요청이 상태 저장이라는 것입니다. PHP 응용 프로그램은 요청이 활성화되었을 때 메모리에서 실행 중입니다. 왜 연결성이 지속되어야할까요? – tkone

+0

@tkone 특정 클라이언트 요청과 독립적으로 서버에서 생성 된 메시지에 응답하려면 웹 페이지가 필요합니다. 이것은 일반적으로 요구되는 기능입니다 (예 : [여기] (http://en.wikipedia.org/wiki/Comet_%28programming%29); 이들은 서버 측 이벤트라고도합니다. –

+0

웹 소켓을 찾으십니까? "페이지"는 무언가를해야합니까? 이것은 클라이언트에로드 된 페이지를 의미합니까? socket.io를 사용해 보셨습니까? 아직 PHP 서버 인스턴스가 없지만 거기에 도움이 될 것입니다. 또는 웹 소켓이나 아약스 긴 폴링을 지원하는 방법을 살펴보십시오. – tkone

답변

4

당신이 제공 한 링크가 지적했듯이, php는 영속적 인 언어가 아니며 세션 (예 : 페이지로드)에서 영속성을 유지할 방법이 없습니다. 두 번째 PHP 스크립트를 데몬으로 실행하고 사용자의 주요 스크립트 (예 : 소켓을 통해 ...)에 연결하여 데이터를 가져와 중간 지점을 만들 수 있습니다.

웹 소켓의 번거 로움을 피하려면 새로운 HTML5 EventStream API을 사용하십시오. 두 가지 모두에서 최고의 이점을 제공하기 때문에 새로운 HTML5 EventStream API을 사용해보십시오. 긴 폴링의 해킹이없는 인프라와 같은 커밋이나 전용 웹 소켓 서버가 필요합니다.

+0

데몬을 만들지는 않았지만이 방법은 보이지 않는다. isn 내가 전에 해왔 던 일들. 여기 [http://devlog.info/2010/03/07/creating-daemons-in-php/] 튜토리얼과 [여기] (http : //)를 찾았습니다. kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/), 더 나은 리소스를 알고 있다면 알려주십시오.php' - 데몬은 실제로'var source = new EventSource ('stream.php');에서 작동한다고 가정합니다. 아직 명확하지 않지만, 더 깊은 통찰력도 있습니다. –

+0

데몬과 evepntstream에 대한 추가 질문을하고 싶을 것입니다. 우리가 볼 수 있도록 그들에게 자유롭게 링크하십시오. 현상금에 감사드립니다! – Mbrevda

2

연결을 유지해야하는 경우 PHP 스크립트를 열어 두어야합니다. 보통 PHP는 스크립트 실행 후 (CGI, CLI) 또는 스크립트가 완료된 후 PHP 인터프리터가 메모리에 남아있는 경우 (Apache의 mod_php, FCGI) 혼합되어 실행됩니다. 그 프로세스에 대한 OS는 여전히 소켓 핸들로 남을 것이다).

그러나 이것은 절대로 저장되지 않습니다. 대신 PHP를 메모리에 보관할 수있는 데몬으로 만들어야합니다. 기존 해결책은 Appserver-In-PHP입니다. 서버를 다시 시작할 때까지 메모리에 코드가 보관됩니다. 코드와 마찬가지로 요청간에 변수를 보존 할 수 있습니다 (예 : 연결 핸들.

+0

나는 이것에 일반적으로 동의한다. 사람들은 내 경험상 PHP 스크립트를 오랫동안 실행하면서 결과가 혼합되어있을 것이다. 대부분의 경우 메모리 누수는 b/c를 극복하기가 어렵습니다. PHP는 구축/해체 방식을 염두에두고 설계되었습니다. 그 말은 내가 오래 동안 성공적인 PHP 스크립트 인 YMMV를 보았다는 이야기지만,이 경우 가장 좋은 방법이다. PHP에서 메모리가 누출되면 Java 또는 C를 고려해야합니다. – quickshiftin

+0

PHP에서 메모리 누수가 발생하면 코드에 결함이 없는지 확인하십시오. C 또는 Java에서 메모리 누수 코드를 작성하여 말할 수 있습니다. 그냥 주목 해. – hakre

+1

Mongrel2도 여기에 있습니다 : http://mongrel2.org/ – igorw