JRL*_*JRL 6 php file unlink splfileobject
是否可以从SplFileObject取消链接文件?
我没有看到关闭底层资源的方法,并且文件句柄是私有的,因此无法在考虑该目标的情况下扩展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);
Run Code Online (Sandbox Code Playgroud)
设置处理程序以便在所有引用都已用完时处理对象的清理.现在,我们检查清理处理程序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;
Run Code Online (Sandbox Code Playgroud)
该php_stream_free调用将为您关闭文件流.如果你取消链接文件,我不能保证PHP将如何处理试图关闭你刚刚链接的文件句柄.
您必须记住SplFileObject为您提供的内容:
SplFileObject extends SplFileInfo implements RecursiveIterator , Traversable , Iterator , SeekableIterator {
Run Code Online (Sandbox Code Playgroud)
它为文件提供了许多基于迭代器的接口.如果你unlink是文件,它应该迭代什么?您会注意到close()可用方法中也没有.如果你想做你所说的话,那么你最好把文件作为一种资源close()处理,你可以处理并使它可用unlink(),从而避免讨厌的副作用.