2010-11-23 8 views
6

PHP에서 한 프로세스의 데이터를 다른 프로세스로 보내는 가장 빠른 방법은 무엇입니까? 데이터는 짧은 문자열입니다. Curretly AF_UNIX 소켓을 개발 한 솔루션이 있지만 벤치 마크 결과 한 프로세스에서 다른 프로세스로 데이터를 전달하는 데 0.100ms가 걸린다는 것을 보여줍니다. 나는 공유 메모리가 더 빨리 될 수 있다면 궁금해? 그러나, 나는 새로운 데이터가 쓰여지는 경우, 다른 프로세스가 공유 메모리를 정기적으로 검사하여이를 감지하도록하는 방법을 모른다.PHP에서 가장 빠른 IPC

현재 솔루션 :

$server = socket_create(AF_UNIX, SOCK_STREAM, 0); 
socket_bind($server, '/tmp/mysock'); 
socket_listen($server); 
while(true) { 
    $r = $clients; 
    if(socket_select($r, $w, $e, 5) > 0) { 
    $client = socket_accept($server); 
    $d = trim(socket_read($client, 256, PHP_NORMAL_READ)); 
    echo (microtime(true)-$d)."\n"; 
    socket_close($client); 
    } 
    flush(); 
} 
socket_close($server); 

그리고 클라이언트 :

$d = microtime(true)."\n"; 
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0); 
socket_connect($socket, '/tmp/mysock'); 
socket_write($socket, $d, strlen($d)); 
socket_close($socket); 

이 솔루션은 잘 완전히 작동하지만 결과는 다음과 같다 : 어떻게

0.00019216537475586 
9.5129013061523E-5 
0.00011920928955078 
0.00011801719665527 
7.6055526733398E-5 

모든 아이디어에 이 스크립트를 더 빠르게 만들거나보다 빠른 (공유 메모리 일 수도 있음) 솔루션을 개발할 수 있습니까? 사전에

감사합니다, 조나스

+0

이것이 병목 현상입니까? 벤치 마크에서 말하기는 어렵지만, 클라이언트와 서버 사이의 밀리 초 미만에서이 작업을 수행하는 것처럼 보입니다. 아마도 귀하의 질문에 귀하의 벤치 마크를 명확히하실 수 있습니다. –

+0

posix 스레드를 사용할 수없는 분명한 이유가 있거나 별도의 프로세스를 사용해야합니다. – SingleNegationElimination

+0

프로세스가 결합 될 수 있기 때문에 threds가 작동 할 수도 있다고 생각하지만, 어떻게해야 할 지 모르겠다. :) – flyeris

답변

1

공유 메모리는 프로세스 간의 데이터 interchnage의 가장 빠른 방법입니다. 동기화를 위해 세마포어를 사용합니다.

관련 문제