2017-01-06 168 views
0

有一個代碼示例下載網頁的內容。PHP捲曲從URL下載空文件

問題:一個零長度文件總是出現在硬盤上。

我相信這段代碼在許多情況下都有效,但我很有興趣知道如何在我的情況下修復它。

<?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日5時24分57秒)(ZTS MSVC14(VISUAL 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(); 
}