>백엔드 개발 >PHP 튜토리얼 >crond 스크립트 실행 시 동시성 충돌을 해결하는 방법은 무엇입니까?

crond 스크립트 실행 시 동시성 충돌을 해결하는 방법은 무엇입니까?

零下一度
零下一度원래의
2017-06-23 14:31:501387검색

계획된 작업에서는 가끔 반복 실행이 표시됩니다.

예를 들어 우리 회사의 계획된 작업:

*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testOne >/dev/null 2>&1*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testTwo >/dev/null 2>&1

이 작업은 2분에 한 번씩 실행된다는 보장이 없습니다. 2분 안에 실행이 완료되고, 프로세스가 계속 누적되면 시스템 리소스가 고갈될 수 있습니다.

예:

다음 코드를 사용하여 새 test.php 파일을 만듭니다.

<?php
sleep(70);?>

예약된 작업 추가:

*/1 * * * * root cd /home/ganjincheng;php test.php

실행 대기 중, 누적 발생

root     26722  0.0  0.0   9232  1064 ?        Ss   12:05   0:00 /bin/sh -c cd /home/ganjincheng;php test.php
root     26744  0.0  0.0 112304  8840 ?        S    12:05   0:00 php test.php
root     29102  0.0  0.0   9232  1060 ?        Ss   12:06   0:00 /bin/sh -c cd /home/ganjincheng;php test.php
root     29116  0.1  0.0 112304  8840 ?        S    12:06   0:00 php test.php
root     29906  0.0  0.0 103320   904 pts/3    S+   12:06   0:00 grep test.php

Solution

먼저, 제어 in code Concurrency

이 방법은 코드를 변환하는 것입니다. 프로세스 실행 여부 판단을 추가합니다. 예를 들어, 다음 코드는

<?php  
$lockfile = &#39;/tmp/mytest.lock&#39;;  
   
if(file_exists($lockfile)){  
    exit();  
}
file_put_contents($lockfile, date("Y-m-d H:i:s"));
   
sleep(70);
 
unlink($lockfile);  
?>

파일이 존재하지 않는지 확인하는 이 방법에는 문제가 있습니다. 즉, 프로그램이 끝까지 실행되지 않았을 가능성, 즉 이전에 생성된 mytest.lock 파일이 삭제되지 않았을 가능성이 있다. 이로 인해 향후 프로그램이 제대로 실행되지 않을 수 있습니다.

두 번째, 데이터베이스 제어 동시성

첫 번째 솔루션은 핵심 가치 판단을 위해 redis 및 memache로 이전될 수 있습니다.

예약된 작업이 데이터베이스에 액세스하는 것이라면 테이블 잠금 작업을 수행할 수 있습니다. 때로는 반복 삽입을 피하기 위해 고유 인덱스와 조인트 인덱스의 고유성을 사용할 수도 있습니다.

세 번째 방법은 프로세스가 존재하는지 확인하는 것입니다.

예:

$fp = popen("ps aux | grep 'test.php' | wc -l", "r");
$proc_num = fgets($fp);if ($proc_num > 3) { //这里要注意为什么进程数要大于3,实际操作一遍你就明白了exit;
}
sleep(70);

이 방법에는 단점이 있습니다. ps 명령은 정확하게 작성되어야 합니다. test.php 스크립트를 실행하지 않는 프로세스를 계산하지 마세요. 예:
vim을 통해 test.php 파일을 엽니다. 이로 인해 위 명령이 잘못 계산됩니다. 따라서 실수로 vim에서 test.php 파일을 열면 실행할 수 없습니다.

네 번째 방법은 Linux의 Flock 명령을 사용하는 것입니다.

Linux가 판단하는 데 도움이 되도록 Flock 명령은 파일 잠금 기능을 제공합니다. 명령 매개변수는 다음과 같습니다:

[root@qkzj_Multi-Purpose_1A_113.107.248.124 ganjincheng]# flock -h
flock (util-linux-ng 2.17.2)
Usage: flock [-sxun][-w #] fd#
       flock [-sxon][-w #] file [-c] command...
       flock [-sxon][-w #] directory [-c] command...  -s  --shared     Get a shared lock
  -x  --exclusive  Get an exclusive lock
  -u  --unlock     Remove a lock
  -n  --nonblock   Fail rather than wait  -w  --timeout    Wait for a limited amount of time  -o  --close      Close file descriptor before running command  -c  --command    Run a single command string through the shell  -h  --help       Display this text  -V  --version    Display version

구성 예:

*/1 * * * * root flock -xn /tmp/mytest.lock -c 'php ./test.php'

위 내용은 crond 스크립트 실행 시 동시성 충돌을 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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