>  기사  >  백엔드 개발  >  PHP에 대해 당신이 모르는 것 - PHP의 이벤트 중심 디자인

PHP에 대해 당신이 모르는 것 - PHP의 이벤트 중심 디자인

angryTom
angryTom앞으로
2019-10-15 11:20:131955검색

최근에 비동기식 PHP를 사용해야 하는 프로젝트를 진행 중이었습니다. PHP 소스 코드를 살펴보던 중 sysvsem, sysvshm, sysvmsg라는 세 가지 모듈을 발견했는데 많은 이점을 얻었습니다.

PHP에는 UNIX의 V IPC 함수 제품군 패키지인 이러한 함수 제품군이 있습니다.

사람들이 거의 사용하지 않지만 강력합니다. 현명하게 사용하면 절반의 노력으로 두 배의 결과를 얻을 수 있습니다.

여기에는 다음이 포함됩니다:

세마포어

공유 메모리

프로세스 간 메시징(IPC)

이를 기반으로 메시지 기반 시스템에 PHP 패키지를 사용하는 것이 전적으로 가능합니다.

그러나 먼저 몇 가지 중요한 기본 사항을 소개해야 합니다.

1.ftok

int ftok ( string pathname, string proj )
//ftok将一个路径名pathname和一个项目名(必须为一个字符), 转化成一个整形的用来使用系统V IPC的key

2.ticks

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__, &#39;m&#39;);
$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를 이벤트 중심으로 시뮬레이션하는 방법에 대한 개념을 갖고 있습니까? 걱정하지 마십시오. 우리는 계속해서 개선해 나갈 것입니다.

3. 세마포어

모두가 세마포어의 개념을 잘 알고 있어야 합니다. 세마포어를 통해 프로세스 통신, 경쟁 등이 이루어질 수 있습니다. 다시 자세히 설명하지 않고 PHP에서 제공되는 세마포어 함수 집합을 간단히 나열하겠습니다.

sem_acquire -- Acquire a semaphore
sem_get -- Get a semaphore id
sem_release -- Release a semaphore
sem_remove -- Remove a semaphore

구체적인 정보는 PHP 매뉴얼을 읽어보세요.

4. 메모리 공유

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__, &#39;s&#39;);
 
$shm_id = shmop_open($shm_key, &#39;c&#39;, 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[&#39;id&#39;] += 1;
 
}else{
 
 $share_array = array(&#39;id&#39; => 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 www.laruence.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제