Heim >Backend-Entwicklung >PHP-Tutorial >So verwenden Sie die Streams und den Wrapper-Wrapper von PHP
Heute erzähle ich Ihnen von den Konzepten und der Verwendung von PHP-Streams und Wrappern. Lassen Sie es mich für alle zusammenfassen.
Wir wissen, dass das Konzept der Streams in PHP4.3 eingeführt wurde. Es handelt sich um eine Abstraktion von Streaming-Daten und wird zur Vereinheitlichung von Datenoperationen wie Dateidaten, Netzwerkdaten, komprimierten Daten usw. verwendet Dass dieselben Daten gemeinsam genutzt werden können, sind die Dateisystemfunktionen von PHP. Beispielsweise kann die Funktion file_get_contents() lokale Dateien öffnen und auf URLs zugreifen. Vereinfacht ausgedrückt ist ein Stream ein Ressourcenobjekt, das ein Streaming-Datenverhalten zeigt.
Lesen und schreiben Sie linear und können Sie überall im Stream suchen.
Stream ähnelt in gewisser Weise der Datenbankabstraktionsschicht. Unabhängig davon, welche Datenbank verwendet wird, werden die Daten über der Abstraktionsschicht auf die gleiche Weise verarbeitet Es spielt keine Rolle, ob es sich um eine lokale Datei, eine Remote-Datei, eine komprimierte Datei usw. handelt, solange es sich um Streaming-Daten handelt, ist die Operationsmethode dieselbe.
Mit dem Konzept des Streams wird das Konzept des Wrappers abgeleitet. Jeder Stream entspricht einer Art Wrapper. Der Stream ist ein Konzept, das aus der Perspektive des einheitlichen Betriebs generiert wird, und der Wrapper wird aus dem Verständnis abgeleitet Ein Konzept, das sich aus dem Inhalt von Streaming-Daten ergibt, d. h. wie unterschiedliche Inhalte mit dieser einheitlichen Betriebsmethode bedient oder konfiguriert werden.
Diese Inhalte werden alle auf Streaming-Art dargestellt, die Inhaltsregeln sind jedoch unterschiedlich, z als http Die vom Protokoll übertragenen Daten liegen in Form eines Streams vor, aber nur der HTTP-Wrapper versteht die Bedeutung der vom http-Protokoll übertragenen Daten. Es kann verstanden werden, dass ein Stream ein Rohr mit fließendem Wasser ist, aber was es ist Ausfließende Daten sind Daten, und der Wrapper ist ein Paket außerhalb der Pipe, das die Bedeutung der ausströmenden Daten versteht und diese manipulieren kann.
Im offiziellen Handbuch heißt es: „Ein Wrapper ist zusätzlicher Code, der dem Stream mitteilt, wie er mit einem speziellen Protokoll oder einer speziellen Kodierung umgehen soll.“
Wrapper kann verschachtelt werden, nachdem ein Flow mit einem Wrapper umwickelt wurde. Zu diesem Zeitpunkt fungiert der innere Wrapper als Flow relativ zum äußeren Wrapper Das am Ende von PHP selbst implementierte C-Sprachentwicklungsdokument hat diese Erklärung:
(Anmerkung des Autors: Der Originaltitel lautet: Unterstützte Protokolle und Verpackungsprotokolle. Die chinesische Übersetzung ist etwas irreführend. Um genau zu sein, handelt es sich um die unterstützten Protokolle und Wrapper. Auf der englischen Seite ist es sehr klar )
Standardunterstützung Es gibt einige Protokolle und Wrapper. Bitte verwenden Sie zum Anzeigen die Funktion stream_get_wrappers(). Sie können einen Wrapper auch anpassen und mit stream_wrapper_register() registrieren.
Obwohl RFC 3986 Folgendes verwenden kann: als Trennzeichen, PHP erlaubt nur ://, also verwenden Sie bitte das Format „scheme://target“ für die URL
file:// — 访问本地文件系统,在用文件系统函数时默认就使用该包装器 http:// — 访问 HTTP(s) 网址 ftp:// — 访问 FTP(s) URLs php:// — 访问各个输入/输出流(I/O streams) zlib:// — 压缩流 data:// — 数据(RFC 2397) glob:// — 查找匹配的文件路径模式 phar:// — PHP 归档 ssh2:// — Secure Shell 2 rar:// — RAR ogg:// — 音频流 expect:// — 处理交互式的流So implementieren Sie einen benutzerdefinierten Wrapper: Verwenden Sie fopen, fwrite, fread , fgets, feof, Wenn Dateisystemfunktionen wie „rewind“, „file_put_contents“, „file_get_contents“ usw. auf Streams ausgeführt werden, werden die Daten zuerst an das definierte Wrapper-Klassenobjekt übergeben, und dann arbeitet der Wrapper mit dem Stream.
Wie implementiert man einen benutzerdefinierten Stream-Wrapper? PHP stellt einen Klassenprototyp bereit, der nur ein Prototyp, keine Schnittstelle oder Klasse ist und nicht zur Vererbung verwendet werden kann:
streamWrapper { /* 属性 */ public resource $context ; /* 方法 */ __construct ( void ) __destruct ( void ) public bool dir_closedir ( void ) public bool dir_opendir ( string $path , int $options ) public string dir_readdir ( void ) public bool dir_rewinddir ( void ) public bool mkdir ( string $path , int $mode , int $options ) public bool rename ( string $path_from , string $path_to ) public bool rmdir ( string $path , int $options ) public resource stream_cast ( int $cast_as ) public void stream_close ( void ) public bool stream_eof ( void ) public bool stream_flush ( void ) public bool stream_lock ( int $operation ) public bool stream_metadata ( string $path , int $option , mixed $value ) public bool stream_open ( string $path , string $mode , int $options , string &$opened_path ) public string stream_read ( int $count ) public bool stream_seek ( int $offset , int $whence = SEEK_SET ) public bool stream_set_option ( int $option , int $arg1 , int $arg2 ) public array stream_stat ( void ) public int stream_tell ( void ) public bool stream_truncate ( int $new_size ) public int stream_write ( string $data ) public bool unlink ( string $path ) public array url_stat ( string $path , int $flags ) }
在这个原型里面定义的方法,根据自己需要去定义,并不要求全部实现,这就是为什么不定义成接口的原因,因为有些实现根本用不着某些方法,
这带来很多灵活性,比如包装器是不支持删除目录rmdir功能的,那么就不需要实现streamWrapper::rmdir
由于未实现它,如果用户在包装器上调用rmdir将有错误抛出,要自定义这个错误那么也可以实现它并在其内部抛出错误
streamWrapper也不是一个预定义类,测试class_exists("streamWrapper")就知道,它只是一个指导开发者的原型
官方手册提供了一个例子:http://php.net/manual/zh/stream.streamwrapper.example-1.php
本博客提供一个从drupal8系统中抽取修改过的包装器例子,请看drupal8源码分析关于流那一部分
流系列函数,官方手册:http://php.net/manual/zh/ref.stream.php
常用的函数如下:
stream_bucket_append函数:为队列添加数据 stream_bucket_make_writeable函数:从操作的队列中返回一个数据对象 stream_bucket_new函数:为当前队列创建一个新的数据 stream_bucket_prepend函数:预备数据到队列 stream_context_create函数:创建数据流上下文 stream_context_get_default函数:获取默认的数据流上下文 stream_context_get_options函数:获取数据流的设置 stream_context_set_option函数:对数据流、数据包或者上下文进行设置 stream_context_set_params函数:为数据流、数据包或者上下文设置参数 stream_copy_to_stream函数:在数据流之间进行复制操作 stream_filter_append函数:为数据流添加过滤器 stream_filter_prepend函数:为数据流预备添加过滤器 stream_filter_register函数:注册一个数据流的过滤器并作为PHP类执行 stream_filter_remove函数:从一个数据流中移除过滤器 stream_get_contents函数:读取数据流中的剩余数据到字符串 stream_get_filters函数:返回已经注册的数据流过滤器列表 stream_get_line函数:按照给定的定界符从数据流资源中获取行 stream_get_meta_data函数:从封装协议文件指针中获取报头/元数据 stream_get_transports函数:返回注册的Socket传输列表 stream_get_wrappers函数:返回注册的数据流列表 stream_register_wrapper函数:注册一个用PHP类实现的URL封装协议 stream_select函数:接收数据流数组并等待它们状态的改变 stream_set_blocking函数:将一个数据流设置为堵塞或者非堵塞状态 stream_set_timeout函数:对数据流进行超时设置 stream_set_write_buffer函数:为数据流设置缓冲区 stream_socket_accept函数:接受由函数stream_ socket_server()创建的Socket连接 stream_socket_client函数:打开网络或者UNIX主机的Socket连接 stream_socket_enable_crypto函数:为一个已经连接的Socket打开或者关闭数据加密 stream_socket_get_name函数:获取本地或者网络Socket的名称 stream_socket_pair函数:创建两个无区别的Socket数据流连接 stream_socket_recvfrom函数:从Socket获取数据,不管其连接与否 stream_socket_sendto函数:向Socket发送数据,不管其连接与否 stream_socket_server函数:创建一个网络或者UNIX Socket服务端 stream_wrapper_restore函数:恢复一个事先注销的数据包 stream_wrapper_unregister函数:注销一个URL地址包
相信看了这些案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
相关阅读:
Das obige ist der detaillierte Inhalt vonSo verwenden Sie die Streams und den Wrapper-Wrapper von PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!