在 PHP 中,我应该在使用 file_put_contents() 时使用 fclose() 吗?
Posted
技术标签:
【中文标题】在 PHP 中,我应该在使用 file_put_contents() 时使用 fclose() 吗?【英文标题】:In PHP, should I use fclose() when using file_put_contents()? 【发布时间】:2017-04-20 00:52:26 【问题描述】:我正在使用 php 函数 file_put_contents() 将一些内容放入 txt 文件中。文档中的示例没有完成使用fclose(),我应该关闭文件还是没有必要?
我正在这样做:
$root = $_SERVER['DOCUMENT_ROOT'];
$log = $root.'/logs/logsContenido.txt';
$agregadoLog = "texto a agregar";
file_put_contents($log, $agregadoLog, FILE_APPEND | LOCK_EX);
仅此而已。我没有关闭任何东西。
我是否应该这样做:
$root = $_SERVER['DOCUMENT_ROOT'];
$log = $root.'/logs/logsContenido.txt';
$agregadoLog = "texto a agregar";
$file = file_put_contents($log, $agregadoLog, FILE_APPEND | LOCK_EX);
fclose($file);
【问题讨论】:
不可能在file_put_contents
上使用fclose
,至少在用户态环境中是这样。没有要关闭的流。
你都经历过吗? php.net/manual/en/function.file-put-contents.php - 一个实例显示 “很明显,这应该只在您进行一次写入时使用,如果您多次写入同一个文件,您应该使用 fopen 和 fwrite 自己处理它,写完后关闭 fclose。" 和 "这个函数和依次调用 fopen()、fwrite() 和 fclose() 将数据写入文件是一样的。"
"此函数返回写入文件的字节数,失败时返回 FALSE。" – 你希望调用什么fclose
on …?
【参考方案1】:
不,你不应该/不能。 file_put_contents
负责打开文件、写入内容和关闭文件。事实上,它不会向您公开任何句柄,即使您想关闭也可以关闭。
【讨论】:
我一直相信手册,但我注意到如果我运行这个 PHP-CLI 脚本: $test1 = get_resources(); file_put_contents($log, $msg, FILE_APPEND | LOCK_EX); $test2 = get_resources(); $test2 中还有 1 个资源(除了 stdin、stdout、stderr 之前和之后)。手册说 get_resources() 应该只返回活动资源。我的意思不是说 file_put_contents 有问题,可能是 xdebug 让我失败或 get_resources()? 没关系,如果我这样做:$resources = get_resources(); foreach($resources as $resource)fclose($resource); 我得到“fclose():提供的资源不是有效的流资源”。仍然不知道为什么 get_resources() 显示它【参考方案2】:在file_put_contents
中,PHP 会为您处理。所以没必要fclose
吧。
但是如果您使用像fopen
这样的句柄,那么您需要关闭它,因为您将在整个脚本执行期间保持文件处于打开状态。哦,完成后关闭手柄也是一个好习惯
【讨论】:
见@alex 的here another response:。他使用:file_put_contents("Tmpfile.zip", fopen("http://someurl/file.zip", 'r'));
,但他没有说是否应该使用fclose(...)
。但是我遇到了 HTTP request failed! 错误的不可预知的问题。以上是关于在 PHP 中,我应该在使用 file_put_contents() 时使用 fclose() 吗?的主要内容,如果未能解决你的问题,请参考以下文章
我应该对单引号使用 php 引号转义还是在数组中使用双引号?
在 PHP 中,我应该在使用 file_put_contents() 时使用 fclose() 吗?
在 PHP 中使用 MVC 时,1 控制器应该能够加载整个动态用户配置文件吗?