스크립트가 이미 실행 중이면 실행 안 함
저는 이 질문에 대한 답을 찾지 못했습니다.여기 누군가가 도와줬으면 좋겠네요.
사용자가 누르면 이미지를 자동으로 불러와 처리하는 PHP 스크립트(구체적으로는 WordPress 템플릿)가 있습니다.문제는 특히 여러 사용자가 동시에 템플릿에 액세스하여 이미지 처리를 시작하는 경우 이미지 처리에 많은 메모리가 소요된다는 것입니다.이것 때문에 서버가 여러 번 다운되었습니다.
이에 대한 제 해결책은 이미 실행 중인 이미지 처리 기능을 실행하지 않는 것이었습니다.함수 실행을 시작하기 전에 image_import_running이라는 데이터베이스 항목이 false로 설정되었는지 확인합니다.그런 경우 함수가 실행됩니다.함수가 가장 먼저 수행한 작업은 image_import_running을 true로 설정한 것입니다.그리고 나서, 모든 것이 끝난 후에, 저는 그것을 거짓으로 되돌렸습니다.
이론적으로 아주 효과적이었습니다.그 이후로 사이트가 다운된 적이 없어요, 그건 말씀드릴 수 있어요.하지만 이 문제에는 크게 두 가지 문제가 있습니다.
페이지가 로드되는 동안 사용자가 페이지를 닫으면 스크립트는 이미지 처리를 완료하지 않으므로 image_import_running을 false로 다시 설정하지 않습니다.템플릿은 수동으로 false로 설정될 때까지 이미지를 다시 처리하지 않습니다.
스크립트가 이미지를 처리하는 동안 시간이 초과되고 대기열에 많은 이미지가 있는 경우에는 1번과 근본적으로 동일한 문제가 발생합니다. 스크립트가 image_import_running을 false로 다시 설정하는 시점에 도달하지 못합니다.
두 중 첫 문제)을 처리하기 1번(1번 가 를 했습니다 는 하기 했습니다 는 를 가 하기 )을 추가했습니다.ignore_user_abort(true)
요?효과가 있던가요?잘 모르겠어요, 2번은 아직도 이슈거든요.거기서 난감해요.
스크립트 실행 여부를 서버에 문의할 수 있다면 다음과 같은 작업을 수행할 수 있습니다.
if($import_running && $script_not_running) {
$import_running = false;
}
그 하죠 하죠 하죠?$script_not_running
◦? 도저히 모르겠는데요.
혹시 다른 멋진 해결책이 있을지도 모르니 이 모든 이야기를 당신과 함께 나눴습니다.
를 사용해 .ignore_user_abort(true);
사용자가 브라우저를 종료하고 닫더라도 계속 실행됩니다.
db 레코드에 true false 대신 숫자를 넣고 함께 실행할 수 있는 프로세스의 최대 수를 설정할 수도 있습니다.
다른 사람들이 제안한 것처럼, 요청 자체에서 이미지 처리를 옮기는 것이 가장 좋을 것 같습니다.
임시 "수정"으로 타임스탬프를 나란히 저장합니다.image_import_running
가공 작업이 시작되는 시점(예:image_import_commenced
이는 매우 조잡한 메커니즘이지만, 작업이 실행될 수 있는 최대 시간을 타임아웃 전에 알면 스크립트는 해당 시간이 경과했는지 확인할 수 있습니다.
예를 들면, 만일image_import_running
아직 사실이지만 현재 시간은 10분 이상입니다.image_import_commenced
, 어쨌든 처리를 실행합니다.
작업을 제어할 만료 시간이 있는 과도를 설정하는 것은 어떻습니까?
if(!get_transient( 'import_running' )) {
set_transient( 'import_running', true, 30 ); // set a 30 second transient on the import.
run_the_import_function();
}
작업을 보류 중인 데이터베이스 플래그에 저장하고 cron 작업을 설정하여 한 번에 하나의 작업을 처리하도록 하겠습니다.
나는 텍스트 문서와 함께 이 간단한 아이디어를 사용합니다.예를 들어 run.txt 파일입니다.
상위 스크립트에서 다음과 같이 사용합니다.
if((file_get_contents('run.txt') != 'run'){ // here the script will work
$file = fopen('run.txt', 'w+');
fwrite($file, 'run');
fclose('run.txt');
}else{
exit(); // if it find 'run' in run.txt the script will stop
}
스크립트 파일 끝에 추가합니다.
$file = fopen('run.txt', 'w+');
fwrite($file, ''); //will delete run word for the next try ;)
fclose('run.txt');
확인을 통해 스크립트가 이미 작동하는지 확인합니다.runt.txt
내용물
run word 가 존재하는 경우run.txt
실행되지 않습니다.
크론을 실행하는 것이 확실히 더 나은 해결책이 될 것입니다.url을 테이블에 저장하는 아이디어가 좋습니다.
원래 질문에 답하려면 exec을 사용하여 ps auxwww 명령을 실행할 수 있습니다(이 페이지를 확인하십시오:PHP exec(?)을 사용하여 실행 중인 pp 스크립트 목록을 얻고 별도의 pp 파일로 함수를 이동하는 방법.
exec("ps auxwww|grep myfunction.php|grep -v grep", $output);
스크립트 맨 위에 다음을 추가하면 됩니다.
<?php
// Ensures single instance of script run at a time.
$fileName = basename(__FILE__);
$output = shell_exec("ps -ef | grep -v grep | grep $fileName | wc -l");
//echo $output;
if ($output > 2)
{
echo "Already running - $fileName\n";
exit;
}
// Your php script code.
?>
언급URL : https://stackoverflow.com/questions/18114011/dont-run-script-if-its-already-running
'programing' 카테고리의 다른 글
플러그인에서 사용자 정의 페이지 템플릿 추가 (0) | 2023.09.18 |
---|---|
과학적 표기법 방지 (0) | 2023.09.18 |
웹 보기에서 파일 업로드 (0) | 2023.08.29 |
페이지를 닫을 때(남기지 않을 때) 언로드하기 전에 jquery? (0) | 2023.08.29 |
jquery, ID 내 클래스 선택기 (0) | 2023.08.29 |