2011-03-13 7 views
0

내가 내가 먼저 아칸소했습니다 것을 설명하자 : 내 데이터베이스에 다른 XML 년대에서 데이터의 큰 액수를 가져와야합니다플러시 PHP는 어떤 종류의

하고 많은 마지막 때문에 진행률 표시 줄을 넣어했다 그리고 나는 이것을 다음과 같이했다. 전체 import를 작은 AJAX 요청으로 분할하고 한 번에 작은 데이터를 가져온다. (Ajax 요청이 완료되면 progress bar가 조금 증가한다). 이 모든 아이디어는 훌륭하지만 데이터가 점점 더 커지고 있으며 코드를 더 이상 최적화 할 수 없습니다 (최적화 된 방식대로 진행됨).

문제는 매번 AJAX 호출을 할 때마다 브라우저에서 URL을 처리하는 등 프레임 워크 (모델 초기화 및 물건)와 관련된 많은 시간을 잃게된다는 것입니다. 그래서 내가 PHP에서 플러시 함수를 사용할 수 있는지 궁금 해서요.

하지만 플러시 기능이 모든 브라우저에서 훌륭하게 작동하지 않는다는 것을 읽었습니다. (이는 서버 측 기능이므로 이상합니다). 만약 내가 플러시 함수를 사용한다면 나는 단지 <script>increase_progressbar</script>을 쓰거나 내가 원한다면 내가 할 수있다.

그래서 플러시 함수에 대한 의견이 있으십니까? 나는 작은 스크립트로 테스트 해왔지만 누군가가 큰 스크립트를 실제로 사용했는지 알고 싶습니다. 또한, 내가하고 싶은 일을하는 다른 제안을들을 수 있습니다.

+0

전체 가져 오기를 백그라운드에서 수행하지 않는 이유는 무엇입니까? –

+0

백그라운드에서 가져 오기를 수행한다는 것은 무엇을 의미합니까? 그것은 요구에 따라야한다. –

+0

은 새로운 파일 exec()에 요청을 보내고 사용자에게 작업을 알리고 작업이 끝나면 이메일을 받거나 db var을 검사하여 화면에서 완료되었을 때 알릴 수있다. 만약 당신이 좋아한다면, 매초마다 완료를 확인하는 아약스와 함께 "import in progress"페이지를 가질 수 있습니다. –

답변

1

직접 조언을하지는 않겠지 만, 내 프로젝트에서 어떻게했는지 알려 드리겠습니다. 필자의 경우 Excel 파일을 업로드 한 다음 구문 분석해야합니다. 3000 행을 초과하는 데이터 및 일부 데이터에 대해 각 행의 모든 ​​열을 확인해야했습니다. 업로드 직후에 파싱 할 때, 파서는 종종 어딘가에서 충돌하며 실제로 안전하지 않습니다.

그래서 내가 어떻게 했어? 업로드 프로세스는 다음 두 부분으로 나뉩니다.

  1. 실제 업로드 파일 (일반 업로드 필드 및 제출). 버튼을 클릭하면 CSS와 JS의 "magic"이 양식을 감추고 멋진 로딩 바가 화면에 나타납니다. 업로드가 완료되면 페이지가 새로 고침되고 다음 파일에 대해 양식이 다시 표시됩니다.

  2. @Dragon이 exec()로 제안하는 것처럼 php-cli를 사용하여 백그라운드에서 데이터 구문 분석을 시작합니다.

데이터베이스에는 파일에 대한 정보를 저장하는 테이블이 있으며 "구문 분석"이라는 부울 필드가 있습니다. 구문 분석기가 작업을 완료하면 마지막 작업은 해당 필드를 true로 업데이트하는 것입니다.

  1. 파일을 선택하여 업로드 :

    그래서 여기보기의 사용자 관점에서 전체 프로세스입니다.

  2. 파일이 서버에 업로드 될 때까지 대기합니다. 그때까지 메시지와 로딩 바가 나타나서 어떤 것이 작동하고 있음을 나타냅니다. 업로드 양식은 CSS 및 JS로 숨겨져 있으므로 사용자가 다른 파일을 업로드 할 수 없습니다.
  3. 정상적인 _POST 제출을했기 때문에 페이지가 새로 고쳐지면 양식이 화면에 다시 표시되고 최근에 업로드 된 파일 목록 (이 내용은 세션에 저장 됨)이 다시 표시됩니다.
  4. 해당 목록의 각 노드에는 표시기 (아이콘)가 있습니다. 처음에는 스피너 (ajax 회전 휠)입니다.
  5. 정기적으로 (30 초 또는 1 분) Ajax 호출을 통해 파일 테이블을 검사하고 구문 분석 된 필드를 읽습니다.백그라운드 프로세스가 끝난 경우 필드는 true로 설정되고 일부 JS 및 CSS에서는 아이콘이 "완료"로 변경됩니다. 그렇지 않으면 회 전자가 남아 있습니다.

내 프로젝트에서 가져 오기에 대한 추가 세부 정보를 표시 할 필요는 없지만 다른 추가 데이터로 언제든지 갈 수 있습니다.

희망이 있으면 프로젝트에 도움이됩니다.

+0

아이디어에 감사드립니다.하지만 그것은 이상합니다. 약 3 시간 동안 지속되는 약 150 만개의 레코드가 있습니다 ... –

+0

나는 그것이 훌륭하다고 말하는 것이 아니지만 방법으로 백그라운드에서 처리를 실행할 수 있으며 사용자가 완전히 가져올 때까지 기다릴 필요가 없습니다. 업로드가 완료되면 언제든지 돌아와 상태를 확인할 수 있습니다. 내 범위는 정말 mych smoller이지만, 나는 논리가 동일하다고 생각 –

관련 문제