PHP/cURL 错误 7;无法连接到主机


PHP/cURL Error 7; Couldn't connect to host

所以我一直遇到同样的错误...我已经搜索了几个小时试图找到解决方案,但我似乎找不到缺失的部分。 许多其他人询问堆栈溢出的错误 7,但没有一个与我的场景相似。

基本上,我使用 cURL 下载通过 XML 源发送的图像。 我的整个脚本都可以工作,一切都在运行,我在下面编写的功能甚至可以下载数千张图像(有时高达 3000 张)。

我想我的问题是,为什么下载 3000 张图像后它只是无法连接?

function downloadImage($location, $imagesPath, $imageName) {
    //Location fix
    $location = str_replace(" ", "%20", $location);
    $url  = $location;
    $path = $imagesPath . $imageName;
    $fp = fopen($path, 'w');    
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); //Wait indefinitately      
    curl_setopt($ch, CURLOPT_DNS_USE_GLOBAL_CACHE, false);
    $data = curl_exec($ch); 
    if ($data === false) {
      echo "DownloadImage cURL failed 1: (" . curl_errno($ch) . ") " . curl_error($ch) . "<br/>";
      //exit;
    }           
    curl_close($ch);

    fclose($fp);        
}

因此,为了使它工作,我不得不在函数上设置一个瓶颈以减慢它的速度。 正如 Andrewsi 所建议的那样,远程站点因下载图像太快而切断了我的联系。 为了解决该功能的瓶颈,我将每个图像FTP到远程服务器(因为无论如何都需要这样做)。

最终函数如下所示:

function downloadImage($location, $imagesPath, $imageName, $ch3, $feedFTPinfo) {
//Location fix
//$location = str_replace(" ", "%20", $location);   
$url  = $location;
$path = $imagesPath . $imageName;
$fp = fopen($path, 'w');    
$ch2 = curl_init(); // Initiate cURL for downloading images
//Setup the cURL options for the second handle ($ch2)
curl_setopt($ch2, CURLOPT_URL, $url);
curl_setopt($ch2, CURLOPT_FILE, $fp);   
curl_setopt($ch2, CURLOPT_CONNECTTIMEOUT, 0); //Wait indefinitately     
curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, true);
//Execute the cURL session
$data2 = curl_exec($ch2); 
//Resize Images
$image = new SimpleImage();
$image->load($url); 
$imageNameSm = str_replace(".jpg", "", $imageName);
$imageNameSm = $imageNameSm."_sm2.jpg"; 
$image->resizeToWidth(120);
$image->save($imagesPath . $imageNameSm);   
$smPath = $imagesPath . $imageNameSm;
//Find out if there were any issues
if ($data2 === false) {
  echo "DownloadImage cURL failed 1: (" . curl_errno($ch2) . ") " . curl_error($ch2) . "<br/>";
  //exit;
} else {
    //There weren't any issues downloading the file, move it to the speficifed ftp server
    if (!empty($feedFTPinfo)) {
        $localfile = $path;
        $fp = fopen($localfile, 'r');
        //Setup the options for the 3rd handle
        curl_setopt($ch3, CURLOPT_URL, $feedFTPinfo.$imageName);
        curl_setopt($ch3, CURLOPT_CONNECTTIMEOUT, 0); //Wait indefinitately 
        curl_setopt($ch3, CURLOPT_UPLOAD, 1);
        curl_setopt($ch3, CURLOPT_INFILE, $fp);
        curl_setopt($ch3, CURLOPT_INFILESIZE, filesize($localfile));
        //Execute the 3rd cURL handle
        $data3 = curl_exec($ch3);
        //Find out if there were any issues with the execution
        if ($data3 === false) {
            echo "Uploading the image via FTP failed: (" . curl_errno($ch3) . ") " . curl_error($ch3) . "<br/>";
            //exit;
        }
        $localfile = $smPath;
        $fp = fopen($localfile, 'r');
        //Setup the options for the 3rd handle
        curl_setopt($ch3, CURLOPT_URL, $feedFTPinfo.$imageNameSm);
        curl_setopt($ch3, CURLOPT_CONNECTTIMEOUT, 0); //Wait indefinitately 
        curl_setopt($ch3, CURLOPT_UPLOAD, 1);
        curl_setopt($ch3, CURLOPT_INFILE, $fp);
        curl_setopt($ch3, CURLOPT_INFILESIZE, filesize($localfile));
        //Execute the 3rd cURL handle
        $data3 = curl_exec($ch3);
        //Find out if there were any issues with the execution
        if ($data3 === false) {
            echo "Uploading the small image via FTP failed: (" . curl_errno($ch3) . ") " . curl_error($ch3) . "<br/>";
            //exit;
        }           


    }

}
curl_close($ch2); //Close the cURL handle that downloads images
fclose($fp);
}
如果你不需要在

某个地方通过ftp来创建瓶颈,你可以在downloadImage函数中使用php的sleep(秒)或usleep(微秒)函数来创建类似的瓶颈。

  • sleep文档:http://php.net/manual/en/function.sleep.php
  • usleep文档:http://php.net/manual/en/function.usleep.php

希望这个理论对其他人有所帮助。