Maison > développement back-end > Problème PHP > Quelles sont les méthodes pour définir le timeout PHP ?

Quelles sont les méthodes pour définir le timeout PHP ?

醉折花枝作酒筹
Libérer: 2023-03-09 22:42:02
avant
5379 Les gens l'ont consulté

Cet article vous présentera comment définir le délai d'attente PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Quelles sont les méthodes pour définir le timeout PHP ?

1. Délai d'exécution du fichier PHP

(1) Temps d'exécution du script de réglage initial

Ouvrez le fichier php.ini et recherchez :

max_execution_time=30
Copier après la connexion

est modifié en :

max_execution_time=600
Copier après la connexion

Si vous ne disposez pas des autorisations de modification du serveur, vous pouvez définir le délai d'attente via la méthode de script PHP intégrée et ajouter le code suivant au fichier PHP qui doit effectuer des opérations à long terme :

<?php
ini_set(&#39;max_execution_time&#39;, 600);//秒为单位,自己根据需要定义
Copier après la connexion

Vous pouvez également définir le délai d'attente via le fichier .htaccess et ajouter le code suivant dans le fichier :

php_value max_execution_time 600
Copier après la connexion

(2) Réinitialiser le temps d'exécution du script et réinitialiser le timer

set_time_limit (int $seconds) : bool

seconds------Durée d'exécution maximale, en secondes. S'il est défini sur 0 (zéro), il n'y a pas de limite de temps.

Définissez l'heure à laquelle le script est autorisé à s'exécuter, en secondes. Si ce paramètre est dépassé, le script renvoie une erreur fatale. La valeur par défaut est 30 secondes, ou la valeur définie dans max_execution_time dans php.ini, si cette valeur existe.

Lorsque cette fonction est appelée, set_time_limit() redémarrera le compteur de délai d'attente à partir de zéro. En d'autres termes, si le délai d'expiration par défaut est de 30 secondes et que set_time_limit(20) est appelé lorsque le script est exécuté depuis 25 secondes, alors la durée totale pendant laquelle le script peut s'exécuter avant l'expiration est de 45 secondes.

2. Délai d'expiration de la requête PHP Curl

Curl est une bibliothèque lib couramment utilisée pour accéder à l'interface du protocole HTTP. Elle a des performances élevées et certaines fonctions de support simultanées.

curl_setopt($ch, opt) peut définir certains paramètres de délai d'attente, notamment :

a, CURLOPT_TIMEOUT définit le nombre maximum de secondes pendant lesquelles CURL est autorisé à s'exécuter.

b. CURLOPT_TIMEOUT_MS définit le nombre maximum de millisecondes pendant lequel CURL est autorisé à s'exécuter.

c.CURLOPT_CONNECTTIMEOUT Le temps d'attente avant d'initier une connexion S'il est défini sur 0, il attendra indéfiniment.

d. CURLOPT_CONNECTTIMEOUT_MS Le temps d'attente pour une tentative de connexion, en millisecondes. S'il est défini sur 0, attendez indéfiniment.

e. CURLOPT_DNS_CACHE_TIMEOUT définit l'heure de sauvegarde des informations DNS en mémoire, la valeur par défaut est de 120 secondes.

3. Délai d'expiration de la demande de socket PHP

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO,array("sec"=> 1, "usec"=> 0 ) ); // 接收
socket_set_option($socket,SOL_SOCKET,SO_SNDTIMEO,array("sec"=> 3, "usec"=> 0 ) );  // 发送
Copier après la connexion

Bien que PHP ait un paramètre de délai d'attente pour se connecter au socket pour la méthode fsockopen(), il n'y a pas de paramètre de délai d'attente pour lire et écrire des données après une réussite. connexion en C configurée. Peu importe, PHP fournit une série de méthodes pour les flux afin d'éviter les délais d'attente.

stream_set_blocking( $fp , false )
Copier après la connexion

Définissez le flux de données en mode bloquant pour empêcher sa sortie avant la lecture des données

Si le mode est faux, le descripteur de socket donné passera en mode non bloquant s'il est vrai. , Passez ensuite en mode bloc. Cet effet est similaire à la lecture de fgets() à partir du socket. En mode non-bloc, fgets() reviendra immédiatement, tandis qu'en mode bloc, il attendra que les données répondent aux exigences.

stream_set_timeout( $fp , 10 )
Copier après la connexion

Définissez le délai d'attente. Cette phrase doit être ajoutée immédiatement après l'établissement réussi de la connexion. L'unité de paramètre suivante est en secondes

Obtenez l'en-tête/les métadonnées du pointeur du fichier du protocole d'encapsulation et renvoyez un. Tableau dont le format est :

Array
(
  [stream_type] => tcp_socket
  [mode] => r+
  [unread_bytes] => 0
  [seekable] =>
  [timed_out] =>
  [blocked] => 1
  [eof] =>
)
Copier après la connexion

L'index timed_out est l'information de délai d'attente, s'il expire, c'est vrai, s'il n'a pas expiré, c'est faux Nous pouvons utiliser cela pour juger si. le socket a expiré. Il convient de noter que cette phrase doit être ajoutée après chaque instruction qui doit être attendue, comme fwrite(), fread(), et à chaque fois qu'elle est lue, il faut juger si elle est chronométrée. out, et pour une connexion, un seul paramètre de délai d'attente stream_set_timeout ( $fp , 10 ) suffit.

$fp = @fsockopen( $ip , $port, $errNo , $errstr, 30 );
if( !$fp )
{
  return false;
}
else
{
  stream_set_timeout( $fp , 3 ) ;
  //发送数据
  fwrite( $fp , $packet ) ;
  $status = stream_get_meta_data( $fp ) ;
  //发送数据超时
  if( $status[&#39;timed_out&#39;] )
  {
    echo "Write time out" ;
    fclose( $fp );
    return false;
  }
  //读取数据
  $buf = fread( $fp , 16 ) ;
  $status = stream_get_meta_data( $fp ) ;
  //读取数据超时
  if( $status[&#39;timed_out&#39;] )
  {
    echo "Read time out" ;
    fclose( $fp );
    return false;
  }
}
Copier après la connexion

4. Traitement du délai d'expiration de File_get_contents (socket d'encapsulation, file_put_contents est similaire)

À partir de PHP5, file_get_content prend déjà en charge le contexte (le manuel dit : 5.0.0 Ajout de la prise en charge du contexte.), Dans en d'autres termes, à partir de la version 5.0, file_get_contents peut réellement POST des données. Les fichiers similaires incluent fopen (la prise en charge du contexte a également été ajoutée depuis PHP5) et file (la prise en charge a été ajoutée dans PHP5).

<?php
$get_opts = array(   
  &#39;http&#39;=>array(   
    &#39;method&#39; => "GET",   
    &#39;timeout&#39; => 1,//单位秒, 默认使用php.ini中default_socket_timeout的设置
   )   
);
$post_opts = array(
&#39;http&#39;=>array(   
    &#39;method&#39; => "POST",   
    &#39;timeout&#39; => 60,//单位秒, 可用ini_set(&#39;default_socket_timeout&#39;, 120);进行默认设置
    &#39;content&#39; =>  http_build_query($param_array, &#39;&#39;, &#39;&&#39;)
   )   
);
 
$opts = $get_opts;
$res = file_get_contents($url, FALSE, stream_context_create($opts)); //返回string,失败返回FALSE
Copier après la connexion

5. Délai d'expiration de la demande PHP Soap

    ini_set(&#39;default_socket_timeout&#39;, 30); //定义响应超时为30秒
 
    try {
      $options = array(
        &#39;cache_wsdl&#39; => 0,
        &#39;connection_timeout&#39; => 5, //定义连接超时为5秒,默认php.ini中default_socket_timeout的值
      );
      libxml_disable_entity_loader(false);
      $client = new \SoapClient($url, $options);
      return $client->__soapCall($function_name, $arguments);
 
    } catch (\SoapFault $e) {
      //超时、连接不上
      if($e->faultcode == &#39;HTTP&#39;){
        throw new TimeoutException(&#39;连接或请求超时&#39;, $e->getCode());
      }
    }
Copier après la connexion

La demande Soap peut également utiliser le contexte du flux de ressources, et le délai d'expiration de la demande peut être écrit dans stream_context_create().

try {
         $arrContextOptions=array("ssl"=>array( "verify_peer"=>false, "verify_peer_name"=>false,&#39;crypto_method&#39; => STREAM_CRYPTO_METHOD_TLS_CLIENT));
 
          //$arrContextOptions=array("http"=>array( "method"=>&#39;GET&#39;, &#39;timeout&#39;=>10));
         $options = array(
                 &#39;soap_version&#39;=>SOAP_1_2,
                 &#39;exceptions&#39;=>true,
                 &#39;trace&#39;=>1,
                 &#39;cache_wsdl&#39;=>WSDL_CACHE_NONE,
                 &#39;stream_context&#39; => stream_context_create($arrContextOptions)
         );
         $client = new SoapClient(&#39;https://url/dir/file.wsdl&#39;, $options);
     
     } catch (Exception $e) {
         echo "<h2>Exception Error!</h2>";
         echo $e->getMessage();
     }
Copier après la connexion

Apprentissage recommandé : Tutoriel vidéo php

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal