Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]wykonanie długiego skryptu
Forum PHP.pl > Forum > Przedszkole
Cromwell
Mam skrypt, którego zadaniem jest pobieranie danych z pliku, następnie odpowiednie ich przerabianie.
Niestety, plik ma ponad 50mb samych informacji tekstowych, przez co skrypt się po prostu wywala.
W pliku php.ini zmieniłem maksymalny czas wykonywania skryptu, jednak to nie zupełnie to, o co mi chodziło.

Chciałbym wykorzystać rozwiązanie, które pozwoliłoby podzielić wykonanie całości na części. Coś takiego, co pozwoliłoby na wykonanie części skryptu, następnie automatyczne przeładowanie całości i zaczęcie od miejsca, gdzie skrypt ostatnio skończył.
Plus możliwość samodzielnego wznowienia skryptu w danym momencie.

Nie wiem jak to ugryźć, a także nie wiem w jaki sposób wyszukać tutaj na forum, czy w google.
Pomoże ktoś?
wookieb
1) Jak pobieraz dane z tego pliku? File_get_contents?
Jeżeli tak to zamień na fopen i fread. Czytaj fragmentami i na tych fragmentach operuj
2) Zrób wykrywanie kończącego się czasu czyli. Pobierasz początkowy czas wykonywania skryptu i przy przeanalizowaniu kolejnych fragmentów pliku sprawdź czy aktualna roznica czasu (aktualny_czas - czas_poczatkowy) jest mniejszy od limitu czasy wykonywania. Jeżeli tak zapisujesz stan operacji i konczysz działanie.
Cromwell
Dane z pliku pobieram poprzez fopen i fread.
Jednak po wykonaniu całości, dane powinny być zapisane w innym pliku, gdzie używam file_put_contents. Zamienić to też?

Czyli rozumiem, że gdy skrypt rusza, to mam pobrać czas, następnie po wykonaniu raz pętli sprawdzić, jak wygląda różnica czasu i tak w kółko, aż uzyskam czas zbliżony do limitu, wtedy zapisuje wynik działania, a następnie przeładowuję skrypt i idę dalej?

A czy można by prosić o odnośnik do takiego kodu? Nie musi być oczywiście dokładnie taki, po prostu chciałbym zobaczyć, jak to wygląda na przykładzie.
wookieb
Cytat
Jednak po wykonaniu całości, dane powinny być zapisane w innym pliku, gdzie używam file_put_contents. Zamienić to też?

Przyznam, że nie wiem. Wydaje mi się że nie ma różnicy ale możesz sprawdzić testowo smile.gif

  1.  
  2. // z php.net/microtime
  3. function getmicrotime()
  4. {
  5. list($usec, $sec) = explode(" ", microtime());
  6. return ((float)$usec + (float)$sec);
  7. }
  8. $start = getmicrotime();
  9.  
  10. for(...)
  11. {
  12.  
  13. $roznica = getmicrotime() - $start;
  14.  
  15. if($roznica >= ($limitCzasu - 1)) // 1 sekunda zabezpieczenia
  16. {
  17. // koniec skryptu. oznaczamy aktualny stan pracy
  18. }
  19.  
  20. }
  21.  

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.