Cromwell
11.12.2009, 13:25:00
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
11.12.2009, 13:34:01
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
11.12.2009, 14:11:10
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
11.12.2009, 16:02:14
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

// z php.net/microtime
function getmicrotime()
{
return ((float)$usec + (float)$sec);
}
$start = getmicrotime();
for(...)
{
$roznica = getmicrotime() - $start;
if($roznica >= ($limitCzasu - 1)) // 1 sekunda zabezpieczenia
{
// koniec skryptu. oznaczamy aktualny stan pracy
}
}
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.