是否可以取消文件与SplFileObject的链接?
我没有看到关闭底层资源的方法,并且文件句柄是私有的,所以我们不能在考虑到这个目标的情况下扩展SplFileObject。
有没有解决方法?
答案 0 :(得分:9)
我不推荐这个,因为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 {
它为文件提供了许多基于迭代器的接口。如果您unlink
该文件,它应该迭代什么?您会注意到可用方法中不存在close()
。如果你想做你所说的话,那么你最好把文件作为一种资源来处理,你可以close()
处理它并使它与unlink()
一起使用,从而避免讨厌的副作用