2011-12-25 2 views

답변

31

공유 메모리를 사용하면 여러 프로세스가 메모리의 동일한 데이터에 액세스 할 수 있습니다. 이 스크립트를 사용하여 실행중인 PHP 스크립트간에 데이터를 공유 할 수 있습니다.

$shm = shmop_open(0xF00, "c", 0644, 4); 

$count = unpack('L', shmop_read($shm, 0, 4)); 
$count = reset($count); 
var_dump($count); 
echo "count: ", $count++, "<br/>\n"; 
shmop_write($shm, pack('L', $count), 0); 

컴퓨터가 다시 시작되면 공유 메모리의 내용이 모두 손실됩니다.

서로 다른 프로세스가 동일한 공유 메모리에 동시에 액세스 할 수 있으므로 race conditions이 될 수 있습니다. 위의 예에서, 두 프로세스가 다시 쓰기 전에 공유 메모리를 읽으면 그 수는 1보다 적어집니다. 레이스 조건은 mutex을 사용함으로써 방지하지만, 그 & A.

inter-process communication 공유 메모리의 한 유형, 즉, 데이터 전달에 사용되는이 Q의 범위 밖이다 수있다. (플랫폼 및 PHP 빌드에 따라) PHP에서 사용할 수있는 일부 다른 사람들은 다음과 같습니다

  • 신호 (posix_kill가 신호 처리기를 설정, pcntl_signal을 신호를 보내는), 메시지 전달의 제한된 유형입니다. 시그널은 각 스크립트가 매우 짧은 시간 동안 실행되어야하기 때문에 스크립트 페이지에서 특히 유용하지 않습니다.
  • Sockets (데이터 용) 소켓은 네트워크를 사용할 수도 있고 로컬 일 수도 있습니다.
  • 데이터 용 파이프. posix_mkfifo을 사용하여 named pipes (일명 FIFOs)을 만들고 표준 file 함수를 사용하여 데이터를 읽고 씁니다. 부모 프로세스와 자식 프로세스 간에는 popen 또는 proc_open을 사용하여 파이프를 만들 수 없습니다 (일명 anonymous). 이름없는 파이프는 임의의 프로세스간에 작성할 수 없습니다. 일부 시스템의 파이프는 단방향입니다. 파이프 핸들은 읽기 또는 쓰기 중 하나만 사용할 수 있지만 둘 다 사용할 수는 없습니다.
  • Semaphoressynchronization.
  • messaging의 메시지 대기열. PHP에서 Semaphore 확장은 메시지 큐와 다른 공유 메모리 함수 세트 (예 : shm_attach)를 모두 제공합니다. SAM, STOMPAMQP을 비롯한 다양한 메시징 프로토콜을위한 다른 많은 확장도 사용할 수 있습니다. PHP 매뉴얼의 "Other Services"을 참고하십시오.
  • 데이터 용 네트워크 stream wrappers 더 낮은 레벨에서 이들은 서로 다른 인터페이스를 제공하지만 소켓 일뿐입니다. 또한 특정 응용 프로그램 수준 프로토콜을 사용하는 반면 소켓은보다 일반적입니다.
  • Network protocol extensions, 예 : cURL, 메시징 & 데이터 용. 스트림 래퍼와 마찬가지로, 이것들은 변장의 소켓이다.
  • Web service extensions, 예 : SOAPXML-RPC, remote procedure calls (RPC). 이것들은 소켓 기반이지만 IPC (데이터가 아닌 RPC)를위한 것입니다.

프로세스간에 데이터를 전달하기 위해 소켓 (및 스트림 래퍼와 같은 것들을 기반으로 한 모든 것)과 파이프를 사용할 수 있지만 두 개 이상의 프로세스가있는 능력은 제한적입니다. 소켓은 두 개의 프로세스 만 연결할 수 있습니다. 3 개 이상을 처리하려면 여러 개의 소켓을 열어야합니다 (클라이언트 - 서버 아키텍처가 일반적으로 제공됩니다). 파이프를 사용하면 하나의 프로세스 만 가능합니다. read given data; 데이터가 있으면 다른 데이터를 읽을 수는 있지만 다른 사용자가 사용할 수 없게됩니다. 그러면 다른 사용자가 읽을 수 없게됩니다. 임의의 수의 프로세스가 동일한 공유 메모리 영역을 열 수 있습니다.

+0

수신 프로세스가 메시지에 반응하게하여 이벤트가 구동되도록하는 좋은 방법이 있습니까? – CMCDragonkai

+0

@outis, Windows는 무엇입니까? – Pacerier

+0

여러 노드 서버에서 어떻게 작동합니까? –

9

실행중인 프로세스가 메모리를 요청하면 시스템은 할당 된 프로세스에서만 액세스 할 수있는 메모리 조각을 제공합니다. 때로는 여러 스레드를 실행하고 그 사이에서 데이터를 공유하려고합니다. 데이터를 전달하는 것은 일부에 매우 편리하지 않기 때문에 소켓/파이프를 통해

  • 데이터 전달
  • 공유 메모리 (스레드, 프로세스)

을 :

"데이터 공유"를 수행 할 수 경우에 따라 Shared memory을 사용할 수 있습니다.

해당 함수는 PHP에서 공유 메모리 세그먼트를 처리하는 기능을 제공합니다.

+0

그래서 기본적으로 쓸모가 없습니까? 제 말은 여러분이 전역 변수를 사용할 수 있다면 shmop_ * 함수를 사용하는 것입니다. – Alex

+2

@Alex : PHP에는 "전역 변수"가 없습니다. PHP에서는 항상 프로세스 공간을 분리 했으므로 잘못된 이름입니다. - shmop을 memcache와 비슷하게 생각하십시오. PHP와 C 애플리케이션 간 공유를 목적으로하는 POSIX/Unix 시스템 기능을 제외하고는 (바이너리 표현 불일치가 아닌 경우 해당 사본을 찾을 수 없습니다). 실제로 램 디스크라고 상상할 수도 있습니다. 사실 shmop은 보통'/ etc/shm/* '에 파일 항목을 만듭니다. – mario

+0

공유 메모리는 운영 체제에서 관리합니다. 그들은 전역 변수의 제한된 사용과 비교하여 더 많은 보호 및 제어 서비스를 제공합니다. 공유 메모리는 주로 프로세스 간 통신에 사용됩니다. 이것을 명시 적으로 필요로하지 않는다면 변수를 사용하십시오. – fuzzy

관련 문제