: Z, I9 y6 ^! p' v8 ~$ M15.如何创建一个自定义的流处理器? 7 ^) a' N6 G: n0 n. B- j! i) ~+ }6 p: q* o! j6 }2 F7 Z
A.调用stream_wrapper_register()函数,并定义一个进行流操作的类 # D' e* W1 D9 X( IB.用stream_wrapper_register()注册一个处理函数 8 ^0 k9 a( w. X7 L! q; bC.创建一个和要处理的流封装器同名的类,并用fopen()打开 % E8 A( \$ }; vD.用stream_load()加载流封装器" M% y" G) ?, V$ m9 z# h
2 i" m& `: ]& R4 L0 [
- n1 y8 Z8 v. M% Q2 H- [$ \5 e, T# u: ~2 u: ]
答案速查 ! `# H- [! n% l1:E7 F" \. s z0 G' E8 p
2:stream_wrapper_register 2 P; [, c1 R% _1 ]% ^# K: A4 W3 9 I& S: \- ?+ F7 C4:BE4 S/ y$ ?5 ~; L( W0 N
5:BC: W3 Q) V+ [ h6 z P. t1 Q
6:fsockopen - m: }. l! ^3 g, Z. H% s9 t# S* p7& ?* j! W' o; \/ }' h4 H2 S
8:C / {6 _, N9 f6 _; C* n5 ~9:stream_set_timeout+ [7 l, o0 m# Y0 F: ]
10:B - a4 a% u+ X+ F! l114 b9 X$ k9 q/ P. R! c# y
12:C ; q/ ~1 R- O9 e# r. w0 q13:B7 S' U' V5 |" E1 u. v/ m
14:CD. i7 E2 i( }+ P0 Z; s, _
15:A # ]. i L( Q( w" V" i8 ~! |- V/ E0 d
* ]! V; [& G& s- o5 k0 P' f! _4 l' K4 b' X% ]
答案2 a# |# v. `: O# t3 t, z
* u9 {& i4 _$ G
1.正确答案是E,所有选项都是合法的封装器。PHP中,几乎所有的文件访问功能能用选项中的任何一种方式来操作本地和远程文件。) A$ O3 ^ j- B: y. C4 H9 M
1 f9 F& A! B1 W' x6 \& `8 H o/ K2.stream_wrapper_register函数用来注册一个用户自定义的文件封装器(以类的形式创建)作为封装协议。它需要两个参数:新协议的名称和操作它的类的名称 0 t0 r6 }8 C. o % e& Q: t1 M! R' Q3.正确答案是D。stream_get_meta_data函数无法告诉你通过流传输了多少数据——它只能告诉你还剩多少数据需要传输。" `9 h+ S+ q3 h( I7 ` k- G! }/ }
% K/ A: u0 j6 \( U \
4.正确答案是B和E。PHP只支持两种流传输(本地操作用STDIO,远程操作用stream),并且将根据创建的流的类型来自动选择合适的传输方式。 ; l. {+ l# ^5 Q$ N1 a4 \0 ?7 E $ l s/ o2 _* P/ T, q6 k" \( s5 ~5.答案是B和C。Stream context能用来修改当前文件封装器或者流本身传输的行为方式。通常不需要创建stream context,因为PHP已经能够很好的处理相关问题了。 ; I# j/ o8 H1 t( _# w k' _ * n: Y k6 }/ `( j7 E2 _8 S- ~% [6.一般都用fsockopen函数来打开一个指向PHP不支持其协议的服务器的端口。这能就能让用户自定义的文件封装器与PHP不支持其协议的服务器进行连接。6 W" `' F% f0 k' A f T3 E; l
* O1 |; G& |. i& E" G
7.答案是D——pdc,它不是网络传输协议。在选项之外,PHP还支持安全传输协议,比如ssl和tls。5 f+ H- o" x& S! n L( p% [5 C
3 ~, ?5 Q. @: s8 A
8.正确答案是C。默认情况下,fsockopen函数创建的socket的阻隔是打开的。这意味着任何读写数据的操作将“阻隔”其他操作,直到当前操作完成。阻隔关闭时,如果没有数据需要fread()读取,函数将很快返回,你就可以做其他的事了。0 O; N8 e; Y) x/ O: J; V: ~
! e9 i$ O7 i1 c+ j# t
9.要调整socket读写数据的时间,你必须使用stream_set_timeout函数。不能分开设置读和写的超时。不过,请注意,调用fsockopen()时,流的超时设置不影响连接的超时设置。$ B) p- a/ \0 I' l1 ~! P5 f- M+ M
% [/ N' U% R) M. T( W0 ^4 ]
10.正确答案是B。流过滤器(stream filter)能应用在任何流上,并且能对数据流同时进行多个操作。举例来说,可以给一个流同时添加ROT13过滤器和base64过滤器,来合并成base64/ROT13编码。 . L/ y/ L) o; F/ l 2 i/ |( d E8 e3 l) c/ l W' Z11.答案是D。ip2long函数将字符串127.0.256转换成合法的IP地址127.0.1.0,long2ip()的功能正好相反。这是检查一个IP是否合法的有效手段(PHP手册里就是这么说的)。 l- `" U. x# |
4 R( c5 v1 I8 ~; `% z
12.答案是C。getservbyname函数返回特定服务器的端口和协议——这里是FTP和TCP,通常在21端口(并不总是这样,你可以编辑服务器配置文件来改变这个端口)。 8 w5 t: j7 ?. Z+ M& J/ V2 H/ O$ d 8 b$ T; u! D) y, O, i( z2 X7 u13.答案是B。gethostbynamel函数返回一个包含某个指定地址的主机下所有IP的数组。 & f% Y- j4 d9 u2 e" m- Y( O; `. n* d
14.正确答案是C和D。ftp://流封装器能从FTP服务器读写数据,但不能改变当前目录或新建目录——FTP客户端才行。$ f; a( K1 j1 D: I1 w
; d$ { M# p# O+ {
15.答案是A。stream_wrapper_register函数能注册一个新的流封装器,它需要接收用来操作流的类的名称。