PHP 프로세스 관리를 위한 코드 예제
이 기사는 PHP 프로세스 관리에 대한 코드 예제를 제공합니다. 필요한 친구들이 참고할 수 있기를 바랍니다.
이 글은 이전 글을 보완하고 개선한 글입니다. 마스터 프로세스에 타이머를 설치하고, 5분마다 큐 길이를 감지하고, 큐 길이에 따라 필요한 작업자 프로세스를 계산합니다.
그런 다음 하위 프로세스를 생성하거나 종료합니다. 이것의 장점은 대기열이 쌓이고 작업이 제 시간에 처리되지 않는 것을 방지할 수 있다는 것입니다. 비즈니스 코드를 업데이트하려면 다시 로드 작업만 필요합니다.
전체 프로세스에는 다음 지식 포인트가 있습니다.
데몬 프로세스를 만드는 단계:
기본 파일 권한 설정
프로세스를 포크하면 상위 프로세스가 종료됩니다
setid 호출 새 세션 생성
현재 작업 디렉터리를 루트 디렉터리로 변경
더 이상 필요하지 않은 파일 설명자를 닫습니다.
신호를 사용하여 타이머 구현
이전 기사 타이머는 시스템에 의존합니다. timing 이 작업은 알람 시계 신호를 사용하여 구현됩니다. PHP 5.3.0 이하 버전은 틱을 사용합니다. 버전 5.3.0 이상에서는 pcntl_signal_dispatch
Signal을 사용할 수 있습니다. 특정 신호가 발생하면 프로세스가 수행됩니다. 신호를 처리하는 세 가지 방법이 있습니다.
이 신호를 무시합니다.
신호를 캡처합니다.
시스템 기본 작업을 수행합니다. 대부분의 신호에 대한 기본 작업은 프로세스를 종료하는 것입니다.
공통 신호
SIGKILL 및 SIGSTOP은 사용자가 무시하고 캡처할 수 없는 두 가지 신호입니다
SIGINT(2): 프로그램 종료 신호(일반적으로 Ctrl-C), 프로세스를 종료하도록 포그라운드 프로세스 그룹에 알리는 데 사용됩니다.
SIGQUIT( 3): SIGINT와 유사하지만 QUIT 문자(일반적으로 Ctrl+/)에 의해 제어됩니다. 프로세스가 이 메시지를 받고 종료되면 코어 파일이 생성됩니다.
SIGKILL(9): 프로세스를 즉시 종료하고 무시하거나 차단할 수 없습니다
SIGUSR1(10): 사용자 정의 신호
SIGUSR2(12): 사용자에게 맡김
SIGALRM(14): 알람 신호
SIGTERM(15): 프로세스를 종료하고 캡처할 수 있습니다. 프로세스가 정리 작업을 완료할 수 있도록 프로그램에 의해 수행됩니다.
SIGSTOP(19): 프로세스가 아직 종료되지 않았습니다.
모든 프로세스가 종료되면 좀비 프로세스가 됩니다. 부모 프로세스가 여전히 실행 중인 경우 wait 또는 waitpid가 호출되지 않으면 좀비 프로세스가 차지하는 리소스는 정리되지 않습니다. 부모 프로세스가 종료되면 좀비 프로세스는 init 프로세스에 의해 정리됩니다. .
비즈니스 코드를 조정하세요. 주요 코드는 다음과 같습니다
한 가지 주의할 점은 입력 및 출력을 닫는 데몬 프로세스를 생성할 때 오류 출력 스트림 뒤에 에코 및 기타 출력 문자가 있는 경우입니다. 코드를 실행하면 출력 스트림을 /dev/null로 리디렉션하기 위해 PHP 코드에 있어야 하는 치명적인 오류가 발생합니다. 또는 터미널이 프로세스를 시작할 때 리디렉션
<?php
define('PROC_MAX', 10);
define('PROC_MIN', 5);
$cmd = $argv[1];
$aPid = [];
$pidFile = __DIR__ . '/pid.pid';
$pid = file_get_contents($pidFile);
switch($cmd){
case 'start' :
if(posix_kill($pid, 0)){
echo "gamelog process is already exsits!\n";
return false;
}
//设置默认文件权限
umask(022);
//fork
$pid = pcntl_fork();
if($pid < 0){
exit('fork error!');
}else if($pid > 0){
exit;
}
//脱离当前终端
posix_setsid();
//将当前工作目录更改为根目录
chdir('/');
//关闭文件描述符
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);
//重定向输入输出
global $STDOUT, $STDERR;
$STDOUT = fopen('/dev/null', 'a');
$STDERR = fopen('/dev/null', 'a');
cli_set_process_title('gamelog:master');
$pid = posix_getpid();
file_put_contents($pidFile, $pid);
//闹钟信号
pcntl_signal(SIGALRM, function() use (&$aPid) {
pcntl_alarm(300);
$workerNum = mt_rand(1, 20);//此处检测你需要的进程数
$daemonNum = count($aPid);
($workerNum > PROC_MAX) && ($workerNum = PROC_MAX);
if($daemonNum < $workerNum){
$procNum = $workerNum - $daemonNum;
$procNum = max(PROC_MIN, $procNum);
for($p = 1; $p <= $procNum; $p++){
$pid = pcntl_fork();
if ($pid < 0) {
exit('fork error!');
} else if ($pid == 0) {
cli_set_process_title('gamelog:worker');
while (true) {
//do your work
usleep(100);
}
exit();
} else {
$aPid[] = $pid;
}
}
}else if($daemonNum > $workerNum){
$wokerNum = max($wokerNum, PROC_MIN);
$killNum = $daemonNum - $workerNum;
foreach($aPid as $key=>$pid){
if(posix_kill($pid, SIGKILL)){
unset($aPid[$key]);
if(--$killNum <= 0){
break;
}
}
}
}
}, false);
pcntl_signal(SIGUSR1, function() use (&$aPid, $pid){
foreach($aPid as $key=>$chpid){
if(!posix_kill($chpid, SIGKILL)){
echo "kill child $chpid faild\n";
}
}
posix_kill($pid, SIGKILL);
}, false);
pcntl_signal(SIGUSR2, function() use (&$aPid, $pid){
foreach($aPid as $key=>$chpid){
if(!posix_kill($chpid, SIGKILL)){
echo "kill child $chpid faild\n";
}
}
if(!posix_kill($pid, SIGALRM)){
echo "restart gamelog faild\n";
}
}, false);
posix_kill($pid, SIGALRM);
while (true) {
pcntl_signal_dispatch();
$pid = pcntl_wait($status, WUNTRACED);//不阻塞
}
break;
case 'stop' :
if(!posix_kill($pid, SIGUSR1)){
exit('stop gamelog process error!');
}
break;
case 'reload' :
if(!posix_kill($pid, SIGUSR2)){
exit('restop gamelog process error!');
}
break;
default :
echo "Useage php signal.php start|stop|reload\n";
}
위 내용은 PHP 프로세스 관리를 위한 코드 예제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Alipay PHP ...

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

기사는 PHP 5.3에 도입 된 PHP의 LSB (Late STATIC BING)에 대해 논의하여 정적 방법의 런타임 해상도가보다 유연한 상속을 요구할 수있게한다. LSB의 실제 응용 프로그램 및 잠재적 성능

기사는 입력 유효성 검사, 인증 및 정기 업데이트를 포함한 취약점을 방지하기 위해 프레임 워크의 필수 보안 기능을 논의합니다.

이 기사에서는 프레임 워크에 사용자 정의 기능 추가, 아키텍처 이해, 확장 지점 식별 및 통합 및 디버깅을위한 모범 사례에 중점을 둡니다.

PHP 개발에서 PHP의 CURL 라이브러리를 사용하여 JSON 데이터를 보내면 종종 외부 API와 상호 작용해야합니다. 일반적인 방법 중 하나는 컬 라이브러리를 사용하여 게시물을 보내는 것입니다 ...

PHP 개발에서 견고한 원칙의 적용에는 다음이 포함됩니다. 1. 단일 책임 원칙 (SRP) : 각 클래스는 하나의 기능 만 담당합니다. 2. Open and Close Principle (OCP) : 변경은 수정보다는 확장을 통해 달성됩니다. 3. Lisch의 대체 원칙 (LSP) : 서브 클래스는 프로그램 정확도에 영향을 미치지 않고 기본 클래스를 대체 할 수 있습니다. 4. 인터페이스 격리 원리 (ISP) : 의존성 및 사용되지 않은 방법을 피하기 위해 세밀한 인터페이스를 사용하십시오. 5. 의존성 반전 원리 (DIP) : 높고 낮은 수준의 모듈은 추상화에 의존하며 종속성 주입을 통해 구현됩니다.

Reactphp의 비 블로킹 기능에 대한 Reactphp의 심층적 인 해석의 비 차단 기능에 대한 공식 소개는 많은 개발자들의 질문을 불러 일으켰습니다.
