获得本站免费赞助空间请点这里
返回列表 发帖

[Zend权威认证试题讲解]第十二章 -调试与性能管理

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
7 K3 W% i! @* n. R# z( D要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。9 Y6 o, Q4 U3 i
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。0 C, S1 n4 Z7 Z7 h$ I. t* P: c

) i4 _- J5 ~9 U1 i* Z5 h
* L& _7 B9 b! j( W' ^, r问题
7 j0 |1 F# U# q$ b7 J
; r5 L1 t3 h+ w- X1.以下脚本如何用三元操作替代? ; k/ U% B) m+ C. F

  1. <?php
  2. if ($a < 10) {
  3.     if ($b > 11) {
  4.         if ($c == 10 && $d != $c) {
  5.             $x = 0;
  6.         } else {
  7.             $x = 1;
  8.         }
  9.     }
  10. }
  11. ?>
复制代码
8 Q7 G' n% L0 Q; U6 n9 r' s
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
$ w- M9 Y5 T8 O# K, x! lB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
8 x" G* K; q! c1 j- d: dC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;$ y( H2 e( a9 U3 U
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
! g+ h, H- F7 ^! C- EE.以上都不对* I: N; P9 r  z3 t; i* h  x
; e& e# d& F% k! {6 b" d+ v7 s3 x

8 S8 P6 h" Z% y, j; N' A. m. N2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选): g6 ?4 Z* K- p& K* u( \$ d6 e
1 M6 R0 c  m( _2 V) x3 h7 Q
A.安装操作码缓存(opcode cache)6 y6 Y  c! T" _9 p( h
B.优化或者升级你的网络连接
+ f, c' p) ]1 b9 |- ~- N" K0 _C.添置更多的硬件# W% W5 j+ E, A8 N2 ]: `3 T/ q. v
D.增加服务器的可用RAM4 ~& Q0 g" {, ?4 Y
E.使用连接缓存
* S: T, k/ ?8 n4 ^! s) M
  m8 i! n( G% U1 d4 W. O# w$ y
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
  _8 U4 H; ?. y% y. Q0 [! z8 Z. e" w* c7 `: [
A.关闭错误报告
: }/ @$ `0 m1 i  N" fB.打开错误日志
4 \7 N# e5 `3 U" NC.关闭错误日志  H: e; G  f3 k5 R
D.关闭错误显示% Q. q" H) W/ D# h8 E
E.使用@抑错符) d$ u2 n. z' j' b" [
% O( Y& c) _- }2 p1 c7 r; E. l
( }& m+ l, c7 [  {- j( m
4.______操作符能对操作数的数据类型进行严格的比较?
2 \' _; T8 k- ~7 a6 R& R( w, M, y0 j) N" k0 s8 _/ W$ \
答案:____________
. C6 {* ]; A* p+ V
! F2 r5 w7 v5 U! |# w, ?9 f% L, L
9 F4 ^1 Q+ O; \. l. l; Q5.操作码缓存(opcode cache)能做什么?
& n0 V) N" P% p2 ~
* I7 D$ N; t* Y# d2 M5 tA.把脚本编译成二进制对象,使它运行得更快) e9 c0 Z  ~' k2 z! D) M
B.代替Zend引擎加快解释器的运行
8 c+ j2 K( N& M) oC.缓存脚本输出以提高执行效率
6 s5 A: w) w! J, l2 M( u0 tD.缓存解析器产生的中间码,以提高运行效率" w; C# f! [& \! g  b8 J/ |# x
E.在内存中缓存脚本,减少从硬盘中读取的次数! e' |* b, l2 U  \3 b* O5 k

6 G8 J3 @8 [0 _% Z/ ]/ I6 J  X- {: s' Y( |: j' R
6.以下哪些情况容易造成系统资源枯竭?(双选): l& `! l3 d, L0 H
* \2 E, u1 `3 s* V
A.RAM太小
: u+ g8 z/ u' D% w" O/ Y& _B.使用了低带宽的连接
. J# C- U& R+ d5 \* s9 C2 c& NC.虚拟内存超过2GB
5 e, p0 [9 |3 f0 W+ A/ r8 HD.允许同时运行太多的服务器进程" \8 X! J4 L6 O7 P, k0 H
E.以上都不对6 z9 u! a% j$ Z# W4 `
- d& j0 P, g8 S8 ^6 V' ?! E% u
4 w4 t; d! f' |; W" o
7.以下脚本缺了些什么?(双选) 3 i( m& b$ `6 B/ X( x+ {, V

  1. <?php
  2. $rs = database_query ("select * from mytable where id = " .
  3. $my_id);
  4. while ($a = database_get_data ($rs)) {
  5.     var_dump ($a);
  6. }
  7. ?>
复制代码

! Q7 m" c0 ^& }' [, kA.参数出口(Parameter escapement)- a, L" H) }- o3 {. H" q4 a
B.输出格式化
1 w/ d" Z$ W6 a% C$ h# _' m0 ?6 nC.错误检查( ]6 x, @/ n# L  C5 A7 g+ X+ s+ K
D.一个SQL查询
2 R; _( k. {( Y; U( e  FE.以上都不对
7 F5 c$ A6 v' A' X7 f, C, Y/ v4 E9 G2 N* r5 _

& b. \. t0 l& }% D4 n8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)$ \( O  e2 L- c0 v2 B- m1 f

% H- Z0 }# r  k/ m; cA.E_WARNING5 o# J8 a, K( H: ?  j; w
B.E_ERROR
8 p+ ~4 O4 [/ j/ P8 E" R# WC.E_USER_ERROR
4 Q; R1 E' a! f6 mD.E_PARSE7 \0 k" D+ i' q0 D9 ~  Y
E.E_NOTICE
$ ?( q- ~& o. m, m- |) E: n. D5 F' _& i

8 A' h# I3 _# `6 d, o9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
# ?/ B; B/ {* S9 j
; O8 |: R5 V- ?# u( nA.把变量转换成int
- q7 B' H* `3 G1 ]1 TB.使用全等比较符(===)# J7 k  x0 j0 X& j3 f* `; g5 M* z
C.确保常量是第一个操作数& m9 Z' [4 t5 @
D.使用三元运算符8 Q, V0 F2 g+ [. C# |3 V# W# X" F
E.用括号把操作包起来
0 l+ `- k$ [- c7 y5 V9 A4 B& I" \9 I+ w3 y$ u+ b
/ \* g" y7 H8 E- g# D# u6 i
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
+ |$ P- ~% ?- ^" j
; k" I% i. x+ |4 `A.创建一个连接远程SMTP服务器的函数) ^/ H: P/ }6 `: b; L
B.使用mail函数
- ~# @' N9 ~- Y+ ]/ cC.使用error_log函数# E8 j/ S: Z) H5 |& [, b
D.调用sendmial程序
) C0 [' @% U0 oE.使用webservice) w6 h& p' y" `3 k/ X, H( I
* \8 w9 C  `3 b2 F% n
# p1 k9 ], n! Y+ f8 d) @
11.能否仅调用一个函数就关闭脚本内所有的错误报告?3 ^) U3 t1 T3 N5 E1 A. b8 `* W& r  I

. W4 C) X+ h, V# |$ G) M% LA.能
/ P7 e: M, N/ e$ y0 E+ k6 ZB.不能6 A' z' Q% J! {) X6 P- C9 O% }* N8 o

. ]9 r$ w7 E6 G* W! w. F
. x% ]8 i' ]* O12.概要分析器(profiler)是做什么的?; g8 L% u9 h# }* S- r: [

! N7 Y" J# N5 S0 n1 {A.创建关于脚本结构的档案
* Q( F3 l( n! `* ~+ v3 ?B.把脚本转化成UML图6 g7 \3 ?) w6 P4 [+ l7 v4 T
C.精确测算脚本不同部分的运行时间! G  |& z2 B) @7 d& I; r
D.计算脚本通过web服务器执行时的维度# ?* d6 l6 _( X- R
E.扫描脚本,识别由常见错误导致的bug
4 w4 X/ Z" Z- ?# Z$ p# C( j# b: L( _7 E5 H4 e
1 p! e3 B8 u6 E  o5 S* G9 i
13.______能帮助识别和解决bug。. R$ `+ _" h5 }( s& T  \9 j
% r& u  _: i1 u9 k: V# t
答案:____________3 l3 m2 w. D: R1 q+ f$ v2 S
, Q: n: J9 n1 {2 f; z0 N) h. H

! c/ m6 ^( _, p7 k! B14.trigger_error()和user_error()有什么区别?! l* x! D( W( R! X; J+ k2 S- S8 x1 D; t

6 Z& R* K7 D2 MA.trigger_error()允许脚本抛出系统级的错误* L  e9 w: v8 D& h( h3 ?
B.user_error()允许脚本抛出系统级的错误
% ]" r0 _& c# m" ^2 z2 \: xC.user_error()不能被用在错误管理器中
% p, i9 y* C, cD.trigger_error只在PHP5中可用: \- r$ U8 Y2 @6 a, R  K
E.没有区别/ g6 ]1 }: V" E5 T& d& Q/ [8 Y7 D+ I6 z
; B/ E2 N% |5 r5 a
6 w5 S& G' W/ A" v
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。( t" K% w4 ^, A  c7 O8 x+ ~: C6 X0 U. T

( S: Y  i" H: Z, jA.print_r
+ \' i$ ~2 q& y- U, z6 jB.var_dump2 R4 h3 ^+ ^! i. J
C.stack_dump
4 c+ A8 M0 b! m  C1 qD.debug_backtrace
; }* g* m4 x7 r8 AE.以上都不对
% i. y* y7 B+ E. U5 a
* W$ R1 t" b( q& `答案
- i& s. {# Q. N4 ?
0 z! y6 ~2 Z: f# k  `' {1 V1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
+ c8 N8 a9 R8 r7 j7 x0 I
. a; s' a- p% Q! c1 I0 B2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。, @3 A/ `( J8 A+ e
5 O# D; b. U9 r- W: n9 f
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。9 M. s* I9 [" u/ T
3 I6 z! C8 D  W) f; p9 U& B
4.这是在描述===操作符。
$ u4 [+ p  ?/ C& H1 j& Z; i% B% j2 n4 a1 k% y4 E
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
8 f6 U! D& Y/ [9 a  W$ X' e8 R( O4 G  u  H+ s; u4 p! K
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
( }; i/ T' P* q5 C% A8 p9 c& Q
) Q7 V, }7 e1 X; }% F" F4 r( P7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。& F& @( m0 `& }+ i2 \' n
$ o) i  f. J/ R0 ?
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
4 v6 b6 Q: j, O  o9 ~: S6 f  n- ^0 R+ H) `, s& D
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。0 f4 J* z8 U4 O( h( g1 r% n  |  H

! G8 x) R: W+ L$ G: j0 w) R10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
) l7 m, I) w1 J, u8 x$ V+ S6 R2 |% R  @" c
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
5 M3 S' [2 \+ j( }3 q7 |6 ?# N# m1 `6 f( b
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
$ o4 [2 p  M5 `. v6 B* q: Q6 \/ r6 ^! a- ]2 \
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
0 W9 G* F: R* M" R+ w- u/ B' L6 k0 b% C; t* V* V/ [- v
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
& z) P( {. p) i) v4 h4 V9 o) I' G$ g  D3 b* F. {$ l
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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