PHP5.6 CURL タイムアウトの問題。理由の分析にご協力ください。

WBOY
リリース: 2016-06-20 12:28:17
オリジナル
1548 人が閲覧しました

最近 WeChat を開発しているのですが、WeChat インターフェイスにアクセスすると CURL で常に不可解なタイムアウトの問題が発生します。さまざまな試みを行った後、次の設定方法は比較的安定していますが、それでも毎日タイムアウトが発生します。 CURL の設定は次のとおりです。

$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  //TRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出。 curl_setopt($curl, CURLOPT_DNS_CACHE_TIMEOUT, 0);  // 	设置在内存中缓存 DNS 的时间,默认为120秒(两分钟)。  curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);  //TRUE 时将会根据服务器返回 HTTP 头中的 "Location: " 重定向。  curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1); //TRUE 强制获取一个新的连接,而不是缓存中的连接。 curl_setopt($curl, CURLOPT_CONNECTTIMEOUT_MS, 200); //尝试连接等待的时间,以毫秒为单位。设置为0,则无限等待。curl_setopt($curl, CURLOPT_TIMEOUT_MS, 800);    //设置cURL允许执行的最长毫秒数if($https==1){	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);}$gf = curl_getinfo($curl);$data = curl_exec($curl);curl_close($curl); 
ログイン後にコピー


返されるエラー メッセージは次のとおりです: SSL 接続タイムアウト

次の情報を取得するには、curl_getinfo($cul) を印刷してください
url=https://api.weixin.qq.com/cgi-bin/user/info?access_token=_lAyXxUpGaDZxV&openid=osPXyjh7a8L&lang=zh_CNcontent_type=http_code=0header_size=0request_size=0filetime=-1ssl_verify_result=1redirect_count=0total_time=0.063namelookup_time=0.032connect_time=0.063pretransfer_time=0size_upload=0size_download=0speed_download=0speed_upload=0download_content_length=-1upload_content_length=-1starttransfer_time=0redirect_time=0redirect_url=primary_ip=140.207.135.108certinfo=Arrayprimary_port=443local_ip=196.205.247.126local_port=57982
ログイン後にコピー

オペレーティング システムは win2012 r2、php5.6
ブラウザから間違った URL を開くと、すべて正常に動作します。
原因の分析にご協力ください。


への返信ディスカッション (解決策)

タイムアウトを適切に増やします。800 ミリ秒は明らかに少し短いです
または、このブログ投稿 http://www.sitecrafting.com/blog/php-curl- ssl-connection- を参照してください。 timeout/
タイムアウト時に再接続を試みます

タイムアウトを適切に増やします。800 ミリ秒は明らかに少し短いです
または、このブログ投稿 http://www .sitecrafting.com/blog を参照してください。 /php-curl-ssl-connection-timeout/
タイムアウト時に再接続を試みます



この記事に従ってテストし、リンク時間とタイムアウト時間の設定も試しました。少し時間がかかりますが、しかし、それでも問題は発生します。

タイムアウトを適切に増やします。800 ミリ秒は明らかに少し短いです
または、このブログ投稿 http://www.sitecrafting.com/blog/php-curl-ssl-connection -timeout を参照してください。 /
タイムアウト時に再接続してみる



この記事に従ってテストし、リンク時間とタイムアウト時間を長めに設定してみましたが、依然として問題が発生します。
リンクが失敗した後、curl_init() またはcurl_reset() を再度実行しても、同じエラーが表示されます。

エラーが発生するとコードが停止します
そして、彼が例示したコードは 10 回試行した後に終了しました

あなたは彼の方法に従ってテストしたと言いましたが、あなたが指定したコードはコードを実行しますnot show

接続タイムアウトは非常に一般的なことです (ブラウザを使用している場合は更新するだけです)。プログラムを作成するときにこの更新アクションもシミュレートする必要があります

次の場合にコードが停止しますエラーが発生します
そして、彼が例として挙げたコードは 10 回試行した後にのみ終了します

あなたは彼の方法に従ってテストしたと言いましたが、あなたが与えたコードはそれを示していません

接続タイムアウトは非常に一般的なことです (ブラウザを使用している場合は、更新するだけです)。プログラムを作成するときにもこの更新アクションをシミュレートする必要があります。



申し訳ありませんが、上記のコードは私が簡略化したコードです。エラーが発生したため、再接続操作を 1 回だけ実行しました。問題がどこにあるのかわかりません (DNS 解決が失敗した可能性があります)。それでもエラーが発生する場合は、2 秒、4 秒、6 秒で区切られた別のリンクを使用します。リクエストを再度開始します。

エラーが発生するとコードが停止します
そして、彼の例のコードは 10 回試行した後にのみ終了します

あなたは彼の方法に従ってテストしたと言いましたが、あなたは指定されたコードは何も表示しません

接続タイムアウトは非常に一般的なことです (ブラウザーを使用している場合は更新するだけです)。プログラムを作成するときにこの更新アクションもシミュレートする必要があります



申し訳ありませんが、上記のコードは、エラーが発生した後、再接続操作のみを実行したものです。問題がどこにあるのかわかりません(DNS解決の失敗である可能性があります)。それでもエラーが発生する場合は、再接続操作を実行します。 use 別のリンクは、それぞれ 2 秒、4 秒、6 秒後にリクエストを再度開始します。
再接続のコードは次のとおりです

$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);//curl_setopt($curl, CURLOPT_HTTPHEADER, array('Expect: '));//curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  //TRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出。 curl_setopt($curl, CURLOPT_DNS_CACHE_TIMEOUT, 0);  // 	设置在内存中缓存 DNS 的时间,默认为120秒(两分钟)。  curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);  //TRUE 时将会根据服务器返回 HTTP 头中的 "Location: " 重定向。 curl_setopt($curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);//开启CURLOPT_FAILONERROR选项,必须同时开启CURLOPT_HEADER选项,//否则会造成size_download 和 download_content_length 大小不一致,导致最终无结果输出//curl_setopt($curl, CURLOPT_FAILONERROR, 1); //当 HTTP 状态码大于等于 400,TRUE 将将显示错误详情。 默认情况下将返回页面,忽略 HTTP 代码。 //开启CURLOPT_HEADER选项,需要在输出结果中分离出头部和内容部分,可使用curl_getinfo获取头部大小,进行字符串裁切//curl_setopt($curl, CURLOPT_HEADER, 1);  //启用时会将头文件的信息作为数据流输出。curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1); //TRUE 强制获取一个新的连接,而不是缓存中的连接。 curl_setopt($curl, CURLOPT_CONNECTTIMEOUT_MS, 200); //尝试连接等待的时间,以毫秒为单位。设置为0,则无限等待。curl_setopt($curl, CURLOPT_TIMEOUT_MS, 800);    //设置cURL允许执行的最长毫秒数curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);$data = curl_exec($curl);$gf = curl_getinfo($curl);if($gf['http_code']==0){	curl_reset($curl);	if(curl_errno($curl)){		echo " CURL_Error 2: " . curl_error($curl).'```'.$url;	}}curl_close($curl); 
ログイン後にコピー


知りたいのは、全体の実行時間が設定したタイムアウト制限を超えていない場合に SSL 接続が発生する理由です。 。
証明書を使用して検証したいのですが、WeChat インターフェイスでは証明書ファイルが提供されていません。証明書の取得方法がわかりません。

URL が https://.... であるため、リンク タイムアウト情報は SSL 接続タイムアウトです
URL が http://.... であるため、リンク タイムアウト情報は HTTP 接続タイムアウトです

これはコードの問題ではありません。接続タイムアウトの具体的な理由を知っていても役に立ちません。それはあなたの管轄外であるためです。
受動的に繰り返すことしかできません。 まで接続してみてください。成功しました

URL は https://.... なので、リンク タイムアウト情報は SSL 接続タイムアウトです
URL が http://.. .. の場合、リンクはタイムアウト情報は HTTP 接続タイムアウトです

これはコードの問題ではありません。接続タイムアウトの具体的な理由を知っていても役に立ちません。それはあなたの管轄外であるためです。
受動的に接続を試行することしかできません。成功するまで繰り返し


很抱歉,使用循环链接的方式,不能成功,下面是我循环100链接的代码和输出结果
最新的如果碰到错误,循环执行十次代码,如下
$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  //TRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出。 curl_setopt($curl, CURLOPT_DNS_CACHE_TIMEOUT, 0);  // 	设置在内存中缓存 DNS 的时间,默认为120秒(两分钟)。  curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);  //TRUE 时将会根据服务器返回 HTTP 头中的 "Location: " 重定向。 curl_setopt($curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1); //TRUE 强制获取一个新的连接,而不是缓存中的连接。 curl_setopt($curl, CURLOPT_CONNECTTIMEOUT_MS, 200); //尝试连接等待的时间,以毫秒为单位。设置为0,则无限等待。curl_setopt($curl, CURLOPT_TIMEOUT_MS, 800);    //设置cURL允许执行的最长毫秒数curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);$data = curl_exec($curl);$gf = curl_getinfo($curl);if($gf['http_code']==0){	for($i=0;$i<100;$i++){		curl_reset($curl);		if(curl_errno($curl)){			get_error($do." CURL_Error ".($i+2).": " . curl_error($curl).'```'.$url);		}else{			break;		}	}            }curl_close($curl); 
ログイン後にコピー


执行结果如下
2016-05-20 09:39:39CURL_Error: SSL connection timeout```https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx9964f7c0&secret=f0ab3a4e974d010fe&code=041wv2q1w6x2t&grant_type=authorization_code2016-05-20 09:39:39CURL_Error 2: SSL connection timeout```https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx9964f7c0&secret=f0ab3a4e974d010fe&code=041wv2q1w6x2t&grant_type=authorization_code2016-05-20 09:39:39CURL_Error 3: SSL connection timeout```https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx9964f7c0&secret=f0ab3a4e974d010fe&code=041wv2q1w6x2t&grant_type=authorization_code2016-05-20 09:39:39CURL_Error 4: SSL connection timeout```https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx9964f7c0&secret=f0ab3a4e974d010fe&code=041wv2q1w6x2t&grant_type=authorization_code2016-05-20 09:39:39CURL_Error 5: SSL connection timeout```https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx9964f7c0&secret=f0ab3a4e974d010fe&code=041wv2q1w6x2t&grant_type=authorization_code2016-05-20 09:39:39CURL_Error 6: SSL connection timeout```https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx9964f7c0&secret=f0ab3a4e974d010fe&code=041wv2q1w6x2t&grant_type=authorization_code2016-05-20 09:39:39CURL_Error 7: SSL connection timeout```https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx9964f7c0&secret=f0ab3a4e974d010fe&code=041wv2q1w6x2t&grant_type=authorization_code2016-05-20 09:39:39CURL_Error 8: SSL connection timeout```https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx9964f7c0&secret=f0ab3a4e974d010fe&code=041wv2q1w6x2t&grant_type=authorization_code2016-05-20 09:39:39CURL_Error 9: SSL connection timeout```https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx9964f7c0&secret=f0ab3a4e974d010fe&code=041wv2q1w6x2t&grant_type=authorization_code2016-05-20 09:39:39CURL_Error 10: SSL connection timeout```https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx9964f7c0&secret=f0ab3a4e974d010fe&code=041wv2q1w6x2t&grant_type=authorization_code2016-05-20 09:39:39CURL_Error 11: SSL connection timeout```https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx9964f7c0&secret=f0ab3a4e974d010fe&code=041wv2q1w6x2t&grant_type=authorization_code...........................
ログイン後にコピー

我原以为你是知道 curl 是不能重入的,结果你并不知道
你这样的写法当然不行!

我原以为你是知道 curl 是不能重入的,结果你并不知道
你这样的写法当然不行!


请问,不能重入 是什么意思,需要重新从 curl_init(),开始循环执行么?

对!循环中需要从 curl_init() 开始

只有在 url、请求类型 发生变化时,才可以复用 curl 实例

再说 微信 的 token 是实时发放的,也没有看到你获取的代码

对!循环中需要从 curl_init() 开始

只有在 url、请求类型 发生变化时,才可以复用 curl 实例


谢谢,我再测试下,稍后我将测试结果反馈回来。

再说 微信 的 token 是实时发放的,也没有看到你获取的代码


经过将近半天的测试,首次失败后,重新链接,第二次就链接成功了,暂时没有出现两遍以上没有链接成功的情况。

造成链接失败的原因是因为 CURL不稳定么?前段时间不知道是没有注意还是别的情况,没有发现链接失败的问题,突然有一天就出现这个问题了。
ping 微信接口,时间都是 50毫秒之内。ping 10000次,丢包率为0,。应该不是网络问题造成的链接失败原因,好郁闷。

不能什么事情都赖自己,你怎么就知道不是网络或腾讯的问题呢?(这两天腾讯游戏都是一卡一卡的)
你的那些测试都取的平均值(ping 用的协议都不一样),只能说明是长期稳定的,并不能排除突发事件的影响

不能什么事情都赖自己,你怎么就知道不是网络或腾讯的问题呢?(这两天腾讯游戏都是一卡一卡的)
你的那些测试都取的平均值(ping 用的协议都不一样),只能说明是长期稳定的,并不能排除突发事件的影响



好的,谢了
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!