无法在不崩溃curl_exec的情况下设置CURLOPT_NOBODY

时间:2010-11-25 00:28:41

标签: php curl

我整天都因为这个错误而自杀。我不能告诉你我对此有多大帮助表示感谢。

基本上,我有一个非常简单的脚本。它登录到一个网站,查看文件的标题以查看它是否是图像类型,然后下载它。然后重复这三次。

这里的问题是,如果没有curl_exec使用-no-错误导致整个脚本崩溃,我就无法设置CURLOPT_NOBODY。 (我甚至无法调用或获取curl_error!)似乎我不可能从CURLOPT_NOBODY转到CURLOPT_NOBODY,false。下面的循环运行一次然后die()。

可能导致此错误的原因是什么?

这是脚本:

// Log into the Website
curl_setopt($ch, CURLOPT_URL, 'http://myexample.com/login');
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12");
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_exec($ch);

// Begin the Loop for Finding Images
for($i = 0; $i < 3; $i++) {
    curl_setopt($ch, CURLOPT_URL, 'http://myexample.com/file.php?id=' . $i);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_setopt($ch, CURLOPT_HEADER, true);
    $output = curl_exec($ch) or die('WHY DOES THIS DIE!!!');
    $curl_info = curl_getinfo($ch);
    echo '<br/>' . $output;

    // (Normally checks for content type here) Download the File
    curl_setopt($ch, CURLOPT_URL, 'http://myexample.com/file.php?id=' . $i);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_NOBODY, false);
    $filename = 'downloads/test-' . $i . '.jpg';
    $fp = fopen($filename, 'w');
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_exec($ch);
    fclose($fp);
}

我正在运行apache 2.2和PHP版本5.2.13。 谢谢你的帮助 - 我不能告诉你我有多喜欢它。我完全被困在这里了。 :(

1 个答案:

答案 0 :(得分:1)

在我看来,卷曲库变得混乱,特别是在重用资源时。

你应该做

$ch = curl_init();
// do stuff with curl
curl_close($ch);
$ch = curl_init();
// another curl call
curl_close($ch);
$ch = curl_init();
// yet another curl call
curl_close($ch);

执行脚本时遇到了同样的错误,但添加curl_close和curl_init重新初始化,似乎解决了问题。如果没有,我不知道这是否可以接受。我使用fopen()进行http下载,它比使用curl更直观,除非你需要fopen不支持的东西。