최근에 비동기식 PHP를 사용해야 하는 프로젝트를 진행 중이었습니다. PHP 소스 코드를 살펴보던 중 sysvsem, sysvshm, sysvmsg라는 세 가지 모듈을 발견했는데 많은 이점을 얻었습니다.
PHP에는 UNIX의 V IPC 함수 제품군 패키지인 이러한 함수 제품군이 있습니다.
사람들이 거의 사용하지 않지만 강력합니다. 현명하게 사용하면 절반의 노력으로 두 배의 결과를 얻을 수 있습니다.
여기에는 다음이 포함됩니다:
세마포어
공유 메모리
프로세스 간 메시징(IPC)
이를 기반으로 메시지 기반 시스템에 PHP 패키지를 사용하는 것이 전적으로 가능합니다.
그러나 먼저 몇 가지 중요한 기본 사항을 소개해야 합니다.
int ftok ( string pathname, string proj ) //ftok将一个路径名pathname和一个项目名(必须为一个字符), 转化成一个整形的用来使用系统V IPC的key
Ticks는 PHP 4.0.3부터 PHP에만 추가되었으며 선언 코드 조각입니다. 인터프리터가 N개의 하위 수준 명령문을 실행할 때마다 발생합니다. N 값은 선언의 지시문 부분에서 Ticks=N으로 지정됩니다.
function getStatus($arg){ print_r connection_status(); debug_print_backtrace(); } reigster_tick_function("getStatus", true); declare(ticks=1){ for($i =1; $i<999; $i++){ echo "hello"; } } unregister_tick_function("getStatus");
이것은 기본적으로
function getStatus($arg){ print_r connection_status(); debug_print_backtrace(); } reigster_tick_function("getStatus", true); declare(ticks=1){ for($i =1; $i<999; $i++){ echo "hello"; getStatus(true); } } unregister_tick_function("getStatus");
Message와 동일합니다. 이제 예제를 사용하여 Tick을 결합하여 PHP 메시지 통신을 구현하는 방법을 설명하겠습니다.
$mesg_key = ftok(__FILE__, 'm'); $mesg_id = msg_get_queue($mesg_key, 0666); function fetchMessage($mesg_id){ if(!is_resource($mesg_id)){ print_r("Mesg Queue is not Ready"); } if(msg_receive($mesg_id, 0, $mesg_type, 1024, $mesg, false, MSG_IPC_NOWAIT)){ print_r("Process got a new incoming MSG: $mesg "); } } register_tick_function("fetchMessage", $mesg_id); declare(ticks=2){ $i = 0; while(++$i < 100){ if($i%5 == 0){ msg_send($mesg_id, 1, "Hi: Now Index is :". $i); } } } //msg_remove_queue($mesg_id);
이 예에서는 먼저 ftok에서 생성된 키로 얻은 메시지 대기열에 PHP 실행 프로세스를 추가합니다.
그런 다음 Ticks를 통해 두 문마다 한 번씩 메시지 대기열을 쿼리합니다.
그런 다음 메시지 전송이 시뮬레이션됩니다.
브라우저에서 이 스크립트에 액세스하면 결과는 다음과 같습니다.
Process got a new incoming MSG: s:19:"Hi: Now Index is :5"; Process got a new incoming MSG: s:20:"Hi: Now Index is :10"; Process got a new incoming MSG: s:20:"Hi: Now Index is :15"; Process got a new incoming MSG: s:20:"Hi: Now Index is :20"; Process got a new incoming MSG: s:20:"Hi: Now Index is :25"; Process got a new incoming MSG: s:20:"Hi: Now Index is :30"; Process got a new incoming MSG: s:20:"Hi: Now Index is :35"; Process got a new incoming MSG: s:20:"Hi: Now Index is :40"; Process got a new incoming MSG: s:20:"Hi: Now Index is :45"; Process got a new incoming MSG: s:20:"Hi: Now Index is :50"; Process got a new incoming MSG: s:20:"Hi: Now Index is :55"; Process got a new incoming MSG: s:20:"Hi: Now Index is :60"; Process got a new incoming MSG: s:20:"Hi: Now Index is :65"; Process got a new incoming MSG: s:20:"Hi: Now Index is :70"; Process got a new incoming MSG: s:20:"Hi: Now Index is :75"; Process got a new incoming MSG: s:20:"Hi: Now Index is :80"; Process got a new incoming MSG: s:20:"Hi: Now Index is :85"; Process got a new incoming MSG: s:20:"Hi: Now Index is :90"; Process got a new incoming MSG: s:20:"Hi: Now Index is :95";
이것을 보면 모두가 이미 PHP를 이벤트 중심으로 시뮬레이션하는 방법에 대한 개념을 갖고 있습니까? 걱정하지 마십시오. 우리는 계속해서 개선해 나갈 것입니다.
모두가 세마포어의 개념을 잘 알고 있어야 합니다. 세마포어를 통해 프로세스 통신, 경쟁 등이 이루어질 수 있습니다. 다시 자세히 설명하지 않고 PHP에서 제공되는 세마포어 함수 집합을 간단히 나열하겠습니다.
sem_acquire -- Acquire a semaphore sem_get -- Get a semaphore id sem_release -- Release a semaphore sem_remove -- Remove a semaphore
구체적인 정보는 PHP 매뉴얼을 읽어보세요.
PHP sysvshm은 sysvsem 및 sysvmsg와 동일한 시리즈인 sysvshm을 제공하지만 여기서는 TIcks와 결합된 shmop 시리즈 기능을 사용하지 않았습니다.
function memoryUsage(){ printf("%s: %s<br/>", date("H:i:s", $now), memory_get_usage()); //var_dump(debug_backtrace()); //var_dump(__FUNCTION__); //debug_print_backtrace(); } register_tick_function("memoryUsage"); declare(ticks=1){ $shm_key = ftok(__FILE__, 's'); $shm_id = shmop_open($shm_key, 'c', 0644, 100); } printf("Size of Shared Memory is: %s<br/>", shmop_size($shm_id)); $shm_text = shmop_read($shm_id, 0, 100); eval($shm_text); if(!empty($share_array)){ var_dump($share_array); $share_array['id'] += 1; }else{ $share_array = array('id' => 1); } $out_put_str = "$share_array = " . var_export($share_array, true) .";"; $out_put_str = str_pad($out_put_str, 100, " ", STR_PAD_RIGHT); shmop_write($shm_id, $out_put_str, 0); ?>이 예제를 실행하고 계속 새로고침하면 인덱스가 증가하는 것을 볼 수 있습니다. 이 shmop을 사용하면 캐싱, 계산 등 PHP 스크립트 간 데이터 공유 기능을 완료할 수 있습니다. 더 많은 PHP 관련 지식을 알고 싶다면
PHP 중국어 웹사이트를 방문하세요!
위 내용은 PHP에 대해 당신이 모르는 것 - PHP의 이벤트 중심 디자인의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!