2010-04-23 14 views
5

Mam ogromny import do mojej bazy danych (około 200 tys. Rekordów) i mam poważny problem z limitem czasu importowania skryptów. Użyłem mojego telefonu komórkowego jako stopera i stwierdziłem, że czas oczekiwania wynosi dokładnie 45 sekund na każde podanie (wewnętrzny błąd serwera) ... to tylko około 200 rekordów na raz, czasami mniej. Zeskanowałem moje phpinfo() i nic nie zostało ustawione na 45 sekund; więc nie mam pojęcia, dlaczego to robił.Skrypt PHP Wygaśnięcie po 45 sekundach

Mój max_execution_time jest ustawiony na 5 minut, a mój max_input_time jest ustawiony na 60 sekund. Próbowałem również ustawić set_time_limit (0); ignore_user_abort (1); na górze mojej strony, ale to nie zadziałało.

Warto również zauważyć, że mój plik błędów brzmi: "Przedwczesne zakończenie nagłówków skryptu" jako błąd wykonania.

Każda pomoc jest bardzo doceniana.

+0

Jakieś komunikaty o błędach? czy masz włączoną funkcję error_reporting (-1), prawda? – Gordon

+0

Po dodaniu tego dodano jako edycję :) Jeden komunikat o błędzie: "Przedwczesne zakończenie nagłówków skryptu" –

+0

Możliwy duplikat [Przedwczesne zakończenie nagłówków skryptu: index.php, mod \ _fcgid: odczytanie limitu czasu danych w 61 sekund] (http://stackoverflow.com/questions/14488567/premature-end-of-script-headers-index-php-mod-fcgid-read-data-timeout-in-61-s) – kenorb

Odpowiedz

0

Jest całkiem możliwe, że uderzasz w wymuszony limit zasobów na swoim serwerze, szczególnie jeśli serwer nie jest w pełni pod twoją kontrolą.

Zakładając, że jest to jakiś typ serwera linuksowego, możesz zobaczyć limity zasobów za pomocą ulimit -a w wierszu poleceń. ulimit -t pokazuje również tylko ograniczenia czasu procesora.

Jeśli procesor jest ograniczony, być może trzeba przetworzyć import w partiach.

+0

Nie sądzę, że to limit zasobów ... skrypt kończy się dokładnie w 45 sekund ... gdyby to było typem pamięci, czy ten czas nie byłby bardzo niespójny? –

+0

Można ustawić limity na inne rzeczy niż pamięć, a hosty serwerów często ograniczają czas procesora, aby zapobiec niekontrolowanym procesom. W takim przypadku limit czasu byłby zbliżony do limitu. Spróbuj 'ulimit -t' i zobacz, co otrzymasz. – zombat

+0

@Dave: Istnieje również Apache's RLimitCPU: http://httpd.apache.org/docs/2.2/mod/core.html#rlimitcpu –

0

Po pierwsze, powinieneś uruchamiać skrypt z poziomu wiersza poleceń, jeśli to zajmie trochę czasu. Przynajmniej Twoja przeglądarka wygaśnie po 2 minutach, jeśli nie otrzyma treści.

php -f filename.php 

Ale jeśli trzeba uruchomić go z poziomu przeglądarki, spróbuj dodać nagłówek ("Content-Type: text/html") przed kopnięciami importowych.

Jeśli korzystasz z hosta udostępnionego, możliwe są ograniczenia w systemie, gdy długo działające zapytania i/lub skrypty są automatycznie zabijane po pewnym czasie. Te ograniczenia są generalnie poluzowane w przypadku skryptów uruchomionych poza siecią. W związku z tym pomocne byłoby uruchomienie go z wiersza poleceń.

0

W 45 sekund mógłby być zbieg okoliczności - może to być, jak długo to trwa, aby osiągnąć limit pamięci .. zwiększenie limitu pamięci byłoby jak:

ini_set('memory_limit', '256M'); 

Może to być również faktyczne połączenie z bazą danych, limit czasu oczekiwania. Jakiego serwera używasz? Dla mnie, mssql przekroczył bardzo niepomocny błąd, "Zmieniono kontekst bazy danych", domyślnie po 60 sekundach. Aby obejść ten problem, należy zrobić:

ini_set('mssql.timeout', 60 * 10); // 10 min 
15

Próbowałem wszystkich rozwiązań na tej stronie i, oczywiście, działa z wiersza poleceń:

php -f filename.php 

jak mówi Brent jest rozsądny sposób wokół niego .

Ale jeśli naprawdę chcesz uruchomić skrypt z przeglądarki, który utrzymuje limit czasu po 45 sekund z 500 błędu serwera wewnętrznego (jak znalazłem podczas odbudowy mojego indeksu wyszukiwania phpBB), wówczas istnieje duża szansa, że ​​to spowodowane mod_fcgid.

mam Pleska VPS i poprawiony zmodyfikować plik

/etc/httpd/conf.d/fcgid.conf 

szczególności zmienione

FcgidIOTimeout 45 

do

FcgidIOTimeout 3600 

3600 s = 1 godzina. Powinien być wystarczająco długi dla większości, ale w razie potrzeby dostosuj go do góry. Widziałem jeden przykład z tamtym numerem 7200 sekund.

Na koniec uruchom ponownie Apache, aby nowe ustawienie stało się aktywne.

apachectl graceful 

HTH ktoś. Przez pół roku mnie to dręczyło!

Cheers,

Bogate

+0

Potrzebowałem tego źle, dziękuję bardzo. – DaveE

+3

HTH = "Hope This Helps" – AVProgrammer

0

przede wszystkim

max_input_time i set_time_limit (0)

będzie działać tylko z VPS lub serwerów dedykowanych. Zamiast tego możesz zastosować pewne zasady do swojej implementacji, jak poniżej:

  1. Najpierw przeczytaj cały plik CSV.
  2. Następnie chwyć tylko 10 wpisów (wiersze) lub mniej i wykonaj wywołania ajax do zaimportowania w DB
  3. Spróbuj wywołać ajax za każdym razem z 10 wpisami, a następnie echo coś na przeglądarce. W tej metodzie twój skrypt nigdy nie przekroczy limitu czasu.
  4. Postępuj zgodnie z tą samą metodą, aż wiersze CSV zostaną zakończone.
Powiązane problemy