  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14221
- 金币
- 2401
- 威望
- 1647
- 贡献
- 1349
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。& _8 X- B* v. X+ p3 R+ A# ]
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
) G( S8 j5 @ Z- V3 N, h本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
$ y( `1 U( l% Q
5 z4 Q6 M s+ w9 P7 \( a; M2 g# G7 N0 v% u" `2 L
问题7 e7 M! v$ _+ n) i, R$ z
1 H m/ S! K7 l1.以下脚本如何用三元操作替代?
( j- q5 n b: m, n% C: m2 z-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码
, b$ e1 _) Y/ D5 H* j6 {A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1; Y+ n$ g9 R) v! L+ I2 \+ x4 c
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
6 a; x; S* Z+ M8 s* a+ ~( ^C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
1 S+ d9 }" {7 L2 N9 i9 g3 vD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;$ f6 n+ ~% l% i N' T6 z
E.以上都不对; Q5 H$ u5 b3 m. v# f r. Y
+ H' N! ]2 v: y5 n$ h& f
. \2 X: d: d' ]* y/ j
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
+ R: e/ q* @7 L" X! y# K3 i8 x2 {. e* |; A. M* z: T7 n
A.安装操作码缓存(opcode cache)! R4 \/ U1 N$ a# B9 r5 q+ I4 U
B.优化或者升级你的网络连接
% _9 ~. G9 v# T) T+ W( u! K/ a" ZC.添置更多的硬件
# J2 ?; u A$ K3 d6 [: ]9 @D.增加服务器的可用RAM
) h# t: y H' [: `; P6 jE.使用连接缓存! v) @' ?4 q" { r
) V. Y2 E+ V5 [1 _
. I' G6 V# i$ c$ F3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
, s6 ]' w: W+ j6 ?
: l' s' e) l8 q2 X0 g& v' BA.关闭错误报告: z" Z; k8 W* ]1 D& w- D x' Y
B.打开错误日志
& c& P2 L3 b/ z+ n9 M( p# K2 mC.关闭错误日志
6 }( ?* Y+ H2 ]D.关闭错误显示; v$ t( Q x" n6 I6 y6 D" w9 `" i
E.使用@抑错符
" x a g3 c" ]' Z2 c& f! w3 C7 s$ J5 Y8 ?7 A6 C) s, z/ Q4 [
, P8 [6 I% O$ t+ ^3 o4.______操作符能对操作数的数据类型进行严格的比较?+ p4 h {8 [. t5 r- y
/ a. N; ^$ I( q+ D! u
答案:____________
8 |, c+ ~4 Y. F5 H6 v2 J5 x1 s4 W2 |' W( O9 p5 B: @
; `5 n+ T, U# t1 U! I5.操作码缓存(opcode cache)能做什么?" K5 e3 L& v1 A2 {8 D( D
2 {1 P+ S* k9 N2 V6 z D1 n- gA.把脚本编译成二进制对象,使它运行得更快
% d$ n; I1 z" M5 rB.代替Zend引擎加快解释器的运行, B+ V* s$ F" }) m, D
C.缓存脚本输出以提高执行效率2 s, T- P5 o x1 r7 V& e- L2 E5 k
D.缓存解析器产生的中间码,以提高运行效率
; ?7 b+ j7 A- L0 NE.在内存中缓存脚本,减少从硬盘中读取的次数
/ y0 Q, z( O6 u- F: R5 R& M1 C' [: P7 b5 ?# q0 P
: t8 Z( `/ j. I4 X" I: @/ D& |# c6.以下哪些情况容易造成系统资源枯竭?(双选)2 Y' Q2 `4 Z' Q* y' {( A/ ^
w$ Q% K- Y, t( i) N S
A.RAM太小
7 N3 I# S2 o6 z0 D4 |" [) aB.使用了低带宽的连接
/ J6 e) A, i. w! b b, i& g4 |* n VC.虚拟内存超过2GB
* F# V Z; z ~" B. A A$ MD.允许同时运行太多的服务器进程
& A4 Z# n/ l" xE.以上都不对+ r w* d* k5 D3 {. O
# W+ ? d* d0 |9 Q* N m
. a8 ]/ w: [$ A" i7.以下脚本缺了些什么?(双选) ! e8 i* I$ S3 z* W
-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码 3 g/ ~( A4 e/ I3 n9 y9 t: B+ j
A.参数出口(Parameter escapement)
7 L; t+ b# u2 V8 VB.输出格式化$ E4 | V+ B" X* o' X/ W2 ]7 u
C.错误检查
, e# y9 r* E0 H8 | kD.一个SQL查询6 I) P' U1 B# g+ p; N
E.以上都不对
3 `, P; x) [2 M2 w
' V3 }& I) C9 H+ s" `2 y6 L' t
! y* y* d: g* h. r- c3 m! S- Z8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)3 ]" _' q# x4 O3 P
9 c. I8 Y+ V, L0 H4 n" y0 ]
A.E_WARNING7 E* L/ O N% b1 Q s
B.E_ERROR
9 ?( t2 L; m7 A0 vC.E_USER_ERROR
: B# `7 y9 R4 f. j: Z& M7 d5 GD.E_PARSE; @" w: y* Q. d6 |2 i! k( O
E.E_NOTICE M L! h1 t3 M
. v$ l" l( b% m t
" F" t. _( Y% B/ X! p( Z
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
( ~6 l/ [- Q# p/ s+ P5 a9 m c8 C* E& Q$ ]5 \' S
A.把变量转换成int# D1 ]. {3 N5 C$ L( E$ l/ R
B.使用全等比较符(===)
: e0 ~4 {. {" G8 eC.确保常量是第一个操作数
; j( C4 s7 S% m* GD.使用三元运算符
! A0 t( v5 _4 d+ {4 z VE.用括号把操作包起来
/ ~+ z; t9 |3 c. E8 _
4 n% T8 v4 S w( w
8 H, i' m; [. E+ y1 U+ S& Y10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
3 ~: y* w$ ~) c8 z' L5 }! f3 B; T4 |' d* |( ?/ L2 T3 S; ~# r
A.创建一个连接远程SMTP服务器的函数
5 P( q# ]9 \5 \1 V# cB.使用mail函数 s' o. V* a' x! @, Q
C.使用error_log函数
$ E% [, m {, |& G) C7 BD.调用sendmial程序
% B5 ?" p9 C- ^E.使用webservice
' `. f* v, w" ^! {1 \6 S/ u0 n0 W5 _, u1 L
o' W# C5 I( b8 V ?* P; x. _4 g; {11.能否仅调用一个函数就关闭脚本内所有的错误报告?- C$ r5 g( Y7 a \
6 Y3 Q/ V$ e4 z/ UA.能) v( D' N8 B5 X
B.不能
& {& \* i! ^9 w
; T6 M( `% B6 [5 D
6 n, Q' e2 |5 Y$ c$ W* q12.概要分析器(profiler)是做什么的?$ [! y8 e4 Q7 @- F: @- Z
! }- g( S7 J |. V! p/ G k
A.创建关于脚本结构的档案9 I1 `4 ]8 {7 @, J5 {* w$ s
B.把脚本转化成UML图% o" P$ s+ Y; ~
C.精确测算脚本不同部分的运行时间& J7 c/ E/ j, A
D.计算脚本通过web服务器执行时的维度
* P! E0 P2 l* o* D* {$ RE.扫描脚本,识别由常见错误导致的bug+ y( P$ A8 W5 C2 k
# N* Q! Q$ {! }1 k/ }2 s' a
3 ~$ }! W! U; a
13.______能帮助识别和解决bug。# q+ I) ?: N- U7 M2 h2 k4 f& `
O; I, }9 a- n- n8 m答案:____________
0 k' _5 u4 ]* j1 X4 l* X0 ~
; h0 N* F2 i4 O& q
0 X7 n4 Q o' V9 z14.trigger_error()和user_error()有什么区别?
7 C* O* E6 T: v7 [0 D0 [) B+ v; f7 S
A.trigger_error()允许脚本抛出系统级的错误
* {+ m( S1 A& V% l* d. JB.user_error()允许脚本抛出系统级的错误$ f+ s9 G- z0 c
C.user_error()不能被用在错误管理器中
! X1 f; p+ E, ^* ^+ j5 lD.trigger_error只在PHP5中可用
& a- Q0 A! c, k( f e+ h3 rE.没有区别
7 I- d9 V. W0 H/ Z# v
. ~' t9 V! |( D& ~* p) J3 c- D! I5 u
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。- O! n; ?* N+ C+ _# D: `+ V9 Z
+ H6 N) x( S$ T8 r' v$ MA.print_r; z. A, z& Y" ?3 R
B.var_dump ?/ R0 O) K+ J8 U
C.stack_dump
" y g) |) G) G5 Y3 T" XD.debug_backtrace" U2 |# ^5 l V6 p
E.以上都不对* t7 z3 t! d' j+ a5 \# E6 ^* G
& r5 h) P7 p4 v
答案
2 o6 K+ j3 X2 F$ Y
L8 _6 V' x( b( P1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
8 ?9 M* Z$ K" O) |( e! ^+ q; h3 [3 a/ C8 S8 w
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。+ `% D0 \; h3 X' r/ l7 u
5 D) Q2 K, J" @3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。( ~) R% y3 J. y. I4 M. d% M/ y- N5 }
' k9 e2 c/ ^, `( A1 J* k* F0 c4.这是在描述===操作符。
/ y$ E# l& x2 Y T- V3 a. t
9 ^) M1 |3 U1 V+ z5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。0 i- g# f# G; W; ?' v+ Y
" y8 _. D5 Q) u6 ?% Y' C6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
' S; u3 Z& R/ T6 R4 ]$ Q8 E
$ O( j0 n2 s8 @' C9 L4 L4 M7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。0 p! w2 T; U; q0 B+ x) \- y
: _$ r m/ b- h( O& U
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。% s8 ^) X: l2 S* ~% D
# N0 k+ f! d* X9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
: B0 n$ J. T. J0 e6 a' ~% d9 |3 Z
6 M, {3 ~" o. F+ D7 x3 w( x10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。. m* n n% _: m; E) I& R0 B3 V, \
/ c8 O, e* S \5 H- u11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
1 P/ h2 p5 E, F8 `# a$ H0 |
, ^2 d: [( l% ~8 p/ X12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。* H4 M% ~& j" N+ ~
0 y6 ?; s) A0 K9 A9 s8 u13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
* B( _' ] V) W. N4 ^
1 Q/ V( D+ F _- _1 t3 t14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
+ M8 z+ g( H9 R8 V+ w* `* q0 S6 @" _8 r7 X4 b& z% s0 }
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|