返回列表 发帖

[Zend权威认证试题讲解]第十章 - 流与网络编程

当要处理外部数据源时,PHP提供了许多不同的方式来与外部世界连接。这当中包括文件访问与E-Mail管理。然而,这两种机制的针对性都太强:文件管理只能处理本地文件系统,而E-Mail函数也只能解决网络连接中很小一部分的问题。& ~* W9 E6 j+ Z, b
要实现更多的功能,PHP提供了一种叫“流(stream)”的工具,使得处理任何文件形式的数据源成为可能。比如,“fopen封装器”能将外部服务器上的页面读入你的脚本中,这是使用流的最好的例子。它让你能够使用文件函数从英特网中获得内容。( W4 ?% z% ~+ i' S
最后,更复杂的操作可以通过socket编程实现,使得高层应用成为可能。
; k0 ?/ V( o5 H( Z  I本章考察你对这两个领域中知识的了解。
- e( {& t/ W' S( m" V7 `
# A+ [/ X/ J) c- y" S' L1 n
! I  M+ V. B3 r* \5 X9 g. E. B: P问题* f! {% k$ Y. k
, n. Z  z4 L9 `) B4 Y
1.以下哪一项不是合法的PHP文件资源?1 c7 O5 ]) v% y4 F8 s! b& n

) v% b6 V# v; J% P' B' LA.\\server\path\filename
3 e' y# Q* J. \  E- RB.http://www.example.com/index.php
2 Z$ \( R( ^( b+ }% U0 JC.myfile.txt6 R) k$ ~: i5 L, F
D.compress.zlib://myfile.txt
6 E: m; B0 z6 i) n0 XE.以上都不合法
& O7 ?2 Z& m  ^: G$ l/ G: V  }7 l5 [0 Q. ^. f8 h: d- d) h
1 w7 q" \4 x: W, L% ~& h- y
2.哪个函数能创建并注册一个PHP的流封装器?
, Z" u6 \2 s# a! G7 t9 m: A
) l7 j) n1 r1 i, v3 e2 _2 u# L6 T3 R% O答案:____________
- O  s: O: V: c  ^" [! H2 A' z
# B" U3 f) k  c7 i
9 X# k& O5 d, _/ g$ S+ H) o$ A3.用stream_get_meta_data函数,流API无法提供下列哪种信息?- {4 F# U5 `, M! m* I

5 I( t- A# `. wA.是否仍然有数据未读
% u5 r2 Q" I$ ^1 {' NB.流是否过期
! Z2 F. z* _7 h7 r, E5 ?3 BC.流是否被阻挡% \0 l5 k% u2 P
D.通过流传输了多少数据+ c* h: o: H: N9 m
E.流构建的成分9 |+ V. O& P' M" K5 h
. o# @  Q3 t! b. [* ~" n4 u7 }

$ D3 F  f2 p. d  r! g4.以下哪些是PHP支持的流传输方式?(双选)
! C! D  i: p5 M9 h8 H5 H3 D4 v2 C/ T+ m! {/ L8 C* r! Z
A.http  r! }$ h/ C  X) I. h, ?' X
B.STDIO8 E; `  a0 V2 H7 _  P
C.ftp
$ V/ _- G8 E) F6 OD.STDOUT
4 X& I0 M5 y7 i" Z* H0 O) oE.stream
. V$ p6 B3 n% j
* g# X, `7 s/ s1 u) J  M
! g2 A: S7 _: s' b5.Stream context提供了通过当前流传输的数据的信息,并能对以下哪个部分进行配置?(双选)& V+ a. [& Y- M- x: \# v
; U- d7 W9 C% Z& E1 N' Z* b1 A% R, B
A.流过滤器(Stream Filter)! E* |/ J4 M# l& ?" ]" T
B.流传输器(Stream Transport)
' u$ H' h1 R4 ?" W$ s0 G* KC.文件封装器(File Wrapper)
( v1 F& `" R* y0 w+ v; [0 DD.单独的读/写流
& [& ?1 E. @  L( HE.以上全部
5 K) [+ M2 i" |, N2 m- @8 u2 B: O( h9 G% R- @7 \1 q

( U7 O$ {1 O- _: t6.哪个函数能用来手动打开一个socket,来连接一台文件封装器不支持的服务器?" c3 K& x$ c9 ~, q% i$ r

6 s9 H" |$ m  W+ s, s答案:____________6 y2 M, k# F4 b2 o$ T
* e  l$ d# ^4 T/ [+ \8 V! M
# N( r3 k5 r& o$ K8 t
7.PHP不支持以下那种传输协议?
$ o; t; X1 k1 z+ u. X3 M6 w+ p- N5 [
A.tcp
9 Z' _9 o! j( C$ B" k$ aB.udp
- v1 g4 p( c# LC.udg
7 w/ s- z5 ~- K0 d; j9 XD.pdc3 _7 [) n- i9 f, \' [' X
E.unix  I- U( K! b) |9 j8 {4 o; p& A- l

: J0 l" h* }5 U+ ~* ~6 k( V+ O3 v4 `
8.假设你需要通过tcp周期性的向一台服务器发送数据。时间间隔不确定,你必须能在发送完成后立刻进行下次发送。而你的脚本还需要在传输间隔中完成其他操作。你在编写脚本时发现,如果服务器响应时间过长,则经常要在fread()上等待,使得其他操作无法正常进行。如何解决这个问题? ! T8 c4 N) u$ P
9 s" W6 T7 T! e# r) G
A.降低max_execution_time,迫使fread()减少等待时间
" z0 g" b& @; q% w# RB.调用fsockopen()进行连接时,降低超时等待的时间! K: I* f& ~5 \( q0 Q  c8 s! c7 u, u
C.关闭socket阻隔
# S3 {3 l  W, I1 k# Z3 f+ ZD.打开socket阻隔: }" |/ W8 I' f+ ]4 O! ^3 c
E.以上都不对
: f- R3 |. E5 V7 U6 ]' v& k' q( Y5 O$ E
$ ~6 U0 l3 ~( E' Y
9.处理socket超时时,连接超时与读写超时可以分开设置。哪个函数能实现这个功能?: V7 T5 l6 O+ d! i. P; K7 k0 U
1 ]) E* @7 L  W2 q7 Q, D
答案:____________
8 }+ I) g) m& k( f9 v
; |& W4 a. ]+ H8 T& M- r( [4 S, N4 h+ }) F
10.假设你需要编写一个脚本,用来通过任意一个流读取文本数据,并用另一个ROT13编码的流写回。编码必须在用第二个流写回时进行。怎么做最合适?! |, o) b2 `' k8 U; ?

# ~" N. h: c  N6 U/ N1 s9 r9 iA.把编码后的数据存在临时变量中,把这个变量写入流) Y) r! y" P) {( U. X. Z- o" d3 G
B.用流过滤器即时编码
' N1 `" h! G7 d+ U0 [C.创建一个ROT13查询表,然后一个字符一个字符的即时写入
0 z" U; n7 |4 q+ m5 g; r( C- KD.ROT13无法即时编码
6 f8 N) ]. a1 K" VE.以上都不对" }& H  N2 N- b3 c' q/ j

  n9 u2 J- Q: U5 r  G) _
. z* W$ [& [( \2 \2 _6 G11.以下脚本输出什么?
5 V# P9 x6 i8 s$ ~2 |! b8 H  ?( r
  1. <?php
  2. echo long2ip (ip2long ('127.0.256'));
  3. ?>
复制代码

* f* x" g* u' S2 qA.一个警告4 F  N! c4 v1 Y3 w! Y& a
B.255.255.255.2554 m6 P! r. _3 T5 ~/ m
C.-1( v" I5 F  h' I5 i1 Q
D.127.0.1.0  N+ _: `) Q1 z
E.127.0.256.0
+ r2 f4 E" K6 ?' u* I" ^& l+ z: t1 X3 D4 z- b* n
" ~& R: k- j% S3 _. Q& o- P! Y6 r
12.以下脚本输出的是什么?
. `' o0 W% S/ ^5 {, d" L
  1. <?php
  2. echo getservbyname ('ftp', 'tcp');
  3. ?>
复制代码

) t, A8 P! I2 i: Z7 L" tA.本地FTP服务器列表
, I' o% m4 `- ^6 uB.名为“tcp”的FTP服务器的地址4 I1 F9 U' [* v/ y
C.与TCP服务器相连的名为“FTP”的端口6 \  J. B/ Y3 U* O9 z6 x: B4 `
D.除了FTP以外所有服务的端口列表& N& P8 h3 A/ c$ T5 o3 C3 t7 h3 L
. b8 a0 a4 r' m0 w6 M; T

! Z- G- C- J8 X1 a9 S+ u13.gethostbynamel函数有什么用?3 k/ F+ k! X& n( X: ]3 @  t
9 w+ b+ h, U. {: p
A.返回某个主机名的IP
0 T+ y% C) T+ D- W. PB.返回某个主机名的所有IP列表
, F/ ?& K: M, L- u$ VC.以长整型数的形式返回某个主机的IP
, F- F" l& @) k4 K% V1 YD.以长整型数的形式返回某个主机的所有IP列表
/ B$ ]. G7 M7 I1 [* E/ L! A0 KE.以上都不对4 l8 Y/ f* }* E' C, C: s

4 ]" |6 \; S! Q" O" P$ n) ^! l. L& |$ `% l7 e6 T; n
14.以下那种操作不能用ftp://流封装?(双选)0 S1 w$ }1 I* H# m/ P  F

" ^4 q) q7 j' F' n& K6 L$ i6 Q2 MA.读取文件
% t4 N# P6 L7 ?- e: ~9 wB.写入文件  P$ Y0 B8 r& X9 b, s& a9 `
C.建立一个稳定的连接并改变当前目录+ l' V* G& G& }7 f) }( n2 Z
D.创建新目录: m& U, V# b2 c( F# Q$ D  u

/ l( X+ B+ V! {# @: j
" u2 g; Q, V( A' `15.如何创建一个自定义的流处理器?8 _" e, P4 c: T0 i' J5 L1 x
/ ]7 c7 I! r: R
A.调用stream_wrapper_register()函数,并定义一个进行流操作的类) g' x, N& H  E$ z3 h% ?: |4 l
B.用stream_wrapper_register()注册一个处理函数
) G# }* f6 R1 U1 T+ e" ?- y8 EC.创建一个和要处理的流封装器同名的类,并用fopen()打开
8 f! |5 U  s6 o( ~: GD.用stream_load()加载流封装器' ~. V( B8 w  `
/ h! \. T( m6 u8 h5 e
0 p9 e: [6 c# q( R/ b
0 _& r! B4 F- \3 \" s- @% B
答案速查
3 d- H% C5 P; u/ J6 c: k& c! I5 }1:E
/ l8 o' t. Q0 s( F/ C2:stream_wrapper_register; k% ?8 T8 A. q
3
) m8 c; s6 L" ~( W) m+ m4:BE
( @2 @$ U/ H! g- p. ?/ Y5:BC
3 J4 J# F* X; W# B6:fsockopen
2 h0 B8 x9 v, E1 Z6 |7
, x# E/ \# d, o9 z, U, F8:C
/ f! Y2 Z9 w9 ?1 Q7 t1 K6 H' x9:stream_set_timeout; I0 d+ j: _) r+ W1 {
10:B" b/ Z: n- G1 x% B: i/ s
11% G& I4 O+ E6 q+ e& v) ~( H1 g- l) C5 _
12:C
: o, B1 t9 c( v" ]13:B
* Q# f- X$ t; r# G$ Y14:CD) z6 ]7 H9 y; r5 q* G
15:A
/ v; t4 e5 P9 v) l" a$ P0 W
& O8 e. J& L- J& Z% J7 k! M! K" c) {& [! P' H% J
5 d# w7 G% Q! c2 c$ H$ m, \8 O
答案
5 O6 ~9 p& ^) {7 |$ V5 r! m: p5 ^) N
1.正确答案是E,所有选项都是合法的封装器。PHP中,几乎所有的文件访问功能能用选项中的任何一种方式来操作本地和远程文件。
6 z) N  }" I; M& \6 ~4 P4 V$ ^5 Y8 Y! x  n0 s" g: t
2.stream_wrapper_register函数用来注册一个用户自定义的文件封装器(以类的形式创建)作为封装协议。它需要两个参数:新协议的名称和操作它的类的名称
! e# e6 Z3 C/ S
2 H/ T9 `, \( P- x3.正确答案是D。stream_get_meta_data函数无法告诉你通过流传输了多少数据——它只能告诉你还剩多少数据需要传输。/ ?- n8 w5 M9 l' _3 I; H
1 B3 I  P- l6 x4 Y8 z
4.正确答案是B和E。PHP只支持两种流传输(本地操作用STDIO,远程操作用stream),并且将根据创建的流的类型来自动选择合适的传输方式。5 a) h+ X$ r) \+ Y% D$ {) @1 b
% R2 W) K1 v9 C0 ?
5.答案是B和C。Stream context能用来修改当前文件封装器或者流本身传输的行为方式。通常不需要创建stream context,因为PHP已经能够很好的处理相关问题了。
; g* q* |% A9 x9 l0 u0 ?- S: d4 c, O1 |! h" p! `
6.一般都用fsockopen函数来打开一个指向PHP不支持其协议的服务器的端口。这能就能让用户自定义的文件封装器与PHP不支持其协议的服务器进行连接。
/ I) n; L% X- g  u. {" T; u9 t5 \1 z  f' Z
7.答案是D——pdc,它不是网络传输协议。在选项之外,PHP还支持安全传输协议,比如ssl和tls。+ |8 x7 q3 S! y/ B- T7 S( m' d8 c6 R

. |9 T! {; k3 C" J2 k6 C* m  [7 Y8.正确答案是C。默认情况下,fsockopen函数创建的socket的阻隔是打开的。这意味着任何读写数据的操作将“阻隔”其他操作,直到当前操作完成。阻隔关闭时,如果没有数据需要fread()读取,函数将很快返回,你就可以做其他的事了。
* R4 `/ s) c1 d( S% l; k7 q
; d& q' ]5 J/ z( w9.要调整socket读写数据的时间,你必须使用stream_set_timeout函数。不能分开设置读和写的超时。不过,请注意,调用fsockopen()时,流的超时设置不影响连接的超时设置。
, u% d9 F! U) W3 M; |# O
" g; d+ f4 Y3 s9 Z4 }10.正确答案是B。流过滤器(stream filter)能应用在任何流上,并且能对数据流同时进行多个操作。举例来说,可以给一个流同时添加ROT13过滤器和base64过滤器,来合并成base64/ROT13编码。2 A+ O9 h: ^( w" s
& @- s8 u5 j) A, d% y
11.答案是D。ip2long函数将字符串127.0.256转换成合法的IP地址127.0.1.0,long2ip()的功能正好相反。这是检查一个IP是否合法的有效手段(PHP手册里就是这么说的)。
. B" L; f4 O0 v  I5 x# m8 d" z5 N. K- r
12.答案是C。getservbyname函数返回特定服务器的端口和协议——这里是FTP和TCP,通常在21端口(并不总是这样,你可以编辑服务器配置文件来改变这个端口)。
4 O7 z1 i5 E7 h: X+ X  P/ C1 q! B! W) ^# \. K+ a
13.答案是B。gethostbynamel函数返回一个包含某个指定地址的主机下所有IP的数组。- T% @+ B* t, @

! [) T# J+ l! V" w3 w14.正确答案是C和D。ftp://流封装器能从FTP服务器读写数据,但不能改变当前目录或新建目录——FTP客户端才行。
* d1 U5 o; g0 m" b
3 _8 @. h0 P1 @6 y% O# P2 J15.答案是A。stream_wrapper_register函数能注册一个新的流封装器,它需要接收用来操作流的类的名称。

返回列表
【捌玖网络】已经运行: