php - 取消链接和 SplFileObject

标签 php file unlink splfileobject

是否可以取消文件与 SplFileObject 的链接?

我没有看到关闭底层资源的方法,并且文件句柄是私有(private)的,因此不能以此为目标扩展 SplFileObject。

有什么解决方法吗?

最佳答案

我不推荐这样做,因为 PHP 会在后台为您关闭文件。如果您查看 php src,ext/spl/spl_directory.c:

retval.handle = zend_objects_store_put(intern, 
  (zend_objects_store_dtor_t) zend_objects_destroy_object, 
  (zend_objects_free_object_storage_t) spl_filesystem_object_free_storage, 
   NULL TSRMLS_CC);

设置了一个处理程序,以便在所有引用都用完时处理对象的清理。现在,我们检查清理处理程序:spl_filesystem_object_free_storage:

    case SPL_FS_FILE:
        if (intern->u.file.stream) {
            if (intern->u.file.zcontext) {
/*              zend_list_delref(Z_RESVAL_P(intern->zcontext));*/
            }
            if (!intern->u.file.stream->is_persistent) {
                php_stream_free(intern->u.file.stream, PHP_STREAM_FREE_CLOSE);
            } else {
                php_stream_free(intern->u.file.stream, PHP_STREAM_FREE_CLOSE_PERSISTENT);
            }
            if (intern->u.file.open_mode) {
                efree(intern->u.file.open_mode);
            }
            if (intern->orig_path) {
                efree(intern->orig_path);
            }
        }
        spl_filesystem_file_free_line(intern TSRMLS_CC);
        break;

php_stream_free 调用将为您关闭文件流。如果您取消链接该文件,我无法保证 PHP 将如何处理尝试关闭您刚刚链接的文件句柄。

您必须牢记 SplFileObject 为您提供的内容:

SplFileObject extends SplFileInfo implements RecursiveIterator , Traversable , Iterator , SeekableIterator {

它为文件提供了许多基于迭代器的接口(interface)。如果您取消链接 文件,它应该遍历什么?您会注意到 close() 也不存在于可用方法中。如果您想按照您所说的去做,那么您最好将文件作为一种资源来处理,您可以在其中 close() 句柄并使其可用于 unlink() ,避免严重的副作用。

关于php - 取消链接和 SplFileObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6066145/

相关文章:

php - 与本地存储的 session

javascript - 如何在 PHP 中显示和解析查看者日期/时间而不是服务器日期/时间的存储变量?

node.js - (node.js 模块)sharp 图像处理器保持源文件打开,调整大小后无法取消链接原始文件

android - 如何取消应用程序与 Admob 的关联

php - 在 PHP 中为特定变量创建一个表 (MySQLi)

php - 将日期从一种格式转换为另一种格式

database - 什么是更快的数据库查询或文件写入/读取

c - 将新行写入文件

java - 如何读取/写入jar中的文件

php - 当我尝试删除图像 PHP 时 unlink() 不起作用