Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przekroczony maksymalny czas wykonywania skryptu
Forum PHP.pl > Forum > PHP
lichu10
Przy wykonywaniu skryptu instalacji galerii (wykonuje ona miniaturki obrazków oraz zapisuje informacje do bazy danych) otrzymałem następujący komunikat o błędzie:

  1. <?php
  2. Fatal error: Maximum execution time of 10 seconds exceeded in /srv/www/htdocs/web1301/html/cms/gal_miniaturka.php on line 24
  3. ?>


Skrypt ten zdołał wykonać 38 miniaturek (a powinien w tym przypadku ok. 180)

Kod pliku ze względu na wydajność zawiera następujące elementy:
- zainclude'owany plik zawierający funkcję tworzącą miniaturki
- pętlę przeszukującą dany folder ze zdjęciami i wykonującymi w/w funkcję oraz dodającą dane o kazdym obrazku do bazy danych


Problem jest oczywisty. Chciałbym rozwiązać go poprzez modyfikację instalatora galerii aby działał w następujący sposób:
Każdorazowe utworzenie miniaturki przerzuciłbym na osobny plik - czy serwer da się nabrać na to że zamiast jednorazowego wykonania wszystkich miniaturek wykonam pod rząd wiele wywołań tego samego skryptu?

Jak to zrobić?questionmark.gifquestionmark.gifquestionmark.gif?
-=Peter=-
set_time_limit() -> ustaw np na 120 sekund, powinno wykonać wszystkie miniaturki.
lichu10
Niestety nie mogę tego zrobić. Skrypt wywala błąd:

Warning: set_time_limit() has been disabled for security reasons in /srv/www/htdocs/web1301/html/cms/gal_instaluj.php on line 3

Serwer zabezpieczony przed tym, próbowałem z wartością 0 i 120 -> to samo sad.gif
Kicok
Spróbuj też wrzucić do folderu w którym masz skrypt plik .htaccess o treści:
Kod
php_value max_execution_time 120



Jeśli to nic nie da, to przerób skrypt tak:
1. Zapisuje aktualny czas do zmiennej $start (microtime" title="Zobacz w manualu PHP" target="_manual)
2. Przeszukuje folder, ładuje wszystkie zdjęcia do tablicy $pliki i sortuje ją alfabetycznie
3. Sprawdza czy istnieje zmienna $_GET['first'], jeśli tak, to przechodzi od razu do tego klucza tablicy (np. jeśli $_GET['first'] = 15 to pętlę zaczynasz od $i=15, nie $i=0)
4. Tworzysz pętlę for, która w każdym przejściu będzie robiła miniaturkę dla każdego zdjęcia, zapisuje dane do bazy i sprawdzała, czy minęło już 9 sekund (microtime() - $start)
5. Jeśli minęło już 9 sekund, to wysyłasz do przeglądarki nagłówek:
Kod
header( 'Location: http://strina.pl/plik.php?first=' . $i + 1 );

i kończysz wykonywanie skryptu.
lichu10
Pierwsze rozwiązanie dało połowiczny efekt. Tzn utworzyły się wszystkie miniaturki ale skrypt miał szansę działać jakieś 30 sekund jak na moje oko. Prawdopodobnie serwer ustawiony jest tak że nie da się ustawić tego na więcej niż 30 sekund. Co prawda wszystkie miniaturki się utworzyły ale wyskoczył błąd nr 500 - zbyt długi czas wykonywania skryptu. Będę musiał pokombinować z tym drugim sposobem dla pewności. Ale czy to na pewno da efekt? Czekanie 9 sekund to chyba wciąż jest zaliczane do wykonywania się skryptu. Poza tym czy serwer nie zinterpretuje przejścia do tego samego skryptu jako dalszego wykonywania go? I jeszcze jedno, dlaczego akurat 9 sekund?
Moje pytania wynikają z logiki nie znam się akurat na tej kwestii PHP więc mam nadzieję że Ty wiesz lepiej i sposób ten zadziała.
pentel
  1. <?php
  2. Fatal error: Maximum execution time of 10 seconds exceeded
  3. ?>

Właśnie dlatego 9 sekund.
Przeczytaj jeszcze kilka razy co napisał kicok, to jest bardzo pomysłowe smile.gif
Skoro skrypt może wykonywac się maksywmalnie 10 sekund, to chodzi o to, żeby pętla wykonywała się krócej, np. 9 sekund (wykonując pewną ilość miniaturek), po czym przerywała swoja pracę. Header location przeładowywałby stronę, i pętla zaczynałaby pracę od tego miejsca, gdzie skończyła ostatnim razem, czyli jeśli pętla zdążyła zrobić np. 15 miniaturek w ciągu tych 9 sekund, to po przeładowaniu zaczynałaby od 16. miniaturki. W ciągu kolejnych 9 sekund zrobiłaby podobną liczbę miniaturek, i znowu nastepowałoby przeładowanie strony i skrypt zacząłby by od miejsca, w którym ostanio skończył... i tak aż do usranej śmierci albo do momentu, w którym pętla wykonałaby miniaturki wszystkich zdjęć z tablicy. smile.gif
A informacja, na którym zdjęciu pętla skończyła po 9. sekundzie, przenosi się poprzez $_GET.

Pozdrawiam

PS. Aha, na wypadek gdybyś nie wiedział to 'kończysz wykonywanie skryptu' znaczy, że po header location dajesz
  1. <?php
  2. ?>
lichu10
Szczerze mówiąc nie wczytałem się dokładnie smile.gif Mój mózg sobie ubzdurał że to co wymyślił kicok to to co ja sam wymyśliłem czyli robienie po 1 miniaturce a tu faktycznie dobry pomysł. Robienie ile się da w danym czasie. Będę to próbował zrealizować, jak będę miał jakieś problemy to będę pisał. Dzięki

PS. Strona gdzie można to obejrzeć to:

lichu10.xsite.pl/cms

Męczę się z tym kodem i trafiłem na problem.
Nie mogę zmodyfikować nagłówka bo wcześniej wysłałem już tekst do przeglądarki (poczytałem trochęo header). Można jakoś inaczej przerwać skrypt i rozpocząć na nowo w miejscu gdzie ostatnio skończyłem?
Wydaje mi się że mam już gotowy skrypt - brakuje tylko tego jednego elementu.
Próbowałem otworzyć mój formularz (który uruchamia skrypt z odpowiednimi parametrami) sam (bo używam includowania strony do całości layoutu) w nowym oknie ale z kolei wyskakuje mi błąd że strona nie istnieje. Adres na 100% dobry ale serwer tego nie przyjmuje. Zrealizowałem to za pomocą parametrów formularza:

<form class=\"wlinii\" method=\"POST\" action=\"http://".$HTTP_SERVER_VARS['HTTP_HOST'].dirname($HTTP_SERVER_VARS['PHP_SELF']).gal_instaluj.php&galeria=$file\" target=\"_blank\">

Uruchamia się adres:
http://127.0.0.1/~cms/gal_instaluj.php&...=folder_galerii

Który jest jak najbardziej poprawny ale czemu mi to nie działa to już pojęcia nie mam sad.gif
Kicok
Nie jest poprawny. Adres ma wyglądać tak:
http://strona.pl/plik.php?zmienna1=wartość...ienna3=wartość3

u ciebie wygląda tak:
http://strona.pl/plik.php&zmienna1=war...ienna3=wartość3
pentel
Przyznam, że nigdy nie miałem problemu z wysłanymi nagłówkami podczas używania header location.
No ale zawsze możesz użyć buforowania. Ale tez, jak zauważył kicok, linki miałeś niepoprawne.

Pozdrawiam

P.S. Chyba jednak miałem. dlatego zresztą używam buforowania^^
lichu10
Szczerze mówiąc nie mam pojęcia o co chodzi z tym buforowaniem. Jeśli chodzi o algorytm to dokładnie rozumiem co mi zaproponowaliście jednak nie jestem na tyle zaawansowany w programowaniu w php żeby to zrealizować na poziomie na jakim bym chciał. Prawdopodobnie jestem w stanie to zrobić żeby działało ale nie do końca bym nad tym panował.

Co do moich linków to bez komentarza. Skupiamy się na trudnych problemach a nie zauważamy podstaw.

Mój pomysł na wykonanie tego jest następujący: wywoływać skrypt tworzący miniaturkę z osobna dla każdego obrazka. Nie wiem tylko jakiego mechanizmu tu użyć. Czy jest coś takiego w PHP co by uruchomiło skrypt z odpowiednimi parametrami, następnie zakończyło go (prawdopodobnie będzie to funkcja exit; ) i później uruchomiło go dla następnego obrazka itd...
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.