이 글은 주로 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__, '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 실행 프로세스를 추가합니다.
그런 다음 틱을 통해 두 문마다 한 번씩 메시지 대기열을 쿼리합니다.
그런 다음 메시지 전송이 시뮬레이션됩니다.
브라우저에서 이 스크립트에 액세스하면 결과는 다음과 같습니다.
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__, '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 중국어 웹사이트의 기타 관련 기사를 참조하세요!