web-dev-qa-db-ja.com

Guzzle httpClient Drupal Core throwing cURL error 28操作がタイムアウトしました

drupal 8サイトにhttpClientコアサービスを読み込んでいます。サービスクラスは、リクエストがAPIからあまり長くかからない場合にうまく機能します。リクエストが約20〜30秒を超えると、サイトはcURL応答エラー28をスローし、

GuzzleHttp\Exception\ConnectException: cURL error 28: Operation timed out  after 30000 milliseconds with 0 bytes received (see http://curl.haxx.se/libcurl/c/libcurl-errors.html) in GuzzleHttp\Handler\CurlFactory::createRejection() (line 186 of ../vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php).

オンラインで少し調べてみると、「CURLOPT_TIMEOUT_MS」エラーがすべてのバージョンのphpでは機能しないという事実への言及があり、「CURLOPT_TIMEOUT_MS」への参照を「CURLOPT_CONNECTTIMEOUT_MS」と同じ「CURLOPT_TIMEOUT」に置き換えることを提案しています。

上記のエラーが発生したファイルで、374〜380行で次のようになっていることがわかりました

if (isset($options['timeout'])) {
  $conf[CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000;
}
if (isset($options['connect_timeout'])) {
   $conf[CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000;
}

次のように変更した場合

if (isset($options['timeout'])) {
    $conf[CURLOPT_TIMEOUT] = $options['timeout'] * 1000;
}
if (isset($options['connect_timeout'])) {
   $conf[CURLOPT_CONNECTTIMEOUT] = $options['connect_timeout'] * 1000;
}

「_MS」を削除すると、サイトはエラーをスローしません。

これはコアコードのエラーですか?この問題はおそらく関連していますか? this d.oの問題に添付されているパッチで修正できますか?また、私が上記で言及したことを参照して、その問題に関する this コメントを参照してください。

これについての提案や指示は大歓迎です!

1
Hershy

@cilefenが彼のコメントで示唆したように、私の問題は、未定義の定数のエラーではなく、呼び出しコードで設定されているタイムアウト値に関連していました。次のようにAPI呼び出しを行っているカスタムコードのタイムアウト値を調整して、特定の状況でエラーを修正しました(600は例です)。

$request = $client->post($url, [
  'timeout' => 600,
  'json' => [array(...)],
]);
1
Hershy