Comment augmenter le délai d'exécution en PHP?

102

Comment augmenter le délai d'expiration des transactions? Je souhaite télécharger des vidéos, mais des vidéos de grande taille ne sont pas téléchargées?

Il jette une erreur The process *** exceeded the timeout of 60 seconds.

Aamir
la source
1
Définissez le «délai d'expiration de la transaction». Qu'est-ce qui ne marche pas où?
Pekka
1
pourquoi pensez-vous que son délai de «transaction»?
Votre bon sens
courtes vidéos téléchargées avec succès. mais longue vidéo non téléchargée, je pense que le temps est écoulé.
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 ('limite_mémoire', '200M'); set_time_limit (65536);
Aamir
1
il est préférable de diviser le fichier avant de le télécharger. De nombreuses applications peuvent être utilisées. Je préfère plupload.
bksi

Réponses:

128

Vous devez modifier certains paramètres de votre 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

L'emplacement de votre PHP.ini dépend de votre environnement, plus d'informations: http://php.net/manual/en/ini.list.php

Hannes
la source
désolé, je n'ai aucune idée de ce que vous entendez par là :(
Hannes
@Aamir, vous devez avoir l'autorisation de votre hébergeur pour modifier la configuration de votre serveur Web. Souvent, ils ne vous laisseront pas changer des choses comme ça.
hellozimi
puis-je changer upload_max_filesize et max_execution_time dans le fichier htaccess?
Aamir
2
@Col, je ne suis pas d'accord, il veut faire les changements à la volée et non sur l'ensemble de l'application, alors il demande comment il peut le faire. Et même s'il demandait comment il pouvait simplement changer des choses dans le php.ini, cela pourrait être une question de débutant, mais une question légitime tout de même.
Hannes
1
@IulianOnofrei bien, j'ai juste ressenti le besoin de le signaler: D, mais peut-être que si vous ne savez pas ce que c'est, c'est toujours bon de le chercher ... "Ceux qui ne peuvent pas apprendre de l'histoire sont condamnés à la répéter" et tout ça …
Hannes
56

Vous devriez également pouvoir le faire pendant l'exécution en utilisant

set_time_limit(100);

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

ou dans votre vhost-config

php_admin_value max_execution_time 10000

Avoir une limite de temps d'exécution globale FAIBLE est surtout une bonne idée pour des raisons de performances sur des applications peu fiables. Vous voudrez peut-être autoriser uniquement ces scripts à s'exécuter plus longtemps que nécessaire.

ps: N'oubliez pas post_max_size et upload_max_filesize (comme la première réponse l'a déjà dit)

Christoph Strasen
la source
Si vous le définissez, le sommeil sera ignoré
Snake Eyes
20

Pour compléter la réponse de Hannes.

Vous devez modifier certains paramètres de votre php.ini:

upload_max_filesize = 2M 
;or whatever size you want

max_execution_time = 60
; also, higher if you must

Si quelqu'un veut mettre en illimité (je ne sais pas pourquoi mais si vous le souhaitez), vous pouvez régler l'heure sur 0:

Vous devez modifier certains paramètres de votre php.ini:

upload_max_filesize = 0 

max_execution_time = 0

Et si vous ne savez pas où est votre php.ini. Vous pouvez faire un fichier "name.php" dans votre serveur et mettre:

<?php phpinfo(); ?>

Et sur votre site Web, vous pouvez voir la configuration de votre php.ini et il est marqué où il se trouve.

Edit le 9 janvier 2015:

Si vous ne pouvez pas accéder à votre php.ini, vous avez deux autres options.

Vous pouvez définir cette ligne directement dans votre fichier "name.php" mais je ne trouve pas de upload_max_filesize pour cette option:

set_time_limit(0);

Ou dans ".htaccess"

php_value upload_max_filesize 0
php_value max_execution_time 0
Lynxi
la source
9

si ce que vous devez faire n'est spécifique que pour 1 ou 2 pages, je suggère d'utiliser set_time_limit pour ne pas affecter l'ensemble de l'application.

set_time_limit(some_values);

mais bien sûr, ces 2 valeurs (post_max_size & upload_max_filesize) sont sujettes à enquête.

vous pouvez soit le définir via la fonction ini_set

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

ou directement dans le fichier php.ini comme la réponse ci-dessus par Hannes, ou même définissez-le dans .htaccess comme ci-dessous

php_value upload_max_filesize 2M
php_value post_max_size 20M
Komang
la source
5

En plus des réponses ci-dessus, vous pouvez utiliser la set_time_limit()fonction:

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

passer 0comme argument rendra votre script exécuté sans limite de temps.

Tomasz Kowalczyk
la source
set_time_limit () n'a rien à voir avec les téléchargements de fichiers
Votre bon sens
1
Ce n'est pas assez précis Col. Shrapnel. Alors que sur les environnements Unix, le temps d'exécution maximal est comparé au temps CPU cumulé utilisé par le thread php, sur les systèmes Windows, le temps absolu est utilisé. Le téléchargement est principalement "inactif" (IO-Wait). Mais comme vous le voyez, les téléchargements peuvent s'arrêter quand cela prend trop de temps.
Christoph Strasen
4

Si vous utilisez le serveur Microsoft IIS , en plus du php.ini paramètres mentionnés par d'autres, vous devrez peut-être augmenter les paramètres de délai d'exécution pour l'application PHP FastCGI dans le gestionnaire de serveur IIS:

Étape 1) Ouvrez le Gestionnaire de serveur IIS (généralement sous Gestionnaire de serveur dans le menu Démarrer, puis Gestionnaire d' outils / Internet Information Services (IIS) ).

Étape 2) Cliquez sur la connexion principale (non spécifique à un domaine particulier).

Étape 3) Dans la section IIS , recherchez les paramètres FastCGI (illustrés ci-dessous).

entrez la description de l'image ici

Étape 4) Là, cliquez avec le bouton droit sur l'application PHP et sélectionnez Modifier ... .

Étape 5) Vérifiez les délais (indiqués ci-dessous).

entrez la description de l'image ici

Dans mon cas, les délais d'expiration par défaut étaient de 70 et 90 secondes; le premier provoquait une erreur de serveur interne de 500 sur les scripts PHP qui prenait plus de 70 secondes.

Michael
la source
3

Vous avez eu une faute de frappe: ini_set ('max_input_time', '200M') - l'ensemble de valeurs doit être un entier, comme ini_set ('max_input_time', '200')

thanatoïde
la source
2

Je sais que vous posez spécifiquement des questions sur le délai d'expiration de PHP, mais ce que personne d'autre ne semble avoir mentionné, c'est qu'il peut également y avoir un délai d'expiration sur le serveur Web et que cela peut ressembler beaucoup au délai d'expiration de PHP.

Donc, si vous avez essayé:

  1. Augmenter le timeout dans php.ini en ajoutant une ligne: max_execution_time = {nombre de secondes soit 60 pour une minute}
  2. Augmenter le timeout dans votre script lui-même en ajoutant: ini_set ('max_execution_time', '{number of seconds ie 60 for one minute}');

Et vous avez vérifié avec la fonction phpinfo () que max_execution_time a bien été augmenté, alors vous voudrez peut-être essayer d'ajouter ceci à .htaccess, ce qui garantira qu'Apache lui-même n'expire pas:

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

Plus d'informations ici: https://www.antropy.co.uk/blog/php-script-keeps-timing-out-despite-ini-set/

Paul Feakins
la source
2

Vérifiez d'abord le php.inichemin du fichier par phpinfo(); puis changé les PHP.INIparamètres:

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

redémarré Apache

set_time_limit(0); // safe_mode is off

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

Remarque : vous pouvez également utiliser la commande pour rechercher php.inisous Linux

locate `php.ini`
Ashfaq Muhammad
la source
1

Si vous ne pouvez pas éditer php.ini (sur votre serveur par exemple), vous pouvez essayer de changer les paramètres php.ini à partir de votre code php. Essayer:

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

Si cela ne fonctionne pas, essayez également de définir 'set_time_limit' de la même manière, au-delà de cela, je dirais que votre seule option est de contacter votre hôte. Ces paramètres ne peuvent pas être modifiés en mode sans échec.

John
la source
3
Hannes a eu ceci une minute avant que je ne publie, et souligne correctement que set_time_limit () ne doit pas être défini par ini_set, comme indiqué dans cette réponse, mais en mettant les secondes entre parenthèses. A voté à Hannes.
John
1

Testez si vous êtes en mode sans échec - sinon - définissez la limite de temps (valeur locale) sur ce que vous voulez:

if(!ini_get('safe_mode')){

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

    phpinfo();// see 'max_execution_time'
}

* Vous ne pouvez pas définir la limite de temps de cette façon si le mode sans échec est activé.

TV-C-15
la source
1

facultatif: si vous définissez la configuration sur php.ini mais que vous ne pouvez toujours pas télécharger

-c'est une fonction php pour vérifier le code d'erreur

$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
la source
0

Vous pouvez également définir une durée d'exécution maximale dans votre .htaccessfichier:

php_value max_execution_time 180
Perspicacité
la source
0

Pour vraiment augmenter la limite de temps, je préfère d'abord obtenir la valeur actuelle. set_time_limitn'augmente pas toujours le délai. Si la valeur actuelle (par exemple de php.iniou précédemment définie) est supérieure à la valeur utilisée dans l'appel en cours de set_time_limit, elle diminuera la limite de temps!

Alors, qu'est-ce qu'une petite aide comme celle-ci?

/**
 * @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);

Voir aussi: Obtenir max_execution_time dans un script PHP

algorithme
la source