2017-01-06 2 views
0

웹 페이지의 콘텐츠를 다운로드하는 코드 샘플이 있습니다.PHP curl이 URL에서 빈 파일을 다운로드합니다.

문제 : 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을 사용해 보았습니다. fopen + fread을 통한 또 다른 접근 방식이 정상적으로 작동합니다.

  • 윈도우 7
  • PHP 7.1.0 (CLI) (내장 : 2016년 12월 2일 5시 24분 57초) (ZTS MSVC14 (비주얼 C++ 2015) 64)
  • 그냥 php example.php
로 실행
+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(); 
} 
관련 문제