2013-01-26 2 views
1

사용자 프로필을 통해 사용자를 추가 할 때 호스팅 된 플랫폼에 새로운 사용자를 추가 할 수있는 웹 포털이있어서 사용자 정보를 mysql 테이블 (pdo)에 저장합니다. 실제로는 3 또는 4 개의 테이블이 삽입됩니다.CSV에서 PHP 대량 가져 오기 및 처리

또한 SOAP 요청이 외부 사이트로 전송되고 응답이 사용자 옵션에 따라 추가 SOAP 요청이 전송 될 수 있습니다.

또한 SMS를 보내려면 smpp 공급자에 연결해야합니다.

1 명의 사용자를 추가하는 것만으로도 상당한 시간이 걸릴 수 있습니다. 대량 가져 오기 CSV 옵션을 만들고, 파일을 업로드하고 각 행을 추가 할 새 사용자로 처리하려고합니다.

오류 및 시간 초과없이 100 명의 사용자를 가져 오는 것이 가장 좋은 방법은 무엇입니까?

여기 how to put each php foreach value into each jquery ajax

볼 때 나는, 사용자 당 아약스 요청에 대해 생각했다 그러나 또한 응답 한 사람이 "내가보기 엔 배열로 값을 전달하고 단 하나의 아약스 호출을하도록하는 것이 좋습니다 것입니다 그러나"말했다. 하지만 시간 초과가 발생하지 않을까요?

이상적으로는 한 번에 하나씩 추가하고 사용자별로 결과를 얻는 것이 가장 좋습니다.

답변

2

업로드가 성공하면 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 핸들러는 이것을 읽고 클라이언트에게 리턴한다.

+1

이 프로세스의 또 다른 개선점은 사용자에게 더 많은 증분을 제공하는 것입니다. 각 AJAX 상태 호출에서 지금까지 수행 된 작업 요약을 반환하십시오. 그렇게하면 사용자가 뭔가 잘못되었는지 궁금해지기 만하는 것이 아니라 파일 항목이 아직 처리 중임을 알 수 있습니다. –

+0

멋지다, 대기열 및 스케줄러의 작동 방식에 대해 자세히 설명해 줄 수 있습니까? –

+0

감사합니다. 아약스 부분은 어떨까요? 스크립트가 일정대로 실행되면 어떻게 상태를 얻을 수 있습니까? –

관련 문제