无法cURL图像。不知道该怎么办

时间:2014-05-13 15:56:14

标签: php curl

我们已获得定期从其他网站复制网络摄像头图像的权限。我们在代码中的其他位置使用cURL函数,但在尝试访问此图像时,我们无法执行此操作。

我不确定发生了什么。我们用于许多其他cURL函数的代码如下:

$image = 'http://island-alpaca.selfip.com:10202/SnapShotJPEG?Resolution=640x480&Quality=Standard'    

$options = array(
                    CURLOPT_URL => $image,
                    CURLOPT_RETURNTRANSFER => true,
                    CURLOPT_FOLLOWLOCATION => true,
                    CURLOPT_CONNECTTIMEOUT => 120,
                    CURLOPT_TIMEOUT => 120,
                    CURLOPT_MAXREDIRS => 10
                );

        $ch = curl_init();
        curl_setopt_array($ch, $options);
        $cURL_source = curl_exec($ch);
        curl_close($ch);

此代码不适用于以下网址(网络摄像头图片),该网址可在我们所在位置的浏览器中访问:http://island-alpaca.selfip.com:10202/SnapShotJPEG?Resolution=640x480&Quality=Standard

当我运行测试cURL时,它似乎暂停了超时的长度。 $cURL_source永远不会有任何数据。

我在网上尝试过其他一些cURL示例,但无济于事。我假设有一种方法来构建cURL请求以使其工作,但我尝试过的任何东西似乎都无法让我到处。

非常感谢任何帮助。

由于

5 个答案:

答案 0 :(得分:3)

我发现您的代码没有任何问题。由于网络问题不同,有时会出错。您可以尝试在循环中等待良好的响应,以增加成功的机会。

类似的东西:

$image = 'http://island-alpaca.selfip.com:10202/SnapShotJPEG?Resolution=640x480&Quality=Standard';
$tries = 3; // max tries to get good response
$retry_after = 5; // seconds to wait before new try

while($tries > 0) {
    $options = array(
        CURLOPT_URL => $image,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_CONNECTTIMEOUT => 10,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_MAXREDIRS => 10
    );

    $ch = curl_init();
    curl_setopt_array($ch, $options);
    $cURL_source = curl_exec($ch);
    curl_close($ch);

    if($cURL_source !== false) {
        break;
    }
    else {
        $tries--;
        sleep($retry_after);
    }
}

答案 1 :(得分:1)

如前所述,我可以看到代码有任何问题。但是,也许您应该考虑为卷曲设置更多超时 - 以确保最终加载这个缓慢加载的图片。所以,作为一种可能性,尝试将CURLOPT_TIMEOUT增加到奇怪的大数,以及php脚本执行的相应超时。它可能有所帮助。 也许,最好的变体是混合前一作者的变体和这一个。

答案 2 :(得分:1)

我在图片网址上尝试了wget并下载了图片然后似乎挂了 - 也许服务器没有正确关闭连接。

然而,我得到了file_get_contents而不是curl,如果这有帮助:

<?php
$image = 'http://island-alpaca.selfip.com:10202/SnapShotJPEG?Resolution=640x480&Quality=Standard';
$imageData = base64_encode(file_get_contents($image));
$src = 'data: '.mime_content_type($image).';base64,'.$imageData;
echo '<img src="',$src,'">';

答案 3 :(得分:1)

你确定它不起作用吗?您的代码对我来说很好(在$image = ...之后添加缺少的分号后)。

它可能给你带来麻烦的原因是因为它实际上并不是一个图像,它是一个MJPEG。它使用一个保持打开且具有多部分内容的HTTP会话(类似于您在MIME电子邮件中看到的内容),并且服务器推送一个新的JPEG帧以替换间隔中的最后一个。尽管如此,CURL似乎很高兴为您提供第一帧。

答案 4 :(得分:1)

您可以从运行此代码的服务器获取URL吗?也许它有防火墙规则?您是从非标准端口获取的:10202。您的防火墙必须允许它。

我和其他人一样,发现使用curl / php获取图像很容易。