有一个代码示例可以下载网页内容。
问题:硬盘上始终显示零长度文件。
我相信这段代码在许多情况下都有用,但我很有兴趣知道在我的情况下如何修复它。
<?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
的另一种方法可以正常工作。
php example.php
答案 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 ();
}