English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

php에서 프로세스 락 및 다중 프로세스 구현 방법

프로세스 락이 필요한 이유는 무엇인가요?

주요 기능은 동일한 프로그램을 중복 실행하지 않도록 하며, 주로 crontab에서 사용됩니다.定时 작업을 설정하고 매 분마다 실행하는 경우, 프로세스가 완료되지 않은 상태에서는 매 분마다 새로운 프로세스가 생성됩니다. 프로세스 락을 추가하면, 매번定时 작업이 실행될 때마다 이전 프로세스 락이 존재하는지 확인하고, 존재하면 실행하지 않습니다.

1.단일 프로세스 상태의 프로세스 락 구현

예를 들어, php 스크립트를 작성해 보겠습니다. 먼저 process.php라는 이름으로命名해 보겠습니다. 코드는 다음과 같습니다:

<?php
$lock_file = dirname(__FILE__) . "/process.lock";
$lock_file_handle = fopen($lock_file, 'w');
if ($lock_file_handle === false)
 die("Can not create lock file {$lock_file}\n");
if (!flock($lock_file_handle, LOCK_EX + LOCK_NB)) {
 die(date("Y-m-d H:i:s") . " Process already exists.\n");
}
while(1{
}

그런 다음 linux 환경에서 이 코드를 실행합니다. 첫 번째 실행은 정상적으로 실행되지만, 두 번째 실행 시에는 "Process already exists."라는 메시지가 표시되고, 이후 실행된다 하더라도 이 메시지가 계속 표시되어 프로세스가 실패하는 것처럼 보입니다.

php process.php & //& 기호는 백그라운드에서 php를 실행하는 것을 의미합니다


위의 코드는 타이머 계획된 스크립트에도 사용할 수 있습니다. 시작 부분에 추가하면 됩니다. 단일 스크립트에 프로세스 락을 추가하는 것과 같습니다.

2. 다중 프로세스 구현을 위한 프로세스 락

위의 코드는 하나의 락이 하나의 php 스크립트에 해당한다고 했지만, 다중 프로세스를 구현하려면 실제로는 하나의 프로세스가 여러 개의 프로세스 락을 가질 수 있게 해야 합니다.
위의 코드의 프로세스 락 이름 부분을 조금 수정하면 됩니다. 전달된 매개변수에 따라 프로세스 락 이름을 결정하면 됩니다. 전달된 매개변수가 일치하면 같은 락이 됩니다.

if(!($argc > 1))
{
 $lock_file = dirname(__FILE__) . "/process.lock";
}else{
 unset($argv[0]);
 $lock_file = dirname(__FILE__) . "/process". implode('.', $argv) .".lock";
}
$lock_file_handle = fopen($lock_file, 'w');
if ($lock_file_handle === false){
 die("Can not create lock file $lock_file\n");
}
if (!flock($lock_file_handle, LOCK_EX + LOCK_NB)) {
 die(date("Y-m-d H:i:s") . " Process already exists.\n");
}
while(1{
}

linux 환경에서는. 파일이 있는 디렉토리로 이동하여 php process.php를 실행합니다 1그런 다음 새 창을 엽니다. 그리고 php process.php를 실행합니다 1이 오류가 표시됩니다. 하지만 php process.php를 실행하는 경우 2이렇게 하면 정상적으로 실행됩니다. 마찬가지로 두 개의 매개변수를 전달할 수 있습니다. 예를 들어 php process.php 1 2그렇게 하면 새로운 프로세스 락이 됩니다. 이 구현은 argc와 argv라는 php가 제공하는 매개변수를 사용합니다. argc는 매개변수 총 수를 나타내며, argv는 실제 호출 때 사용된 매개변수를 나타냅니다.

3. 프로세스 락은 yii에서2의 구현

yii에서2yii의 console에서 컨트롤러를 상속받아야 합니다. 이렇게 하면 매개변수 전달이 가능하며, use yii\console\Controller;로 구현할 수 있습니다.
그런 다음 crontab에서, 명령어는 다음과 같습니다. yii가 제공하는 명령어를 사용하여 타이밍 스크립트를 실행합니다. 그런 다음 프로세스 락 코드는 위와 같습니다.

* * * * * root /usr/local/bin/php /data/www/html/newVanish/yii 컨트롤러 이름/전달된 매개변수 메서드 > /dev/null 2>&1

4. 프로세스를 죽이는 명령어

이것은 정말로 가슴에 품고 있는 것입니다. 일반 사람에게는 알려주지 않습니다.
하나의 명령어로 해당 프로세스를 지울 수 있습니다. 아래 명령어는 process_name라는 이름의 모든 프로세스를 지울 수 있는 명령어입니다. 지울 프로세스를 지정하려면 process_name을 원하는 프로세스 이름으로 변경하면 됩니다.

ps aux|grep process_name |grep -v grep|awk '{print $2}'|xargs kill -9

결론

이것은 php에서 프로세스 락과 멀티 프로세스 구현에 대한 모든 내용입니다. 이 기사의 내용이 여러분의 PHP 학습이나 사용에 도움이 되길 바랍니다. 질문이 있으면 댓글을 달고 교류해 주세요.呐喊 가이드에 대한 여러분의 지지에 감사합니다.

언급: 이 문서의 내용은 인터넷에서 가져왔으며, 저작권은 원저자에게 있으며, 인터넷 사용자가 자발적으로 기여하고 업로드한 내용입니다. 이 사이트는 소유권을 가지지 않으며, 인공 편집을 하지 않았으며, 관련 법적 책임을 부담하지 않습니다. 저작권 침해가 의심되는 내용이 있으면, notice#w로 이메일을 보내 주세요.3codebox.com(이메일을 보내면, #을 @으로 변경해 주세요. 신고하고 관련 증거를 제공하시면, 사이트는 즉시 저작권 침해 내용을 삭제합니다.

좋아하는 것