[解决办法]
$url = 'http://www.abc.com/atxt';
$ch = curl_init();
$timeout = 10; // set to zero for no timeout
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$handles = curl_exec($ch);
echo $handles;
....
curl_close($ch);
exit;
2**********
$fp = fsockopen("cplink.duozz.com", 80, $errno, $errstr, 30); 上面是第一段,如果没错的话,上面的会输出一些二进制乱码,没错,图片直接打印是这样的。可是在我的一台正式服务器上却输出空。
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
fputs($fp,"GET /public/default/images/logo.jpg HTTP/1.0\r\n");
fputs($fp,"Host: cplink.duozz.com\r\n");
fputs($fp,"Connection: Close\r\n\r\n");
$tmp = "";
while (!feof($fp)) {
$tmp .= fgets($fp, 128);
}
fclose($fp);
}
var_dump($tmp);
经过一步步调试改为如下代码
$fp = fsockopen("cplink.duozz.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET /public/default/images/logo.jpg HTTP/1.0\r\n";
$out .= "Host: cplink.duozz.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fputs($fp, $out);
$tmp = "";
while (!feof($fp)) {
$tmp .= fgets($fp, 128);
}
fclose($fp);
}
var_dump($tmp);上面这段代码输出了我想要的内容。改动只是把fputs的内容先连成一个长字符串 ,一起提交。。为啥会有这个BUG没查出来。网上也有很多相同的难友
下面讲正题。
pub_httpdown.php 里恰恰是用的我讲的第一种方式,结果直接造成远程图片不能本地话
我通过改为第二中方式解决BUG。不过还是希望官方有高手能解释下为什么。
改过的pub_httpdown.php见附件
另外还有一个小BUG 此文件的SaveToText函数调用了一个并不存在的$this->SaveBinFile() 我觉得作者本意可能是要用$this->SaveToBin()所以也改了。
希望官方也讲一下
3******************
解决的方法都是修改php.ini,把allow_url_fopen给启用,改成 allow_url_fopen = On
这样做可以解决某些人的问题,但是有些还是会有这个警告信息,想用完美的解决还差一步,还得设置php.ini里面的user_agent,php 默认的user_agent是PHP,我们把它改成Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)来模拟浏览器就可以了
user_agent=”Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)”
4 循环反复去取url
修改原来的函数如
换成
这样,函数将判断是否取到内容,取不到的话,将重复执行(@的作用:过滤错误提示)。经过本人测试,如此while循环执行不超过10次(我的最多4次即可获取),即可完成file_get_contents操作。
发出来心得,大家共享一下。
[补充]
这里会出现一个潜在的错误:如果文件不存在的话,程序将进入死循环,因此,加入判断次数。假设只检查4次。
4次之后还没取到,直接进入下一个函数吧!上面只是终止全部操作,这里的函数可以自行配置