2016-05-10 76 views
5

Jestem jedynym administratorem bazy danych. Chcę uruchomić skrypt jeden raz, że w zasadzie zajmuje około 3800 zeskanowanych obrazów (wzrośnie do 10 000 tys) i utworzyć kilka miniaturek dla każdego obrazu przy użyciu exec() w PHP funkcji do wykonania zewnętrznego ImageMagick program do tworzenia tych miniatury.Maksymalny błąd czasu wykonania w skrypcie PHP, czy jest to dobre rozwiązanie, aby go ominąć?

stworzyłem skrypt, uruchomił go i wszystko działa doskonale! Wszystko odbywa się na moim lokalnym serwerze programistycznym. Skrypt zajmuje około 11 minut, aby utworzyć tysiące miniatur. To jednorazowa operacja przeprowadzana co dwa lata, więc konsekwencje są minimalne.

tej pory tak dobrze. Oto, kiedy mam problemy.

Wszystko, co zrobiłem na moim lokalnym serwerze rozwoju zrobiłem na żywo serwera dla celów testowych. Mam wspólne konto hosta z hostgatorem. Uruchomienie mojego 11-minutowego skryptu na współdzielonym hoście powoduje błąd "Maksymalny czas wykonania 30 sekund przekroczony ...". Zrobiłem moje badania, próbowałem wielu rozwiązań znalezionych w tym poście (Increase max execution time for php) tylko po to, aby zdać sobie sprawę, że nic nie mogę zrobić, aby zmienić maksymalny czas wykonania skryptu na współdzielonym hoście.

utknąłem. Moje pytanie brzmi: jakie jest tutaj oczywiste rozwiązanie.

Myślałam o uruchomieniu skryptu za każde 200 obrazów, odśwież stronę automatycznie i uruchom skrypt ponownie przez następne 200 zdjęć i tak dalej, dopóki nie ma więcej zdjęć. W ten sposób jestem pewien, że maksymalny czas wykonania 30 sekund dozwolony dla mojego hosta współdzielonego jest respektowany. Wygląda to jak rozwiązanie tuż nad głową, ale nie jestem pewien, czy to NIE NIE, jeśli mam napotkać większe problemy, zbyt wiele negatywów ..

Czy to oczywiste rozwiązanie? Ktoś ma ten sam problem? Co sugerowaliście?

Dzięki

+2

Dlaczego trzeba tworzyć miniatury co dwa lata? Czy nie powinno się jednorazowo stworzyć oryginalnego obrazu, aby stworzyć miniaturę i pozostawić ją na zawsze (aż przestanie być przestarzała)? –

+2

Czy sprawdziłeś, czy w trybie CLI nie ma czasu wykonania? Zwykle dla skryptów CLI jest '0' (bez ograniczeń) dla max_execution_time - http://php.net/manual/en/info.configuration.php # ini.max-execution-time – codedge

+0

wiele współdzielonych hostów zatrzyma długo działający skrypt bez względu na to, co zrobisz - najpierw sprawdź, czy to –

Odpowiedz

7

Zakładając, że mają powód, aby odtworzyć miniatury w partii, zamiast robić to przy każdym przesłaniu obrazu, jak sugerowano, zrobiłbym dokładnie tak, jak było - używać skryptu, który odświeża się - z tym wyjątkiem, że nie ustawiłbym stałej liczby obrazów.

Raczej chciałbym mieć czas skryptu sam po każdym obrazie, i przestać kiedy to osiągnął, powiedzmy, 25 sekund:

$stop = time() + 25; 
while (time() < $stop) { 
    ...find image to process, process it. 
    if (finished()) { 
     die("OK"); 
    } 
} 
// Redirect to next batch of images 
die(Header('Location: ....')); 

Jednak zrobić skontaktować się z dostawcą usług internetowych, ponieważ skrypt może być albo postrzegane jako nadużycie usługi, albo może być mylone z atakiem. Zapytaj również, czy preferowana pora dnia na przeprowadzenie tego rodzaju konserwacji.

Innym, nędznym sposobem robienia tego samego jest uruchomienie skryptu dla bardzo małej liczby zdjęć (prawdopodobnie pojedynczego). za każdym razem, gdy ktoś uderzy w stronę główną,. To powoduje, że dodatkowe obciążenie skryptu naśladuje rzeczywiste obciążenie serwera, unikając kłopotliwych skoków lub tajemniczych niezerowych ładunków podstawowych. Musisz znaleźć sposób, aby nigdy nie wybierać tego samego obrazu z różnych instancji skryptu działającego równolegle (kiedy musiałem to zrobić, ustawiłem flagę w bazie danych).

+2

po prostu pamiętaj, aby _trackować ostatni przetworzony obraz pomyślnie i rozpocząć od niego kolejne wykonanie ... –

+0

Dlaczego po prostu nie robić po jednym na raz? W szczególności uprościłoby wszystko: – ArtisticPhoenix

+1

@ ArtisiticPhoenix, które doprowadzi do (w tym przypadku)> 3800 żądań serwera w dość krótkim czasie. Spowoduje to zwolnienie serwera, ponieważ nawiązanie połączenia dla każdego żądania zajmuje trochę czasu i procesora, a jeśli serwer nie będzie miał wystarczających zasobów fizycznych, w bardzo złym przypadku może spaść. – lolbas

Powiązane problemy