Jak zwiększyć limit czasu wykonywania w PHP?

103

Jak zwiększyć limit czasu transakcji? Chcę przesłać filmy, ale nie przesłano dużych plików?

Wyrzuca błąd The process *** exceeded the timeout of 60 seconds.

Aamir
źródło
1
Zdefiniuj „limit czasu transakcji”. Co nie działa gdzie?
Pekka,
1
jak myślisz, dlaczego upłynął limit czasu „transakcji”?
Twój
krótkie filmy zostały pomyślnie przesłane. ale długi film nie został przesłany, myślę, że upłynął czas.
Aamir
ini_set ('post_max_size', '200M'); ini_set ('upload_max_filesize', '200M'); ini_set ('max_execution_time', '200M'); ini_set ('max_input_time', '200M'); ini_set ('memory_limit', '200M'); set_time_limit (65536);
Aamir
1
lepiej jest podzielić plik przed przesłaniem. Istnieje wiele aplikacji, z których można korzystać. Preferuję przesyłanie.
bksi

Odpowiedzi:

129

Musisz zmienić niektóre ustawienia w swoim php.ini:

upload_max_filesize = 2M 
;or whatever size you want

max_execution_time = 60
; also, higher if you must - sets the maximum time in seconds

Gdzie zlokalizowane jest twoje PHP.ini, zależy od twojego środowiska, więcej informacji: http://php.net/manual/en/ini.list.php

Hannes
źródło
przepraszam, nie mam pojęcia, co przez to rozumiesz :(
Hannes,
@Aamir, musisz mieć pozwolenie od swojego hosta, aby zmienić konfigurację swojego serwera WWW. Często nie pozwalają ci zmieniać takich rzeczy.
hellozimi
czy mogę zmienić upload_max_filesize i max_execution_time w pliku htaccess?
Aamir
2
@Col, nie zgadzam się, chce wprowadzać zmiany w locie, a nie w całej aplikacji, więc pyta, jak to zrobić. I nawet jeśli miałby zapytać, jak może po prostu zmienić niektóre rzeczy w php.ini, może to być pytanie dla początkujących, ale mimo wszystko uzasadnione pytanie.
Hannes
1
@IulianOnofrei w porządku, po prostu czułem potrzebę zwrócenia na to uwagi: D, ale może jeśli nie wiesz, co to jest, dobrze jest to sprawdzić… „Ci, którzy nie mogą się nauczyć z historii, skazani są na powtórzenie” i tak dalej …
Hannes,
57

Powinieneś być w stanie to zrobić również w czasie wykonywania za pomocą

set_time_limit(100);

http://php.net/manual/en/function.set-time-limit.php

lub w twoim vhost-config

php_admin_value max_execution_time 10000

Mając globalny limit czasu wykonywania, który jest NISKI, jest głównie dobrym pomysłem ze względu na wydajność niezbyt niezawodnych aplikacji. Więc możesz chcieć, aby te skrypty działały dłużej, niż jest to absolutnie konieczne.

ps: Nie zapomnij o post_max_size i upload_max_filesize (tak jak już powiedziano w pierwszej odpowiedzi)

Christoph Strasen
źródło
Jeśli to ustawisz, sen zostanie zignorowany
Snake Eyes
21

Aby uzupełnić odpowiedź Hannesa.

Musisz zmienić niektóre ustawienia w swoim php.ini:

upload_max_filesize = 2M 
;or whatever size you want

max_execution_time = 60
; also, higher if you must

Jeśli ktoś chce ustawić bez ograniczeń (nie wiem dlaczego, ale jeśli chcesz), możesz ustawić czas na 0:

Musisz zmienić niektóre ustawienia w swoim php.ini:

upload_max_filesize = 0 

max_execution_time = 0

A jeśli nie wiesz, gdzie jest twój plik php.ini. Możesz zrobić plik "name.php" na swoim serwerze i wstawić:

<?php phpinfo(); ?>

Na swojej stronie możesz zobaczyć konfigurację twojego php.ini i jest zaznaczone, gdzie to jest.

Edycja 9 stycznia 2015 r .:

Jeśli nie możesz uzyskać dostępu do swojego php.ini, masz jeszcze dwie opcje.

Możesz ustawić tę linię bezpośrednio w swoim pliku "name.php", ale nie mogę znaleźć parametru upload_max_filesize dla tej opcji:

set_time_limit(0);

Lub w „.htaccess”

php_value upload_max_filesize 0
php_value max_execution_time 0
Lynxi
źródło
9

jeśli to, co musisz zrobić, dotyczy tylko 1 lub 2 stron, sugeruję użycie set_time_limit, aby nie wpłynęło to na całą aplikację.

set_time_limit(some_values);

ale oczywiście te 2 wartości (post_max_size i upload_max_filesize) podlegają zbadaniu.

możesz to ustawić za pomocą funkcji ini_set

ini_set('post_max_size','20M');
ini_set('upload_max_filesize','2M');

lub bezpośrednio w pliku php.ini, jak powyższa odpowiedź od Hannesa, lub nawet ustaw ją w .htaccess jak poniżej

php_value upload_max_filesize 2M
php_value post_max_size 20M
Komang
źródło
5

Jako uzupełnienie powyższych odpowiedzi możesz skorzystać z set_time_limit()funkcji:

http://php.net/manual/en/function.set-time-limit.php

przekazanie 0jako argument spowoduje, że skrypt będzie działał bez ograniczeń czasowych.

Tomasz Kowalczyk
źródło
set_time_limit () nie ma nic wspólnego z przesyłaniem plików
Your Common Sense
1
To nie jest wystarczająco dokładne, pułkowniku Shrapnel. Podczas gdy w środowiskach uniksowych maksymalny czas wykonania jest porównywany ze skumulowanym czasem procesora używanym przez wątek php, w systemach Windows używany jest czas bezwzględny. Przesyłanie odbywa się głównie w trybie „bezczynności” (IO-Wait). Ale jak widać, przesyłanie może się zatrzymać, gdy trwa to zbyt długo.
Christoph Strasen
4

Jeśli korzystasz z serwera Microsoft IIS , oprócz ustawień php.ini wspomnianych przez innych, może być konieczne zwiększenie limitu czasu wykonywania aplikacji PHP FastCGI w Menedżerze serwera IIS:

Krok 1) Otwórz Menedżera serwera IIS (zwykle w Menedżerze serwera w menu Start, a następnie w Narzędziach / Menedżer internetowych usług informacyjnych (IIS) ).

Krok 2) Kliknij główne połączenie (nie specyficzne dla żadnej konkretnej domeny).

Krok 3) W sekcji IIS znajdź FastCGI Settings (pokazane poniżej).

wprowadź opis obrazu tutaj

Krok 4) W nim prawym przyciskiem myszy aplikację PHP i wybierz Edycja ... .

Krok 5) Sprawdź limity czasu (pokazane poniżej).

wprowadź opis obrazu tutaj

W moim przypadku domyślne limity czasu wynosiły 70 i 90 sekund; z których pierwsza powodowała wewnętrzny błąd serwera 500 w skryptach PHP, który trwał dłużej niż 70 sekund.

Michael
źródło
3

Miałeś literówkę: ini_set ('max_input_time', '200M') - ustawiona wartość musi być int, jak ini_set ('max_input_time', '200')

tanatoid
źródło
2

Wiem, że pytasz konkretnie o limit czasu PHP, ale wydaje się, że nikt inny nie wspominał o tym, że na serwerze sieciowym może również występować limit czasu i może wyglądać bardzo podobnie do limitu czasu PHP.

Więc jeśli próbowałeś:

  1. Zwiększenie limitu czasu w php.ini przez dodanie linii: max_execution_time = {liczba sekund czyli 60 na minutę}
  2. Zwiększenie limitu czasu w skrypcie poprzez dodanie: ini_set ('max_execution_time', '{liczba sekund, czyli 60 na minutę}');

Sprawdziłeś za pomocą funkcji phpinfo (), że max_execution_time rzeczywiście został zwiększony, możesz spróbować dodać to do .htaccess, co zapewni, że sam Apache nie przekroczy limitu czasu:

RewriteRule .* - [E=noabort:1]
RewriteRule .* - [E=noconntimeout:1]

Więcej informacji tutaj: https://www.antropy.co.uk/blog/php-script-keeps-timing-out-despite-ini-set/

Paul Feakins
źródło
2

Najpierw sprawdź php.iniścieżkę pliku przez phpinfo(); a następnie zmieniono parametry PHP.INI:

upload_max_filesize = 1000M
memory_limit = 1500M
post_max_size = 1500M
max_execution_time = 30

zrestartował Apache

set_time_limit(0); // safe_mode is off

ini_set('max_execution_time', 500); //500 seconds

Uwaga : możesz również użyć polecenia, aby znaleźć php.iniw systemie Linux

locate `php.ini`
Ashfaq Muhammad
źródło
1

Jeśli nie możesz edytować php.ini (na przykład na swoim serwerze), możesz spróbować zmienić parametry php.ini z poziomu kodu php. Próbować:

ini_set('max_execution_time', 'NUMBER OF SECONDS TO ALLOW BEFORE TIMEOUT');

Jeśli to nie zadziała, spróbuj również ustawić 'set_time_limit' w ten sam sposób, poza tym powiedziałbym, że jedyną opcją jest skontaktowanie się z gospodarzem. Tych ustawień nie można modyfikować w trybie awaryjnym.

Jan
źródło
3
Hannes dostał to minutę przed wysłaniem i poprawnie wskazuje, że set_time_limit () nie powinno być ustawiane przez ini_set, jak podano w tej odpowiedzi, ale przez umieszczenie sekund w nawiasach. Zagłosowano na hannes w górę.
John,
1

Sprawdź, czy jesteś w trybie bezpiecznym - jeśli nie - ustaw limit czasu (wartość lokalna) na to, co chcesz:

if(!ini_get('safe_mode')){

    echo "safe mode off";
    set_time_limit(180);// seconds

    phpinfo();// see 'max_execution_time'
}

* Nie możesz ustawić limitu czasu w ten sposób, jeśli tryb bezpieczny jest włączony.

TV-C-15
źródło
1

opcjonalnie: jeśli ustawisz konfigurację o php.ini, ale nadal nie możesz przesłać

-to jest funkcja php do sprawdzania kodu błędu

$error_type = [];
$error_type[0] = "There is no error";
$error_type[1] = "The uploaded file exceeds the upload_max_filesize directive in php.ini.";
$error_type[2] = "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.";
$error_type[3] = "The uploaded file was only partially uploaded.";
$error_type[4] = "No file was uploaded.";
//$error_type["5"] = "";
$error_type[6] = "Missing a temporary folder. Introduced in PHP 5.0.3.";
$error_type[7] = "Failed to write file to disk. Introduced in PHP 5.1.0.";
$error_type[8] = "A PHP extension stopped the file upload. PHP does not provide a way to ascertain which extension caused the file upload to stop; examining the list of loaded extensions with phpinfo() may help. Introduced in PHP 5.2.0.";
//------------------------------
//--> show msg error.
$status_code = $_FILES["uploadfile"]["error"];
if($status_code != 0){
    echo $error_type[$status_code];
    exit;
}
Ruthe
źródło
0

Możesz także ustawić maksymalny czas wykonywania w swoim .htaccesspliku:

php_value max_execution_time 180
Wgląd
źródło
0

Aby naprawdę zwiększyć limit czasu, wolę najpierw uzyskać aktualną wartość. set_time_limitnie zawsze wydłuża termin. Jeśli aktualna wartość (np. Z php.inilub poprzednio ustawiona) jest wyższa niż wartość użyta w bieżącym wywołaniu set_time_limit, spowoduje to zmniejszenie limitu czasu!

Więc o co chodzi z takim małym pomocnikiem?

/**
 * @param int $seconds Time in seconds
 * @return bool
 */
function increase_time_limit(int $seconds): bool
{
    return set_time_limit(max(
        ini_get('max_execution_time'), $seconds
    ));
}

// somewhere else in your code
increase_time_limit(180);

Zobacz też: Uzyskaj max_execution_time w skrypcie PHP

algorhythm
źródło