업로드가 성공하면 CSV 파일을 업로드하고 서버가 즉시 응답하도록 할 수 있습니다. 서버는 CSV를 대기열에 붙이고 스케줄러가 대기열에서 파일을 가져 와서 별도의 프로세스에서 모든 작업을 수행 할 수 있습니다. 클라이언트는 서버가 대량 작업을 완료했는지 확인하기 위해 주기적으로 ajax 요청을 보냅니다. 완료되면 서버는 CSV의 모든 항목에 대한 모든 작업 및 오류에 대한 요약과 함께 ajax 호출에 응답합니다. 항목을 일괄 처리하는 전체 목적을 상실한 CSV 항목 당 아약스 호출을 보내지 않을 것입니다.
Linux에서 실행 중이십니까? 그렇다면 예제는 매분 cron ~ execute 일괄 처리 php 스크립트를 사용하는 것입니다. 당신의 예의 crontab 파일 : 파일의 큐 업로드 시간을 기록하는 DB 테이블에 저장 될 수
* * * * * php /path/batch_processor.php
, 처리 시작과 마무리 등과 PHP 스크립트는 첫 번째 처리되지 않은 파일을 가져 와서 일을하러 갔다 .
또는 스케줄러를 사용하는 대신 exec을 사용하여 CSV 파일을 업로드하는 즉시 백그라운드 프로세스를 시작할 수 있습니다. PHP 설명서는 말한다 : 프로그램이 에 대한 위해,이 기능을 시작
경우 백그라운드에서 프로그램의 출력이 파일이나 다른 출력 스트림에 를 리디렉션해야 계속 실행됩니다. 그렇게하지 않으면 은 프로그램 실행이 끝날 때까지 PHP가 멈추도록합니다.
그래서 업로드 처리기에서 사용할 수 있습니다.
exec("nohup php /path/batch_processor.php 1 > batch_output.txt 2 > batch_error.txt &");
1 >
및 2 >
스크립트 출력 및 오류 리디렉션; &
은 백그라운드에서 실행됨을 나타냅니다. nohup
은 프로세스 소유자 세션이 종료되는 경우와 같이 중단 신호를 무시합니다.
Windows를 검색하다 보면 백그라운드 프로세스를 실행하는 데 많은 정보가 있습니다.
일괄 처리 스크립트가 완료되면 db 테이블이나 다른 공유 리소스에서 완료된 것으로 csv 파일에 플래그를 지정할 수 있습니다. 그러면 csv 일괄 처리의 상태를 확인하기 위해 ajax 호출을 처리 할 때 간단히 조회하고 완료되었는지 확인할 수 있습니다 플래그를 지정하고 완료되면 배치 출력을 클라이언트에 리턴하십시오.
일괄 처리가 완료되었는지 여부에 관계없이 기능을 향상시키고 각 아약스 호출에 대해 증분 상태 업데이트를 제공하려는 경우 일괄 처리는 처리 된 각 항목에 대해 공유 리소스 (db 또는 파일 등)에 쓰고 Ajax 핸들러는 이것을 읽고 클라이언트에게 리턴한다.
이 프로세스의 또 다른 개선점은 사용자에게 더 많은 증분을 제공하는 것입니다. 각 AJAX 상태 호출에서 지금까지 수행 된 작업 요약을 반환하십시오. 그렇게하면 사용자가 뭔가 잘못되었는지 궁금해지기 만하는 것이 아니라 파일 항목이 아직 처리 중임을 알 수 있습니다. –
멋지다, 대기열 및 스케줄러의 작동 방식에 대해 자세히 설명해 줄 수 있습니까? –
감사합니다. 아약스 부분은 어떨까요? 스크립트가 일정대로 실행되면 어떻게 상태를 얻을 수 있습니까? –