過酷なネットワーク環境に対処するには、サーバーのフリーズを防ぐために php-curl のタイムアウト制限を設定します。
外国商品の発掘プロジェクトは会社名がないため申請できないため、フロントエンドマシンはAlibaba Cloud香港ECS上に配置され、追加のAlibaba Cloud杭州ECSを使用して実行されますcrontab——クローラーの実行、写真の保存 Alibaba Cloud OSS へのアクセスなど。最近、杭州 ECS が少し冗長だと感じたので (もともと杭州 RDS がありましたが、香港 RDS に移動されました)、削除する予定だったので、杭州 ECS 上のすべての crontab を香港 ECS に戻しました。これにより、多くの問題が発生しました。 それはどのような問題を引き起こしましたか?中心的な問題は、香港の ECS が国際的なネットワーク環境にあり、本土のサーバーにアクセスするときにネットワークのジッターが頻繁に発生することであり、これは非常に解決不可能です。より具体的には、たとえば、香港 ECS が Alibaba Cloud Hangzhou open search
にクエリを実行するとき (open search
には香港ノードがありません、親愛なる╥﹏╥)。 ..)、エラーがよく報告されます。別の例として、香港 ECS が画像をキャプチャして杭州 OSS にアップロードすることがあります (OSS には香港ノードがありますが、問題は画像処理サービスがないことです)。これはぼったくりだと思いますか?)、2 つ目は遅さで、エラーが報告されるまでしばらく停止することがよくあります。これにより、アップロードが非常に非効率になります (この理由だけでバックログが発生することをお伝えしておきます)。クロールされた何千もの商品が棚に並べられる前に写真のアップロードを待っています)。
open search
の問題はまだ簡単に解決できます。SDK ではタイムアウト制限を少し大きく設定しています (5 秒)。基本的にエラーは報告されません。 open search
(open search
没有香港节点呀亲 ╥﹏╥...)查询的时候,经常报错;又比如香港ECS抓到图片后上传杭州OSS(OSS是有香港节点,问题是没有图片处理的服务啊,你们说这不是坑死人吗),慢是其次,经常卡住一段时间后才报错,这使得上传的效率极其低下(我会告诉你就因为这个原因,积压了好几千爬回来的商品等着上传图片才能上架吗)。
open search
的问题还是很好解决的,SDK有提供超时的配置,我把超时限制设大了一点(5秒),基本上就不会报错了。
而OSS的SDK根本没有提供这方面的配置,为了解决这个问题,我决定深入到这SDK来修改源码。
OSS的SDK是通过php-curl
来请求api的,经调查后,我发现此SDK有个名为requestcore.class.php
的文件中定义了一个RequestCore
类,很明显,这个类就是负责发送请求的。其中,prep_request()
负责配置curl,send_request($parse = false)
则负责执行curl(即真正发送请求)。
首先来看看prep_request()
,其中包含两个php-curl
的两个超时配置:CURLOPT_TIMEOUT
以及CURLOPT_CONNECTTIMEOUT
curl_setopt($curl_handle, CURLOPT_TIMEOUT, 5184000);
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 120);
CURLOPT_TIMEOUT
好理解,就是整个curl请求过程(http request & response)的超时限制,以秒为单位,设置为0则无限制。CURLOPT_CONNECTTIMEOUT
比较难理解,目前确认的是,这是curl请求过程中的一小部分,因此必须要设得比CURLOPT_TIMEOUT
小,不然CURLOPT_TIMEOUT
无意义。网上的资料是这么说的:
CURLOPT_CONNECTTIMEOUT 在发起连接前等待的时间,如果设置为0,则无限等待。
这个发起连接前等待的时间
比较模糊,我倾向于这指的是完成TCP三次握手
过程前所耗费的时间,或者换句话说,TCP三次握手
的整个过程必须要在CURLOPT_CONNECTTIMEOUT
内完成,否则就超时。TCP三次握手
无法在指定时间内完成表示服务器正处在繁忙/奔溃的状态或网络异常,这正符合本文所提到的场景。
基于这一猜想下,我把CURLOPT_CONNECTTIMEOUT
设成3秒:
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 3);
如此,就不需要在网络抖动的时候等待2分钟(SDK设定的CURLOPT_CONNECTTIMEOUT
是120秒)才报错了。
PS:如果想要设置超时时间少于1秒,需要用到CURLOPT_TIMEOUT_MS
OSS SDK はこの設定をまったく提供していません。この問題を解決するために、SDK を深く掘り下げてソースコードを変更することにしました。
php-curl
を通じて API をリクエストします。調査の結果、この SDK には requestcore.class.php
という名前のファイルが定義されていることがわかりました。 RequestCore クラス。明らかに、このクラスはリクエストの送信を担当します。このうち、prep_request()
はcurlの設定を担当し、send_request($parse = false)
はcurlの実行(つまり、実際のリクエストの送信)を担当します。 まず、prep_request()
を見てみましょう。これには、2 つの php-curl
の 2 つのタイムアウト設定が含まれています: CURLOPT_TIMEOUT
と CURLOPT_CONNECTTIMEOUT
🎜curl_setopt($curl_handle, CURLOPT_TIMEOUT, 5184000);
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 120);🎜
CURLOPT_TIMEOUT
わかりやすいです。 curl リクエスト全体 プロセス (http リクエストとレスポンス) のタイムアウト制限 (秒単位)。制限なしの場合は 0 に設定します。 🎜CURLOPT_CONNECTTIMEOUT
は理解するのが難しいですが、これはcurl リクエスト プロセスの一部であることが現在確認されているため、CURLOPT_TIMEOUT
より小さく設定する必要があります。それ以外の場合は です。 CURLOPT_TIMEOUT
意味がありません。インターネット上の情報には次のように書かれています: 🎜🎜CURLOPT_CONNECTTIMEOUT は、接続を開始するまでの待機時間です。0 に設定すると、無期限に待機します。 🎜🎜 この
接続を開始するまでの待機時間
は、TCP スリーウェイ ハンドシェイク
プロセスを完了するのにかかる時間を指すことが多いです。つまり、TCP スリーウェイ ハンドシェイク
のプロセス全体は CURLOPT_CONNECTTIMEOUT
以内に完了する必要があります。完了しないとタイムアウトになります。 TCP スリーウェイ ハンドシェイク
が指定時間内に完了しない場合は、サーバーがビジー/クラッシュ状態にあるか、ネットワークが異常であることを示します。これは、この記事で説明したシナリオと一致します。 🎜この推測に基づいて、CURLOPT_CONNECTTIMEOUT
を 3 秒に設定しました。 🎜🎜curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 3);🎜🎜 この方法では、ネットワークに接続します。シェイク中は、エラーが報告されるまで 2 分間待機します (SDK によって設定されている
CURLOPT_CONNECTTIMEOUT
は 120 秒です)。 🎜🎜追記: タイムアウトを 1 秒未満に設定したい場合は、CURLOPT_TIMEOUT_MS
を使用する必要がありますが、Niao 兄弟によると、この設定にはバグがあり、テストされていないため、注意してください。 『カールのミリ秒タイムアウト「バグ」』🎜
🎜
上記では、crontab や画像の保存など、過酷なネットワーク環境に対処する方法、サーバーの停止を防ぐための php-curl のタイムアウト制限の設定方法を紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。 🎜
🎜
🎜

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









curl と Pythonrequests は両方とも、HTTP リクエストを送信するための強力なツールです。 curl はターミナルから直接リクエストを送信できるコマンドライン ツールですが、Python のリクエスト ライブラリは、Python コードからリクエストを送信するためのよりプログラム的な方法を提供します。 curl を Pythonrequestscurl コマンドに変換するための基本的な構文は次のとおりです。curl[OPTIONS]URLcurl コマンドを Python リクエストに変換する場合、オプションと URL を Python コードに変換する必要があります。これは、curlPOST コマンドの例です:curl-XPOST https://example.com/api

Linux でカールのバージョンを更新するには、以下の手順に従います。 現在のカールのバージョンを確認します。 まず、現在のシステムにインストールされているカールのバージョンを確認する必要があります。ターミナルを開き、次のコマンドを実行します。curl --version このコマンドは、現在のcurlバージョン情報を表示します。利用可能なcurlのバージョンを確認する:curlを更新する前に、利用可能な最新バージョンを確認する必要があります。 Curl の公式 Web サイト (curl.haxx.se) または関連ソフトウェア ソースにアクセスして、curl の最新バージョンを見つけることができます。 Curl ソース コードをダウンロードする:curl またはブラウザを使用して、選択した CURL バージョンのソース コード ファイル (通常は .tar.gz または .tar.bz2) をダウンロードします。

PHP8.1 リリース: 複数リクエストの同時処理のためのcurlの導入 最近、PHPは最新バージョンのPHP8.1を正式にリリースし、重要な機能である複数リクエストの同時処理のためのcurlを導入しました。この新機能により、開発者は複数の HTTP リクエストをより効率的かつ柔軟に処理できるようになり、パフォーマンスとユーザー エクスペリエンスが大幅に向上します。以前のバージョンでは、複数のリクエストを処理するには、多くの場合、複数の CURL リソースを作成し、ループを使用してデータをそれぞれ送受信する必要がありました。この方法でも目的は達成できますが、

最初から最後まで: HTTP リクエストに php 拡張機能 cURL を使用する方法 はじめに: Web 開発では、多くの場合、サードパーティ API または他のリモート サーバーと通信する必要があります。 cURL を使用して HTTP リクエストを行うのは、一般的で強力な方法です。この記事では、PHP を使用して cURL を拡張して HTTP リクエストを実行する方法を紹介し、いくつかの実用的なコード例を示します。 1. 準備 まず、php に cURL 拡張機能がインストールされていることを確認します。コマンドラインで php-m|grepcurl を実行して確認できます。

keepalive_timeouthttp にはキープアライブ モードがあり、リクエストの処理後に TCP 接続を開いたままにするよう Web サーバーに指示します。クライアントから他のリクエストを受信した場合、サーバーは別の接続を確立せずに、この閉じられていない接続を使用します。 httpkeep-alive、Web ページ上のすべてのリクエストは http (画像、CSS など) であり、http リクエストを開くには、まず TCP 接続を確立する必要があります。ページがリクエストごとに TCP 接続を開いたり閉じたりする必要がある場合keepalive_timeout の無駄は、http リクエストが完了しても、その TCP 接続が維持されることです。

Win11 システムをアップグレードした後、多くのユーザーは、クロックウォッチドッグタイムアウト ブルー スクリーンなどのブルー スクリーンを経験します。これを解決するにはどうすればよいでしょうか?ユーザーはドライバーを更新したり、過熱の問題などを確認したりできます。このサイトでは、win11のクロックウォッチドッグタイムアウトのブルースクリーンの解決策をユーザーに丁寧に紹介します。 win11 のクロックウォッチドッグタイムアウト ブルー スクリーンの解決策 1. ドライバーを更新します。CPU とマザーボードのドライバーを更新すると、問題が解決される可能性があります。製造元の Web サイトにアクセスして、最新のドライバーをダウンロードできます。 2. 過熱の問題を確認します。過熱もこのエラーの原因の 1 つである可能性があります。

Vue アプリケーション開発では、vue-resource を使用して HTTP リクエストを行うのが一般的な操作です。 vue-resource には便利な機能がたくさんありますが、場合によっては「エラー: timeoutofxxxmsexceeded」などのエラーメッセージが表示されることがあります。このエラーは通常、リクエストのタイムアウトによって発生します。では、この場合、どうやってこの問題を解決すればいいのでしょうか? 1. リクエストのタイムアウトを増やす まず、次の方法でリクエストのタイムアウトを増やすことができます。

Vue アプリケーションで axios を使用するときに「エラー: timeoutofxxxmsexceeded」が発生した場合はどうすればよいですか?インターネットの急速な発展に伴い、フロントエンド技術は常に更新され、改良が重ねられており、Vue は優れたフロントエンド フレームワークとして近年皆様に歓迎されています。 Vue アプリケーションでは、ネットワーク リクエストを行うために axios を使用する必要があることがよくありますが、「エラー: timeoutofxxxmsexceeded」というエラーが発生することがあります。
