【问题标题】:php curl_exec() Connection refused when retrieving a remote imagephp curl_exec() 检索远程图像时连接被拒绝
【发布时间】:2022-01-13 11:32:13
【问题描述】:

我想用 php 检索远程托管图像。该图像存在,我可以使用我的浏览器访问它。然而 curl_exec() 的结果是空的并且 curl_error() 说:

无法连接到 img107.xooimage.com 端口 80:连接被拒绝

这是我的代码:

                $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

也许我的托管服务提供商应用了一些限制/防火墙。

【问题讨论】:

  • 这个特定的服务器可能正在过滤脚本,使用某种用户代理白名单。尝试传入浏览器的用户代理,作为第一次尝试。可能还有其他过滤服务器端的方法。使用 file_get_contents() 可以工作吗?还允许 url fopen 必须启用到 php ini
  • file_get_contents() 也返回空。我已经使用 phpInfo() 检查了允许 url fopen 是否打开。我会尝试用户代理技巧。
  • 使用用户代理技巧curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)');,我仍然遇到同样的错误

标签: php image curl connection-refused


【解决方案1】:

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

我从我的网站数据库中导出了所有图像 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 保存图像。 我从我的个人计算机上运行脚本,它与我的网站主机没有相同的限制。 我可以检索所有的图片。

如果您不管理主机上的权利/限制,您可能无能为力。

【讨论】:

    【解决方案2】:

    经过测试,以下确实将给定的图像与脚本一起保存到文件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);
    

    【讨论】:

    • 如果此代码对您有用,那么我必须有一些特殊设置阻止我从域外检索文件。
    • 是的,至少,我确实确认它可以立即正常工作。也许检查你的写权限。先试试stackoverflow.com/questions/2900690/…检查你的php日志
    【解决方案3】:

    阅读前需要关闭 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;
    

    【讨论】:

    • 它真的对你有用吗?你可以执行例如file_put_contents('./myimage.png', $image); 吗?
    • 是的,使用fwrite保存
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 2021-04-16
    • 1970-01-01
    相关资源
    最近更新 更多