返回列表 发帖

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
* s; p$ ?/ m6 Y3 R( ?. x要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
2 w: n: c/ p0 i  f: u- ]- ~本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。0 A! M; |' G9 o0 k
# g8 T2 ^9 ~8 Z* @8 H8 s3 h

8 L2 v# f3 x9 K- M问题
5 G+ `+ ], Z4 B8 }; U+ B' v
. A8 |* E( O1 D. b1.以下脚本如何用三元操作替代? , a/ d4 q$ M+ j* [# k

  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. ?>
复制代码

) g# W9 u' g! Z# c- @A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
* a, w* L$ H  S/ KB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;! `# b. M/ F! L, d$ @
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;& `  B" |5 |- H, {
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
( t8 @3 q& j! j/ a9 t" aE.以上都不对
2 d0 R: ^& d) x- T; x, t1 z+ s6 h; ], t

" u0 c5 s5 }! S6 l2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
' A" r7 \4 z% z6 d7 M! ]. \, y) R5 G$ d" ?  H$ v) K% v- K
A.安装操作码缓存(opcode cache)! T. W3 i; r& O! `; @, r5 t5 O9 j
B.优化或者升级你的网络连接
; m: U  Q% W) \6 C  vC.添置更多的硬件
8 b9 \. n. `' p/ {; u5 e" ^- nD.增加服务器的可用RAM/ u7 p+ c! G* x$ {, B5 G: [) G3 @- k
E.使用连接缓存
+ j0 z8 \9 F8 z" u! Z3 Q% _0 ~2 y+ O& \  ?
2 a9 _6 r  ?' E# G9 S- v
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
+ O+ }) n$ a5 {* [+ B  V. e0 o3 F$ A# W6 v' j# y1 S! }4 k
A.关闭错误报告
- X" E7 y- B* F# mB.打开错误日志6 O3 N1 k6 k! P* N3 A5 }
C.关闭错误日志
5 a  M4 c) |' N0 OD.关闭错误显示( K5 Q. F6 e- _$ @6 M" c& f1 n
E.使用@抑错符
5 U7 ^3 N6 }2 E, B
+ h2 }4 W# v* \% |7 W8 A- e' V
4.______操作符能对操作数的数据类型进行严格的比较?% O' i& j$ G1 F  R! S% |8 Q
, }5 j7 Z# s' T" M" Q* t; U
答案:____________9 j7 o* L, D0 T1 N3 I
  ~: W4 |6 p. U% S# p- P
* k! p# V$ X0 V6 Z) e
5.操作码缓存(opcode cache)能做什么?" M$ q. U4 B0 M# l; y/ p

+ r( g, g3 N/ K+ [: f* w% p6 AA.把脚本编译成二进制对象,使它运行得更快
3 `2 d6 Z8 u$ p6 c" F# ZB.代替Zend引擎加快解释器的运行
2 [7 {* S$ i/ j% tC.缓存脚本输出以提高执行效率) ]! }4 k8 G, H( \
D.缓存解析器产生的中间码,以提高运行效率/ h% O& |' J8 F
E.在内存中缓存脚本,减少从硬盘中读取的次数
# x8 ^8 R8 f. A1 _3 G, b/ i0 |/ M( B  W8 H$ R

  i' ?7 ~2 h" V1 e' v6.以下哪些情况容易造成系统资源枯竭?(双选)0 h; f0 |  X- [! l  e6 n
2 z& t4 D5 Q6 H; ?
A.RAM太小* ?4 f. C0 f3 O
B.使用了低带宽的连接
# ?9 L& Y  x% m- `C.虚拟内存超过2GB
; m7 [- z7 |& W9 f+ H# ^3 T; \D.允许同时运行太多的服务器进程
- K. h0 {" U3 D/ r7 [6 L% e2 g8 ]E.以上都不对+ X! H; P$ O8 {

5 Z) s# ~9 r# g5 W5 Q$ `, {/ J7 d: j+ y/ j4 r. w4 u2 f, N( e/ V
7.以下脚本缺了些什么?(双选) * r- u; `# G; P& Y

  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. ?>
复制代码

, d" y: @  ]4 FA.参数出口(Parameter escapement)
) k& H1 C$ \2 A6 y3 ^6 EB.输出格式化
: f7 o1 i2 U2 ]8 ^0 N$ b' SC.错误检查( `8 Z- D- x3 y+ u0 y5 T
D.一个SQL查询5 r" B- I  @: v' ^  h" {
E.以上都不对5 {* M) r6 R9 a: H6 K2 @
( `7 X, k6 H" z4 U" \; n- S

+ m9 y% q) A1 H! e$ }$ W8 V9 i% W8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
) z1 i1 x$ x* f, d" b) h' r* h8 |! d$ b# h5 p
A.E_WARNING- E  z: R6 V3 H$ q- H
B.E_ERROR
7 A- A- B& B# C* W. K, B1 ~C.E_USER_ERROR4 T6 Z, f( t' y
D.E_PARSE
; F% I9 q% n! i* J. y& o/ X5 _E.E_NOTICE
) Q2 }& O  Z6 N+ y  N. I+ M6 ^, j
' e! |$ X+ q# Q& }% ~2 s/ S) c! g
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
/ g, H6 R! U% s/ p3 H
% ]$ ^3 X8 Z, W5 U1 _7 A; oA.把变量转换成int
1 K" v/ P* Q+ Q& SB.使用全等比较符(===)* a& {4 c7 }( K7 b9 n, F' e
C.确保常量是第一个操作数) T) d" w) k% I; I! c
D.使用三元运算符
, Q- D) k8 N( _E.用括号把操作包起来& f2 R7 y) c; W% w1 k

  O4 O) \2 l$ K, Q  ?# l! q7 u- F  J$ y
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?9 G' N) O2 M, _
$ |6 [( @( |7 Q1 _) Z
A.创建一个连接远程SMTP服务器的函数
4 o* }9 |1 f" v" l' u+ t. o0 SB.使用mail函数
5 J4 V2 N# k( O9 [- F3 b0 qC.使用error_log函数
$ w+ I# v1 V5 m  O: p7 Y2 fD.调用sendmial程序
5 F3 B3 J: h0 y, gE.使用webservice9 p# g2 \& P9 j3 i
2 w6 Y' E" a% ~! Y6 T1 ?# l
. W/ R) c* M" e4 u; g& ~
11.能否仅调用一个函数就关闭脚本内所有的错误报告?
- T5 Q& ]/ Z$ U: q" Z& E- Z- N( V2 R( d  Q
A.能
, M: E& l5 e# {+ \6 }9 l- QB.不能
7 d# O( w( t% x; _2 P
2 V* ~- p3 F/ a" h! a8 i2 s
* j0 t6 p9 _8 Y) W12.概要分析器(profiler)是做什么的?& Y/ l: w( A' g! o5 O* |0 I
, l2 N6 K: D& I1 n$ Q' g
A.创建关于脚本结构的档案; j/ X+ k' T( T, a0 P+ U9 F& b! c# @
B.把脚本转化成UML图
( F! H. ]* a4 H3 v  ~: AC.精确测算脚本不同部分的运行时间
2 V+ b3 o' o/ T7 g7 yD.计算脚本通过web服务器执行时的维度
* _( Y% _6 E* J. B% C! aE.扫描脚本,识别由常见错误导致的bug. i+ n; D) {; d3 I5 l% @+ p

4 {+ v; L# Q( }9 }' H" s/ w: p- F
13.______能帮助识别和解决bug。
' f3 i# M) J8 Z' K/ Q
0 Z0 m5 g6 x: R* w2 \答案:____________, t( ^/ y' ~" h$ }; Y- h3 a- k$ F

! H, b/ c: G9 Z' u8 W
7 S' @6 W* w# L3 f7 z14.trigger_error()和user_error()有什么区别?% B( R. C. E, W$ d" m

" @, {; T0 {  ?) `; q4 kA.trigger_error()允许脚本抛出系统级的错误
4 Q' U. o5 u8 j' F# LB.user_error()允许脚本抛出系统级的错误( w" Q3 I" c* [8 e
C.user_error()不能被用在错误管理器中
- [7 |: |' d6 m9 x3 YD.trigger_error只在PHP5中可用
1 s' i3 C: L& u" j3 ?E.没有区别
8 ?. }- k) K5 m5 Y$ b8 K4 p: K% v, E0 r- I5 d, d

  Z  e* g2 o4 R5 p! e15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
9 H! Y6 @2 c* o4 j$ F: v
( n$ L% b2 W! D' MA.print_r
5 W$ u  R. h0 j- D5 o' p% GB.var_dump. E" [# }* J) m( V
C.stack_dump  @$ |/ u+ C! b9 f3 s0 k1 V
D.debug_backtrace. X8 N$ ]8 u) z
E.以上都不对
$ Y! G; c! |6 l# e3 w3 [9 N
- c& `& D9 N7 e* I: T- P; a; P- h; i# a答案
" P; `8 d9 f4 W! `: e0 e' }" v) w" r7 p6 f; H
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。2 ~) M$ J0 `# W, Z9 S

7 _( l) O6 e# D2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。$ l# u3 b: l; |. \

6 I$ x& H; N5 _, G) J8 ?0 A( l$ L3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
! d; }* r& A  [
) m2 u: y# B3 Y, V4.这是在描述===操作符。$ ^' N5 H# }" Y# p" S/ X, }

, P/ W3 M( U$ ~. x( u5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
3 P$ p! a- c& C' u; [( V$ @4 c
% t0 ~; Y( m3 P& A, G8 \. x6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。* ^) J7 p$ [) T$ e; ^8 L0 O
5 `: |9 H9 h& P+ u3 ]
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
  H4 W  h" b5 Q* X
7 f- Z* C0 L) ]/ p& B8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
6 ~5 M* M; ?- j& e: T6 x3 S7 t  y0 P5 N; e7 F% m7 a
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。$ V0 |2 B* s5 l
% X9 W6 Z, ]7 y$ j; x! I9 V
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。: f" s8 q  R# w# V0 {* X+ ?

" j+ l7 X: y6 I% P( f& ^5 h5 z1 d11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
2 t3 y. i( @! a- M1 {, o) [4 G4 l( O7 q0 b/ R9 [
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。) Z) s/ q: ~6 @
) r( K1 [; R& }4 X" E" a
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。$ e* X- X  T7 \8 w( {2 w7 b# ]
. s  m! ~9 |5 U
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。- g* i( Y7 b% f0 d& u2 `. z
# o5 E: t" _2 [. z0 s* h
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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