2017-01-06 18 views
0

Webページのコンテンツをダウンロードするコードサンプルがあります。PHPカールURLから空ファイルをダウンロード

問題:HDDには常に0のファイルが表示されます。

私はこのコードが多くの場合に機能すると信じていますが、私の場合はこのコードを修正する方法を知っています。

<?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を試してみました。もう1つの方法は、fopen + freadで、正常に動作します。ただphp example.php として実行(ZTS MSVC14(ビジュアルC++ 2015)のx64)

    • のWindows 7
    • PHP 7.1.0(CLI)(2016年12月2日5時24分57秒を建て)
  • +1

    転送後にHTTPステータスコードを取得できますか? 'curl_getinfo($ ch、CURLINFO_HTTP_CODE);' – BradzTech

    +2

    'CURLOPT_BINARYTRANSFER'は冗長ですが、その行を削除しても差はありません。 'curl_exec()'が返す値をチェックしていないのはなぜですか? –

    答えて

    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(); 
    } 
    
    関連する問題