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,您可能无能为力。
我想使用 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,您可能无能为力。