日期:2014-05-17  浏览次数:20573 次

求解惑 , php向其它服务器请求时经常响应失败.
1 直接用file_get_contents 来实现
file_get_contents( $url );

2 使用curl 扩展.
 $ch = curl_init();
  $timeout = 30;
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  $contents = trim(curl_exec($ch));
  curl_close($ch);

3 socket 套接.
$address = ' http://1.2.3.4:9001/';
$path = '/aaa/bbb';
$sock = fsockopen($address, 80, $errno, $errstr, 30);
if (!$sock) die("$errstr ($errno)\n");
$psw = md5('123.456');
$data = "xxx=xxx&yyy=yyy";
fwrite($sock, "POST $path HTTP/1.0\r\n");
fwrite($sock, "Host: localhost\r\n");
fwrite($sock, "Content-type: application/x-www-form-urlencoded\r\n");
fwrite($sock, "Content-length: " . strlen($data) . "\r\n");
fwrite($sock, "Accept: */*\r\n");
fwrite($sock, "\r\n");
fwrite($sock, "$data\r\n");
fwrite($sock, "\r\n");
$headers = "";
while ($str = trim(fgets($sock, 4096)))
$headers .= "$str\n";
$body = "";
while (!feof($sock))
$body .= fgets($sock, 4096);
fclose($sock);
$body1 = explode("#",$body);
return $body1;

三种方式均效果缓慢。

直接输出 echo "<iframe src = '$url'></iframe>"; 时正常.

上述代码均在for 循环中实际运行。下面的抓包的效果

之前访问都挺好的,最近,使用时,经常卡住。会报错
求各位朋友帮忙!

------解决方案--------------------
1、考虑是否 cookie 的影响
2、应该设置来路

都是内网地址,把图涂得那么乱干什么
------解决方案--------------------
源地址的网络不好?
------解决方案--------------------
探讨

感觉是明显被请求的地方,连接资源有限。有没有办法建立一个持久连接。需要的时候,用这个资源。 不用每次连接时,都去开一个资源。

------解决方案--------------------
探讨

感觉是明显被请求的地方,连接资源有限。有没有办法建立一个持久连接。需要的时候,用这个资源。 不用每次连接时,都去开一个资源。

------解决方案--------------------
连接太频繁了,疑似DOS攻击,进临时黑名单了。

直接用curl,请求keepalive即可。

CURLOPT_FRESH_CONNECT => false
CURLOPT_FORBID_REUSE => false

配置这两个选项即可,curl_exec之后不用关闭了,下次继续用。