ホームページ >バックエンド開発 >PHPの問題 >PHPのタイムアウトを設定するにはどのような方法がありますか?

PHPのタイムアウトを設定するにはどのような方法がありますか?

醉折花枝作酒筹
醉折花枝作酒筹転載
2021-05-26 17:23:335378ブラウズ

この記事では、PHP のタイムアウトを設定する方法を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。

PHPのタイムアウトを設定するにはどのような方法がありますか?

1. PHP ファイルの実行タイムアウト

(1) 初期設定スクリプトの実行時間

php.ini ファイルを開き、以下を見つけます。

max_execution_time=30

変更:

max_execution_time=600

サーバー変更権限がない場合は、組み込みの PHP スクリプト メソッドを使用してタイムアウトを設定し、必要な PHP ファイルに次のコードを追加できます。長期的な操作を実行するには:

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

.htaccess ファイルでタイムアウトを設定し、ファイルに次のコードを追加することもできます:

php_value max_execution_time 600

(2) スクリプトをリセットします。実行時間とタイマーのリセット

set_time_limit (int $秒): bool

秒-----最大実行時間、単位は秒です。 0 (ゼロ) に設定すると、時間制限はありません。

スクリプトの実行に許可される時間を秒単位で設定します。この設定を超えると、スクリプトは致命的なエラーを返します。デフォルト値は 30 秒、または php.ini の max_execution_time で定義された値 (この値が存在する場合) です。

この関数が呼び出されると、set_time_limit() はタイムアウト カウンタを 0 から再スタートします。つまり、デフォルトのタイムアウトが 30 秒で、スクリプトが 25 秒間実行されているときに set_time_limit(20) が呼び出された場合、タイムアウトになるまでにスクリプトを実行できる合計時間は 45 秒になります。

2. PHP Curl リクエストのタイムアウト

Curl は、HTTP プロトコル インターフェイスにアクセスするために一般的に使用されるライブラリ ライブラリであり、高いパフォーマンスといくつかの同時サポート機能を備えています。

curl_setopt($ch, opt) 主に次のようないくつかのタイムアウト設定を設定できます。

a、CURLOPT_TIMEOUT は、CURL の実行が許可される最大秒数を設定します。

b. CURLOPT_TIMEOUT_MS は、CURL の実行が許可される最大ミリ秒数を設定します。

c. CURLOPT_CONNECTTIMEOUT 接続を開始するまでの待機時間 0 に設定すると、無期限に待機します。

d. CURLOPT_CONNECTTIMEOUT_MS 接続試行を待機する時間 (ミリ秒単位)。 0 に設定すると、無限に待機します。

e. CURLOPT_DNS_CACHE_TIMEOUT は、DNS 情報をメモリに保存する時間を設定します (デフォルトは 120 秒)。

3. 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 ) );  // 发送

PHP には fsockopen() メソッドのソケットに接続するためのタイムアウト パラメーターがありますが、成功した後のデータの読み取りと書き込みのためのタイムアウト パラメーターはありません。 C.の接続をセットアップします。それは問題ではありません。PHP は、タイムアウトを防ぐためのストリーム用の一連のメソッドを提供します。

stream_set_blocking( $fp , false )

データが読み取られる前に終了しないように、データ フローをブロッキング モードに設定します。

モードが false の場合、指定されたソケット記述子は非ブロック モードに切り替わります。 true, その後、ブロック モードに切り替えます。この効果は、ソケットから読み取る fgets() に似ています。非ブロック モードでは、fgets() はすぐに戻りますが、ブロック モードでは、データが要件を満たすまで待機します。

stream_set_timeout( $fp , 10 )

タイムアウトを設定します。接続が正常に確立された直後にこの文を追加します。次のパラメータの単位は秒です。

カプセル化プロトコル ファイル ポインタからヘッダ/メタデータを取得して戻ります配列の形式は次のとおりです:

Array
(
  [stream_type] => tcp_socket
  [mode] => r+
  [unread_bytes] => 0
  [seekable] =>
  [timed_out] =>
  [blocked] => 1
  [eof] =>
)

インデックス timed_out はタイムアウト情報で、タイムアウトした場合は true、タイムアウトしていない場合は false です。これを使用して判断できます。 fwrite()、fread() などの待機が必要な各ステートメントの後に、それが読み取られるたびに、ソケットがタイムアウトしたかどうかを判断する必要があることに注意してください。タイムアウトになります。接続の場合、タイムアウト設定 stream_set_timeout ( $fp , 10 ) を 1 つだけで十分です。

$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;
  }
}

4. File_get_contents のタイムアウト処理 (ソケットのカプセル化、file_put_contents と同様)

PHP5 以降、file_get_content はすでにコンテキストをサポートしています (マニュアルには 5.0.0 でコンテキストのサポートが追加されました)。つまり、5.0 以降、file_get_contents は実際にデータを POST できるようになりました。同様のものには、fopen (PHP5 以降コンテキストのサポートも追加されました) や file (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

5. 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());
      }
    }

soap リクエストではリソース ストリーム コンテキストを使用することもでき、リクエスト タイムアウトを 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();
     }

推奨学習: php ビデオ チュートリアル

以上がPHPのタイムアウトを設定するにはどのような方法がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。