>  기사  >  백엔드 개발  >  PHP 이벤트 중심 디자인

PHP 이벤트 중심 디자인

不言
不言원래의
2018-04-09 17:39:351755검색

이 글은 주로 PHP 이벤트 중심 디자인을 소개합니다. 이제 여러분과 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다.

이 글은 PHP 이벤트 중심 디자인을 예시로 설명합니다. 참고하실 수 있도록 자세한 내용을 공유하고자 합니다.

최근 비동기식 PHP를 사용하는 프로젝트를 진행하던 중 PHP 소스 코드를 살펴보니 사용하지 않는 모듈이 3개나 발견되었습니다. , sysvsem, sysvshm 및 sysvmsg를 조사한 결과 이점이 엄청납니다.

PHP에는 이러한 함수 계열이 있습니다. 이는 Unix의 v ipc 함수 계열 패키지입니다.
사람들이 거의 사용하지 않지만 강력합니다. 현명하게 사용하면 절반의 노력으로 두 배의 결과를 얻을 수 있습니다.

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

세마포어
공유 메모리
프로세스 간 메시징(ipc)

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

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

1.ftok

int ftok(문자열 경로 이름, 문자열 proj)

ftok은 경로 이름과 프로젝트 이름을 변환합니다( 문자), 시스템 v ipc

2를 사용하는 데 사용되는 정수 키로 변환됩니다. 진드기

틱은 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와 동일합니다. 이제 진드기로 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 실행 프로세스를 추가합니다.

그런 다음 틱을 통해 두 문마다 한 번씩 메시지 대기열을 쿼리합니다.

그런 다음 메시지 전송이 시뮬레이션됩니다.

브라우저에서 이 스크립트에 액세스하면 결과는 다음과 같습니다.

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를 이벤트 드라이버로 시뮬레이션하는 방법에 대한 개념을 갖고 있습니까? 걱정하지 마십시오. 우리는 계속해서 개선해 나갈 것입니다.

2. 세마포어

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

sem_acquire -- 세마포어 획득
sem_get -- 세마포어 ID 가져오기
sem_release -- 세마포어 해제
sem_remove -- 제거 세마포어

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

3. 메모리 공유

php sysvshm은 sysvsem 및 sysvmsg와 동일한 시리즈에 속하는 메모리 공유 솔루션을 제공하지만 여기서는 shmop 시리즈 기능을 결합하여 사용하지 않았습니다. 진드기

function memoryusage(){
 printf("%s: %s<br/>", date("h:i:s",time()), 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.