我知道之前有过类似的问题,但我无法找到解决我具体问题的方法。 我有这个代码,它保存到一个文件,并在从浏览器运行时立即下载到桌面。但我需要它将它保存在服务器上。如何使用此特定代码执行此操作?
我是否需要将文件保存到变量中,例如先$files
?
<?php
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Disposition: attachment;filename=export_".date('n-j-Y').".xls ");
header("Content-Transfer-Encoding: binary ");
exit();
?>
答案 0 :(得分:2)
这是一些正常的代码:
<?php
echo "hey F4LLCON!";
?>
执行,它的行为与我们预期的一样:
% php output.php
hey F4LLCON!
现在我将修改它以添加输出缓冲并保存到文件并写入stdout(使用常规echo
调用!):
<?php
ob_start();
echo "hey F4LLCON!";
$output_so_far = ob_get_contents();
ob_clean();
file_put_contents("/tmp/catched.txt", $output_so_far);
echo $output_so_far;
?>
执行后,文件catched.txt
中的输出等于我们之前(仍然得到)stdout上的输出:
hey F4LLCON!
现在我将再次修改它以显示PHP 5.5中的生成器如何为您提供一个不需要牺牲性能的优雅解决方案(之前的解决方案要求您将所有中间内容保存在一个巨大的输出缓冲区中) :
<?php
$main = function() {
yield "hey F4LLCON!";
};
$f = fopen("/tmp/catched2.txt", "wb");
foreach ($main() as $chunk) { fwrite($f, $chunk); echo $chunk; }
fclose($f);
?>
我们没有将所有内容存储在一个巨型缓冲区中,我们仍然可以同时输出到文件和标准输出。
如果您不了解生成器,这里是一个解决方案,我们将回调“print”函数传递给main(),并且每次我们想要输出时都使用该函数(这里只有一次)。
<?php
$main = function($print_func) {
$print_func("hey F4LLCON!");
};
$f = fopen("/tmp/catched3.txt", "wb");
$main(function($output) use ($f) {
fwrite($f, $output);
echo $output;
});
fclose($f);
?>