계획된 작업에서는 가끔 반복 실행이 표시됩니다.
예를 들어 우리 회사의 계획된 작업:
*/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
이 방법은 코드를 변환하는 것입니다. 프로세스 실행 여부 판단을 추가합니다. 예를 들어, 다음 코드는
<?php $lockfile = '/tmp/mytest.lock'; 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 명령은 파일 잠금 기능을 제공합니다. 명령 매개변수는 다음과 같습니다:
[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 중국어 웹사이트의 기타 관련 기사를 참조하세요!