Unlink и SplFileObject - PullRequest
       38

Unlink и SplFileObject

6 голосов
/ 20 мая 2011

Возможно ли отсоединить файл от SplFileObject?

Я не вижу метода для закрытия базового ресурса, и дескриптор файла является закрытым, поэтому нельзя расширить SplFileObject с этой целью вразум.

Есть ли обходные пути?

1 Ответ

9 голосов
/ 20 мая 2011

Я бы не рекомендовал это, потому что 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(), спасая от неприятных побочных эффектов.

...