PHP curl从URL下载空文件

时间:2017-01-06 23:15:40

标签: php curl

有一个代码示例可以下载网页内容。

问题:硬盘上始终显示零长度文件。

我相信这段代码在许多情况下都有用,但我很有兴趣知道在我的情况下如何修复它。

<?php

$url = 'https://wtfismyip.com/text';
$destFile = 'experiment.tmp';

$fp = fopen($destFile, 'w+b');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_FILE, $fp); // write curl response to file
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_exec($ch);
curl_close($ch);
fclose($fp);

我尝试了不同的URL而没有运气。通过fopen + fread的另一种方法可以正常工作。

  • Windows 7
  • PHP 7.1.0(cli)(建于2016年12月2日05:24:57)(ZTS MSVC14(Visual C ++ 2015)x64)
  • 执行php example.php

1 个答案:

答案 0 :(得分:0)

你的代码没有任何问题,它在这里运行正常,但是在任何地方都没有错误检查,你可能在某处遇到了一些错误。这应该抓住你的错误,试试吧

<?php
declare(strict_types=1);
error_reporting(E_ALL);
ini_set('display_errors','1');
$url = 'https://wtfismyip.com/text';
$destFile = 'experiment.tmp';

$fp =fopen($destFile, 'w+b');
if (false === $fp) {
    throw new RuntimeException ( 'fopen() failed.   last error: ' . return_var_dump ( error_get_last () ) );
}
$ch = curl_init();
if (false === $ch) {
    throw new RuntimeException ( 'curl_init() failed.   last error: ' . return_var_dump ( error_get_last () ) );
}

ecurl_setopt($ch, CURLOPT_URL,$url);
ecurl_setopt($ch, CURLOPT_FILE, $fp); // write curl response to file
ecurl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
ecurl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
ecurl_setopt($ch, CURLOPT_VERBOSE, true);
ecurl_setopt($ch, CURLOPT_STDERR, $fp);
ecurl_exec($ch);
curl_close($ch);
fclose($fp);



function ecurl_setopt ( /*resource*/$ch , int $option , /*mixed*/ $value ):bool{
    $ret=curl_setopt($ch,$option,$value);
    if($ret!==true){
        //option should be obvious by stack trace
        throw new RuntimeException ( 'curl_setopt() failed. curl_errno: ' . return_var_dump ( curl_errno ($ch) ).'. curl_error: '.curl_error($ch) );
    }
    return true;
}
function ecurl_exec ( /*resource*/$ch)/*:mixed depending on CURLOPT_RETURNTRANSFER*/{
    $ret=curl_exec($ch);
    if($ret===false){
        throw new RuntimeException ( 'curl_exec() failed. curl_errno: ' . return_var_dump ( curl_errno ($ch) ).'. curl_error: '.curl_error($ch) );
    }
    return $ret;
}


function return_var_dump(/*...*/){
    $args = func_get_args ();
    ob_start ();
    call_user_func_array ( 'var_dump', $args );
    return ob_get_clean ();
}