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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。: l" e3 V( u$ ?% d6 K
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
2 R- M; I# E0 q1 o3 d本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
. o: n; n. ]7 a6 B0 n
5 d: Q# [2 U% y# y2 G+ P' S# O6 j* B3 J. J6 W) x4 P! z  M; f2 s9 b
问题* T7 x, t# R) Y$ x8 z
5 W) p& j6 O, k( Y9 Z
1.以下脚本如何用三元操作替代?
, P! B" C" y4 ]

  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. ?>
复制代码
1 w- q( |* C6 O  Q4 l! B+ R$ S
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;  z$ C  S. E' e' B
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;& ], |! r) \. I6 X( L6 P& G
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;9 Y- Z! e# b9 t8 w& P( r+ f" u
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;) d$ v# y$ W, X, p* p
E.以上都不对
( Y+ A, N1 N8 ?$ g8 r, W9 d, z8 a% P$ ]: i* \1 z

( d$ R0 T$ s" y0 L$ K  t2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
$ R7 n# F- J$ W+ i7 r8 P7 d# z# X: F. ~7 U
A.安装操作码缓存(opcode cache)) N4 D5 {) F0 V4 d! i) G0 h: h& [  B
B.优化或者升级你的网络连接
* n3 v" Z1 t! |# T, I2 c. ?( W3 _C.添置更多的硬件& k# z, c' i' A% o- E6 c
D.增加服务器的可用RAM
, q0 [4 h7 _  Q4 }E.使用连接缓存2 T1 _2 `  \6 B' f1 t: t
" Z3 b8 C7 f; x  G( q+ g) N
: T" [% _6 |* W8 t, l- @
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
2 y( q( a0 J- N; _' Q; `' U1 L  w/ a
A.关闭错误报告
3 h: S( e0 A( p+ u2 _. |- \0 B  CB.打开错误日志. n- a. Q2 E* Q, L* ]2 T, e
C.关闭错误日志1 [0 i0 T) R+ p$ J5 {& v, i
D.关闭错误显示
) |) v# E% b9 KE.使用@抑错符
+ S$ r9 j1 m3 |; I. [
: v5 o  u' M8 |
( R8 l) ^2 I( c  D6 [! q4.______操作符能对操作数的数据类型进行严格的比较?& }* n4 O$ E( n: {5 U5 L

" c- _) i! H0 r1 E0 i/ p' u答案:____________
( M  F! Y4 Z# J1 b3 S5 a2 ?4 Z
" N3 N! P" g2 `# o: g; N' {' f+ d' C  ^) u
5.操作码缓存(opcode cache)能做什么?
& w3 z! `- `3 `8 X: d$ D
, r( |& c2 R( B* q: A" EA.把脚本编译成二进制对象,使它运行得更快
% e7 @3 b! A7 w  g' KB.代替Zend引擎加快解释器的运行
" t- e" T8 Y. L7 @4 a+ QC.缓存脚本输出以提高执行效率
8 @2 M! S- h" Z% U) tD.缓存解析器产生的中间码,以提高运行效率
0 D; k) e+ S0 ]/ `+ sE.在内存中缓存脚本,减少从硬盘中读取的次数
( K; b9 Y4 O0 S% X( T* L7 x# u  o1 z
; \+ [& o, s! |
6.以下哪些情况容易造成系统资源枯竭?(双选)" l% U) G- D# w6 T; F3 V+ m. ?
0 Z: i0 U: k8 l/ \
A.RAM太小
2 Q6 W8 o5 c% R" \. e3 |B.使用了低带宽的连接' z* Q- D5 t5 L1 M
C.虚拟内存超过2GB
! y# f; b5 k7 hD.允许同时运行太多的服务器进程
; s2 s$ r1 N6 D! [) _7 |0 `8 qE.以上都不对
2 c1 ~" W" B8 R2 R4 Z7 l4 C- C5 N1 E2 @- P6 W& l
; j* I: [  V: ]( R# {0 p$ }$ ]
7.以下脚本缺了些什么?(双选) # q/ {' B, ^7 i+ `

  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. ?>
复制代码
# U2 L2 D* A% }0 v7 p+ H5 M
A.参数出口(Parameter escapement)
! x0 a0 U3 W! g- `. M0 h# AB.输出格式化
* I0 h4 e. f9 g4 xC.错误检查7 B( ?5 u) V' {2 G8 I* b
D.一个SQL查询, F' t1 S0 Z' o' H3 ]
E.以上都不对0 o9 n; d, z* \; e4 b' e$ t! J3 ]( K

8 f5 G/ S% p/ `4 J! x1 L( R0 \
6 \% }: i% ^# f- s8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)$ k% Y" b$ b! r8 A

/ [7 U: \, y: pA.E_WARNING! d% k% F- I6 ^4 `
B.E_ERROR0 ]8 U, j; u/ K8 A1 ]
C.E_USER_ERROR
7 v3 v. S/ q2 F9 w) B- V: E; |D.E_PARSE" _$ y: c1 `: H6 [* d2 p/ q  U
E.E_NOTICE
- p- {( K6 c$ W5 `4 W% y  n2 {: ^. A/ g- ]; s! y

3 B" ~1 a8 h5 u( |9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
" }/ v3 d0 f& p8 `7 f% Q- h. X
% y1 M4 q) ~  J# HA.把变量转换成int
) _* L3 ?# `- aB.使用全等比较符(===)
4 P  o' M+ M9 J8 w: h6 OC.确保常量是第一个操作数
3 l0 B! T+ b" T7 `1 `- y2 E4 DD.使用三元运算符
+ G; p0 J4 T* `' _" ^8 t# yE.用括号把操作包起来
* e! @; z$ d' M& K; ?) w' |8 J
  K. O9 d1 N9 p; Y8 F/ ]  @
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
! V7 _7 |3 p0 `$ H2 W$ j0 H! _" a
- I3 ]% _9 T; L1 IA.创建一个连接远程SMTP服务器的函数
. N! \+ P, v& @4 p- hB.使用mail函数' B0 e8 A& A& H1 J9 T4 @  {( B& H
C.使用error_log函数
4 W9 ^) z$ m3 K; z3 `: K" M0 eD.调用sendmial程序
4 {, z. b* b* V3 F8 V/ rE.使用webservice
* S, i* P2 J/ y: y2 F4 {! n) T8 u* k6 m1 q! f, G/ |) p5 z
! p: Y* D! w' d( n
11.能否仅调用一个函数就关闭脚本内所有的错误报告?
2 r1 `5 G8 e/ _. Q) w) }/ f9 |2 x$ n! H$ h: r$ u) g* e
A.能
6 f0 \9 c% ?4 xB.不能
* b  J, [' S1 |5 x& D9 r6 L5 |& y. [* y; ]

8 H( x9 }& h& s9 S3 K2 u. \- I) }' |12.概要分析器(profiler)是做什么的?
, E2 o; t: P& C+ ~
- Z% u' T8 \8 O- P. ~* oA.创建关于脚本结构的档案5 ~) d6 C/ X. q, i8 v# _: j: f
B.把脚本转化成UML图
3 `" q4 I4 i% m6 l6 {7 uC.精确测算脚本不同部分的运行时间
& V+ W: \$ C8 w# L0 hD.计算脚本通过web服务器执行时的维度
, ~% |" @- o2 V3 d& ?4 M( a: XE.扫描脚本,识别由常见错误导致的bug
- ?7 t; O- |  K9 L
8 @% z6 c6 l+ M1 m! b  m; U
% \& _8 C( ]' h( D0 a% ~13.______能帮助识别和解决bug。( H3 A7 b1 m/ A7 |0 @8 M/ m
* u4 z8 J6 @) _! e
答案:____________% t* Q& c3 ^5 Q! M2 h; T

# P1 f# m1 a) O4 E9 ?- Y
; O. k3 R4 l: _9 T) \14.trigger_error()和user_error()有什么区别?
: K3 a; p4 B! p+ K- {0 P4 @4 ?( {. ^8 _- d
A.trigger_error()允许脚本抛出系统级的错误9 @/ w3 W* ^7 C2 I) d; h" A
B.user_error()允许脚本抛出系统级的错误
/ ]- L& K7 ~$ YC.user_error()不能被用在错误管理器中8 l' D' D+ r. |; I
D.trigger_error只在PHP5中可用8 G3 {$ ^1 I. `8 T# |, _1 U/ e* \
E.没有区别
& ]. W# b# z  ^( S' l, `% N9 l% Q6 y5 y4 A* Q9 V

0 x$ M* X! z8 y; Y) ]/ M4 O, s, @15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
2 r) P3 m- h  c) `. I
& [% J! h$ E- kA.print_r
* g/ n6 z! q) X3 Z/ ZB.var_dump
7 o) H* ?" o7 P5 `5 m' XC.stack_dump
! \! o1 C, w4 d8 \* ^: @D.debug_backtrace1 g3 ?% X. |3 y  d% X" f
E.以上都不对( E! W7 X1 N5 m' [
' b  q0 b0 d4 x9 D- ~9 ]# q) q
答案
8 ?5 O2 f7 c- o$ a; i, }
4 p9 f  w% z: @& x$ e: u1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。- V; x+ g* V8 |) G, e

/ S# K: {4 {2 N* @: f2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。, ?1 C" F2 z0 |% k2 V$ g

. L% E  i+ S! F) F' i, y' C: m; x3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。- H/ c, a5 B+ G; s
3 _) ^) k# X9 |2 g' j$ o& U
4.这是在描述===操作符。
3 l8 `5 x( B+ e1 m) h" a3 e' F( Y1 ]( q/ V& ?& I5 K# G  T
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。! w3 J% }5 H+ _* _& ]

3 g2 {" e1 G' B" K. P* g. D- C6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
" [( q7 V2 `" _5 i( T/ Z6 K5 ~  i! E
' {$ Z) p$ H/ x7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
1 X- h5 r9 L- T' X
2 N' u* C3 R0 y9 Q3 F7 S% e8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
8 e) e# a" W& _  t' x% R) m- I# F1 J& A) g( w, i% S7 Q8 n
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。& r. F( i  T2 a$ E6 T9 y

* N7 y& s) k! B% B/ j5 L/ N. U5 v10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。2 u8 e$ S2 K" m" _+ c
" b- f6 N; N, X0 N- c. O
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。, Z. ?* J  I# v8 A

. U3 X' F  d+ A/ D* `12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
8 H# X+ y- H6 L: E3 }' A" Y% J8 F+ ?
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。0 [9 s( W, M7 q1 ^
" C2 n5 Q1 h! K- f
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。! h1 @9 a+ l" L

! A' t6 w9 V6 R9 f, Q# U5 m5 C- }15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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