Maison > Article > développement back-end > Quelles sont les méthodes pour définir le timeout PHP ?
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.
Ouvrez le fichier php.ini et recherchez :
max_execution_time=30
est modifié en :
max_execution_time=600
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('max_execution_time', 600);//秒为单位,自己根据需要定义
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
(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.
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.
<?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 ) ); // 发送
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 )
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 )
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] => )
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['timed_out'] ) { echo "Write time out" ; fclose( $fp ); return false; } //读取数据 $buf = fread( $fp , 16 ) ; $status = stream_get_meta_data( $fp ) ; //读取数据超时 if( $status['timed_out'] ) { echo "Read time out" ; fclose( $fp ); return false; } }
À 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( 'http'=>array( 'method' => "GET", 'timeout' => 1,//单位秒, 默认使用php.ini中default_socket_timeout的设置 ) ); $post_opts = array( 'http'=>array( 'method' => "POST", 'timeout' => 60,//单位秒, 可用ini_set('default_socket_timeout', 120);进行默认设置 'content' => http_build_query($param_array, '', '&') ) ); $opts = $get_opts; $res = file_get_contents($url, FALSE, stream_context_create($opts)); //返回string,失败返回FALSE
ini_set('default_socket_timeout', 30); //定义响应超时为30秒 try { $options = array( 'cache_wsdl' => 0, 'connection_timeout' => 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 == 'HTTP'){ throw new TimeoutException('连接或请求超时', $e->getCode()); } }
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,'crypto_method' => STREAM_CRYPTO_METHOD_TLS_CLIENT)); //$arrContextOptions=array("http"=>array( "method"=>'GET', 'timeout'=>10)); $options = array( 'soap_version'=>SOAP_1_2, 'exceptions'=>true, 'trace'=>1, 'cache_wsdl'=>WSDL_CACHE_NONE, 'stream_context' => stream_context_create($arrContextOptions) ); $client = new SoapClient('https://url/dir/file.wsdl', $options); } catch (Exception $e) { echo "<h2>Exception Error!</h2>"; echo $e->getMessage(); }
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!