php curl_exec() 检索远程图像时连接被拒绝

php curl_exec() Connection refused when retrieving a remote image

我想使用 php 检索远程托管图像。图片存在,我可以用我的浏览器访问它。但是 curl_exec() 的结果是空的, curl_error() 表示:

Failed to connect to img107.xooimage.com port 80: Connection refused

这是我的代码:

                $ch = curl_init();
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_URL, 'http://img107.xooimage.com/files/5/0/b/ss-2014-06-15-at-12.58.47--46324f5.png');
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
                curl_setopt($ch, CURLOPT_TIMEOUT, 10);
                $image = curl_exec($ch);

                if( empty($image) ){
                    echo("Impossible to retrieve the file !<br>
                    error: ".curl_error($ch)."<br>");
                }

如果我可以用浏览器打开图片,那么为什么我使用 curl 时连接被拒绝?

备注:它适用于我自己域中的图像,但不适用于示例中的外部图像。

编辑:这实际上似乎不是 php 问题,因为我什至无法从我网站的主机服务器执行 curl 或 ping:

curl http://img107.xooimage.com/files/5/0/b/ss-2014-06-15-at-12.58.47--46324f5.png > image.png
Connection Refused

ping http://img107.xooimage.com
ping: unknown host http://img107.xooimage.com

ping http://www.google.com
ping: unknown host http://www.google.com

也许我的托管服务提供商应用了一些 limitations/firewalls。

阅读前需要先关闭curl

$ch = curl_init('http://img107.xooimage.com/files/5/0/b/ss-2014-06-15-at-12.58.47--46324f5.png');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FAILONERROR,true);
$image = curl_exec($ch);
if (curl_errno($ch)) {  
    print_r(curl_error($ch));  
    die;
}
curl_close($ch);
return $image;

经过测试,下面确实将给定的图片沿着脚本保存到了文件image.png中,并且是可读的。是不是少了什么?

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'http://img107.xooimage.com/files/5/0/b/ss-2014-06-15-at-12.58.47--46324f5.png');
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$image = curl_exec($ch);
var_dump($image); // Binary content
$save = fopen('image.png', 'w');
fwrite($save, $image);
fclose($save);
curl_close($ch);

这可能不是一个令人满意的结论,最多是一种解决方法,但这是我最终所做的。

我从我的网站数据库中导出了所有图像 URL。我根据这个命令创建了一个 bash 脚本:

curl http://img107.xooimage.com/files/5/0/b/ss-2014-06-15-at-12.58.47--46324f5.png > image.png

使用 curl 从 Internet 保存图像。 我 运行 来自我的个人计算机的脚本没有与我的网站主机相同的限制。 我可以找回所有的照片。

如果您不管理主机上的 rights/limitations,您可能无能为力。