  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14249
- 金币
- 2415
- 威望
- 1647
- 贡献
- 1363
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
1 r# Y# Q }, h# J( c要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
/ _" D( }+ y8 S. y ^$ Q, O0 s; I本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。. N F0 \9 B$ i
. \. T; D& G1 t6 A8 d( k. q
" u4 G! e: v+ {* y4 C: ?" S; T+ K& Z问题* p7 J1 @4 _# p+ J6 ^/ K
7 ~- k1 W3 I, F8 {, @1.以下脚本如何用三元操作替代? 2 q: M* D1 N$ c5 X. J* I3 J% t
-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码
. G0 s8 l$ h) G% c$ G* yA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;0 _1 q) _( p$ d) i7 I, D: _" M
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;) J0 u# g8 N$ d; `: l
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;4 b# K) ?! ]' \9 t4 j
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0; J2 J& ]" ]) d L" K! D% W, _$ _6 S
E.以上都不对
1 ^: ?% ~* i* x! g/ T; I- E0 [7 l* O$ z, H( x; Q4 R4 E
: n7 I( s9 E* W0 O5 V$ \% C2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
: Q0 n. U; O4 I2 o2 d/ A. R G* k# a8 f
A.安装操作码缓存(opcode cache)6 H, x1 M( O* a, m c+ n$ g
B.优化或者升级你的网络连接4 w: u+ j1 [" Z: ?! l# w* j
C.添置更多的硬件: _" d. V% B' T; a& M0 d: \! ~
D.增加服务器的可用RAM
+ C! u7 \. S; p/ k$ N! fE.使用连接缓存
3 l9 K D3 c& V0 `
$ ^) \! o% |, ~" a7 y1 C
" s4 `9 Q; F' ~2 a. _; G3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
) q1 [; h7 V" X2 g4 D! y* U9 Q1 k ^6 n. q& L ]+ J# W5 }/ E
A.关闭错误报告
9 n u; A. R6 S$ h, fB.打开错误日志2 X8 i7 V4 S* ]! G9 D* C. p
C.关闭错误日志
( X! |7 J9 U5 G2 i4 U ZD.关闭错误显示
+ q4 H. r0 e4 E% Q1 M1 ME.使用@抑错符
0 F- o+ w/ D9 \; H6 C5 d) ~
& X, Y4 i' @ x9 N S9 X8 G6 u$ X. ^' a+ m# F
4.______操作符能对操作数的数据类型进行严格的比较?& a: M) s) Q1 Z) T
$ h* S8 K; A8 y, ~
答案:____________
, i) F: C d E& P
. b8 y8 E3 I7 h5 l1 s+ |
$ A. T+ W) H) ]6 C* j! N5.操作码缓存(opcode cache)能做什么?
i* p7 C' }, V: K+ d( T6 L1 }0 }, X. d t
A.把脚本编译成二进制对象,使它运行得更快6 {# [2 G/ S# C2 j1 } y+ J
B.代替Zend引擎加快解释器的运行
. y; X1 a# S6 [# j( l5 yC.缓存脚本输出以提高执行效率+ ?9 }6 q2 g- d, e* X4 s- n O+ ]
D.缓存解析器产生的中间码,以提高运行效率# m. b5 \3 b! `
E.在内存中缓存脚本,减少从硬盘中读取的次数8 ~9 P2 s6 D& Q& I; H h2 G1 {/ e- s
6 A2 \+ s A9 x; v8 [& v! f
: Q) `' y$ b+ ?' k1 y0 u3 g
6.以下哪些情况容易造成系统资源枯竭?(双选)$ T# n: N+ p% W- F
! u5 m0 l" ^( Q/ AA.RAM太小
% R6 Y- s% v4 q3 |4 kB.使用了低带宽的连接
: A/ J$ }. C5 cC.虚拟内存超过2GB8 o* m4 B- z5 t! v4 p
D.允许同时运行太多的服务器进程/ g1 M6 }5 a' W# n
E.以上都不对
& m8 I m3 Z9 d: t
$ l3 H& W$ @2 q: l- B% p. v: m; ]; _! p8 K4 C
7.以下脚本缺了些什么?(双选) ' g: t+ B7 K3 J' e
-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码
4 F0 F! E8 g! C6 n+ qA.参数出口(Parameter escapement). f% O9 m" J3 W: v. w0 k' K# g$ J
B.输出格式化
$ [! R$ o2 h) b$ d$ D- d9 GC.错误检查
+ w4 g: ?8 }+ OD.一个SQL查询+ O8 F. q2 w3 C. D
E.以上都不对$ p$ u/ y/ k- B. }" ?9 V& [3 l
& y) `0 C7 V; u5 E( R" j/ M
) B& f9 d7 Q4 U" L' k8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
5 {( |+ k' F! z$ c# [7 c# b! b+ T
5 }# [! j8 R/ ?1 F" tA.E_WARNING+ x9 V8 D4 g- |' Y8 u
B.E_ERROR
3 [5 _' J) q8 Y8 q; u3 Q. Q) cC.E_USER_ERROR! M. S& S% H6 l
D.E_PARSE5 {% Y7 z0 [5 S. g5 X' ]
E.E_NOTICE
4 t- w6 |. q' s' h* O5 L% R* p8 q; r0 O/ p
- i E- w3 G1 W# ]' l, B9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?& d( q! y1 N! S1 T; p
9 d4 q, x2 X4 Y6 N7 t2 SA.把变量转换成int- a4 t8 X9 V: N5 w
B.使用全等比较符(===), @1 P0 E" \1 B. v# S3 C# ] N
C.确保常量是第一个操作数 R1 C5 ~8 ?' d" u
D.使用三元运算符
; l# R$ P* g* XE.用括号把操作包起来
# {! H! T& e9 \3 o( O# [$ z4 Q' ~% O1 a. Q$ B( Y+ ~
) ^( Y/ m( [8 U9 y. ^; r10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?: |* Z* _5 [1 ~7 o& `
% V( P- ~! p6 Y xA.创建一个连接远程SMTP服务器的函数
, D. _& f5 L( s4 o3 XB.使用mail函数
+ Q& b4 O3 ^! i. e# m5 `+ XC.使用error_log函数
, s' W e* G* pD.调用sendmial程序3 F) Q* c. q7 i! A7 v _
E.使用webservice
; C r5 T1 x, x" {8 { j8 ]$ l: H8 Q! j' P; h, f+ g! {$ @$ b
0 k. z) l7 q, o
11.能否仅调用一个函数就关闭脚本内所有的错误报告?
1 m' j: F6 C" r2 E6 G- b- X$ r" d( N' J7 h" W
A.能
7 w: e9 S3 {3 C* PB.不能
. ^& n. ^7 d. A& v) h# o0 }! f3 W# Y; C. d& U
2 ^+ ~5 G& t" _+ V+ P12.概要分析器(profiler)是做什么的?+ v. X# ~+ Z8 ]+ `/ ^ v% u
; n. U# T; M1 x% |A.创建关于脚本结构的档案
3 a) c& N# S2 M6 c0 r: F5 SB.把脚本转化成UML图/ G1 u& d7 |: T3 L2 z4 Z
C.精确测算脚本不同部分的运行时间
2 ^: Z, |& W" e+ v( MD.计算脚本通过web服务器执行时的维度7 d& m/ N* |) Z
E.扫描脚本,识别由常见错误导致的bug4 b; S) {8 V% z) {" T
( w" Y4 n5 _7 w
" B6 K1 @7 ]& S# T. v13.______能帮助识别和解决bug。
; \3 C2 k" A5 Y A d. y( G: q/ p6 T3 E! Q
答案:____________1 v `9 H4 O0 |
8 S. b9 A- ~- O3 u( N5 i! {" C5 ]7 i6 f2 @
14.trigger_error()和user_error()有什么区别?
( F& t+ D8 }# I3 e+ G
+ \# @: s* W' JA.trigger_error()允许脚本抛出系统级的错误
8 ~8 @$ b1 I! ^6 x3 I+ @B.user_error()允许脚本抛出系统级的错误
1 s* [4 Z8 X6 B ^9 i) V: d+ X& LC.user_error()不能被用在错误管理器中9 |; t# W2 q$ Y. V+ }
D.trigger_error只在PHP5中可用7 J$ t) ^; F" j% v( E9 W5 P
E.没有区别
3 `9 C |% W: s& i! B, g+ U7 r. n' `1 P3 J. W1 \0 p
. l3 A2 |% T3 u" z2 y S" j n15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。8 f9 Q _% q5 F3 _0 I1 H
" o8 A! Q; v, N4 J5 N. H7 n! \9 S
A.print_r
; g* g9 o9 u/ r' a/ o8 B) \B.var_dump
3 r' U* V# {/ v) k% z! ^C.stack_dump/ M' j0 P3 N% @
D.debug_backtrace
: {6 N- `+ D* i+ D) _' D3 a, ?E.以上都不对7 H: R) P2 V* |$ H& N
: z8 \: U3 S1 C+ P5 e7 O答案/ J1 @0 I Q( z- f% ^' f! U. H' G2 h
8 X$ R0 Z" y' v
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
, E6 |" Y7 D3 E9 H! e2 T4 v/ _7 \7 E: |. b- u* G
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
! Y0 Z5 h" \% O" v, i* d- f$ N% L6 A! p- k" R
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。8 _; Y' R% ^# n: Z5 L9 @4 I
- B7 |( I8 x9 V. A7 B$ y4.这是在描述===操作符。- T: O3 J) Q I7 k" v
, F% q* e7 I. Z0 T* t
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
& `3 n# z% C! \
; E* G3 L0 }5 } p6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
w8 \/ C" ~6 k" N @3 q+ R4 _5 Q7 l, l2 _6 _* c5 [4 ?% Y
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
) a# s) x$ Z- s1 J3 @! C" O' O
- }" j5 B/ \6 ]/ A4 a, Z+ b/ c8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
; D9 H1 W6 v ~8 [ W. A1 I" n
6 Y% R4 B% l1 H! q9 ]4 H/ b' R9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
% h" I) A& D: i: w6 E
7 [0 p/ w+ V8 h8 _10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。; f! X+ r7 @9 ? ^
0 \% n% M: K( `" B3 p, W. R
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
) I+ A( h5 G' w1 {2 b3 [' a ^# _' [7 B5 {6 B6 [3 v9 {
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
9 F9 V2 d6 m& ?6 X0 E: Z
1 H/ ^. G0 o( D, ^9 q, Z13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。# ^, b9 w3 h+ E4 L6 J
; }3 F% g+ l0 U# y
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。+ D( J2 |4 k0 V& n) |
8 Q2 }9 @$ \5 R. s' I15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|