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

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
, A3 O' O0 J9 Z7 p5 h要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。& B, |  i2 j8 c% h3 D: z
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。- e: ^! w& _/ ]2 m

5 ?: _- i5 Z9 g- |/ [4 J: D! _$ y  G0 A$ H. v' t
问题
0 l+ t) H( u# D5 \9 [1 F& f" |; }
2 h: O3 q* {0 u) z5 [& e6 x: @1.以下脚本如何用三元操作替代?
3 f& d% C7 d7 ?

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

/ N3 G% E/ W+ {; F/ {A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;* m( |7 u. R7 z
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;/ w% e5 b1 G% R9 `& w8 p) G' c0 M
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;0 o$ k4 ]  M/ G/ M
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;
8 X! [1 z. ^4 pE.以上都不对5 W6 m1 [3 m8 Z

# @6 N1 P9 `! t9 [% u" ]5 p& n% X$ A3 E% ^1 i9 u( G/ D% u
2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
+ n. V$ [- ?9 j+ f& C: J, B8 M
. z' N  F) f3 MA.安装操作码缓存(opcode cache)
% L5 w; O: }1 SB.优化或者升级你的网络连接
4 y) ]% c' F/ hC.添置更多的硬件
: K# }" b/ h  Q4 c# D% [5 N7 tD.增加服务器的可用RAM
+ J) B+ F+ J* ?5 yE.使用连接缓存, L$ O  H* u) F& K6 a( c  Q& M2 z
. x* s' o( q( {6 y( b2 ]- X7 d
+ e3 t6 B6 J0 ], w; u; l' e
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)4 m) I9 Y, m( P6 ]/ @

0 \) b- R2 p$ R5 v8 `A.关闭错误报告
* N' A% T5 H4 k) X9 j) ~1 _B.打开错误日志
3 K" l" G8 X% q1 p3 }6 R. D, F* HC.关闭错误日志# |% I7 b3 a& H, _& D2 `
D.关闭错误显示
" B5 l" O5 K! Z( g' HE.使用@抑错符5 E2 o9 L* E, |

0 l  D$ X7 b: L: P1 V/ f
9 g+ N$ T" O9 Y/ [( M7 M' I# }4.______操作符能对操作数的数据类型进行严格的比较?8 s( U. n' F5 D0 `
0 z; M. w5 O& R' F. j. T. ?
答案:____________) i2 o& \: ]) `, M

' }: V" E! i/ t
" p0 X- I; j# D& s; }; Q5.操作码缓存(opcode cache)能做什么?/ M- Q. S, a$ M9 Y/ G# ], n

5 W: y2 `4 @5 t  f3 y  ^A.把脚本编译成二进制对象,使它运行得更快
! ~1 o  \8 Q' K3 s0 C6 b: v2 YB.代替Zend引擎加快解释器的运行
+ b7 \& L) H) @% d2 a  X# I+ [C.缓存脚本输出以提高执行效率
+ s$ P2 n2 l" d( c: F- zD.缓存解析器产生的中间码,以提高运行效率
; B- b7 K6 _# t- ?E.在内存中缓存脚本,减少从硬盘中读取的次数
* a0 e% A9 u* I: r0 e
2 v0 C' e' b  q# T7 }) U: p
; s1 p' X" \  f! F6.以下哪些情况容易造成系统资源枯竭?(双选)& i6 V9 F3 B: h7 X7 Q/ i" U: i

9 K: ^- z/ r1 m, x* iA.RAM太小
1 w4 N! w$ n# v; C' |+ {! T7 KB.使用了低带宽的连接
/ M# _1 t' C; A7 K+ _1 g+ AC.虚拟内存超过2GB
' p- Q6 c, J# s2 RD.允许同时运行太多的服务器进程# q( H% S1 j6 r7 T
E.以上都不对
2 W1 u3 m% ?* [+ G
  {+ h6 e8 Y0 K0 l) j0 ^
3 Z* S( Y0 S6 l! H7.以下脚本缺了些什么?(双选) , u; \* V+ y3 {) A( n

  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. ?>
复制代码
6 F2 Q% j* `4 H! i: G& ?7 O. N
A.参数出口(Parameter escapement)
7 v) N; K0 @6 S( z/ u# h4 ^B.输出格式化
. X  c$ I' _! q6 g7 s: h; PC.错误检查
7 \' |6 N3 B" uD.一个SQL查询
. E" g5 b6 w  J3 v* a9 gE.以上都不对+ n, x- ]' J$ i0 W: R2 v# K
9 U, C7 k5 P. g! w

+ t! m5 a$ K4 D! U8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选), C" U* ^; ]. Q. i6 \

9 {5 a: e0 `( kA.E_WARNING
6 }0 V8 y- l) i3 l6 X( ~! vB.E_ERROR
5 d' J% D" Q8 |$ J8 ~( B! I+ GC.E_USER_ERROR
+ s% n2 s0 q7 C4 g6 s4 TD.E_PARSE
3 k- }# l9 {2 @4 Y% Y! b- BE.E_NOTICE
+ w0 {3 v( Y% B
& E! K; U1 q' p: u5 E6 M9 I# T. c2 \$ G5 R
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?% p, b4 S7 a8 t0 F

& {- z% ^4 J% q9 L  K6 \A.把变量转换成int
7 L" u% [2 s( {- X$ f, v: JB.使用全等比较符(===)9 W- u4 e2 I; N
C.确保常量是第一个操作数
7 V! \! N' F0 U) \% bD.使用三元运算符6 p& P( S1 W/ e: }3 o/ n: S& m. _( |
E.用括号把操作包起来$ ?- H. w5 S  ?. n* y4 s; j

4 L& a* \* }/ F: n5 A% U" {6 \6 Q1 W  X1 X
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?1 L3 w) e; E1 b/ E. ^) L7 d
- ?4 h# s# S+ v! {1 g+ ]
A.创建一个连接远程SMTP服务器的函数& y4 o8 \" Z+ L  C( c
B.使用mail函数
3 Q/ h. Q% G$ TC.使用error_log函数
+ N. O! |8 h( X4 Q! w# B* {! UD.调用sendmial程序
: z5 H- c5 L$ \6 P( EE.使用webservice
0 B+ k2 q6 X1 s1 r* a; T
1 b4 U/ {  n7 \3 J: b
' m( d# p8 J2 t* p% A$ I11.能否仅调用一个函数就关闭脚本内所有的错误报告?
; V0 ]& E$ p/ L3 k- G6 }6 ]" q/ j
0 o% c! T5 O, k# Z0 EA.能
- r/ M1 _7 J: @4 R$ e4 c2 JB.不能
/ X. r) d/ ^* |! m# m
1 h* g' I( U1 R" N' H* ]2 E
# z4 \; |5 `9 F+ H( B( z: A* I12.概要分析器(profiler)是做什么的?- h( o( f1 r- o, M. g+ j0 S
$ x9 ~% t: s$ Y; O! c( ^
A.创建关于脚本结构的档案
; K9 o4 c9 Q2 z6 E; IB.把脚本转化成UML图
4 Y5 T2 z( g% O1 @: FC.精确测算脚本不同部分的运行时间
6 w& ?5 e# q. h6 mD.计算脚本通过web服务器执行时的维度" f; P9 h7 p8 I
E.扫描脚本,识别由常见错误导致的bug4 P: `: l# L  g3 }
# e4 ?/ T6 e% o4 B, h! A* m' I7 B

3 p  b( m& P% B13.______能帮助识别和解决bug。4 i9 H) Y! f0 E0 k. R

2 @' C. [4 N* [* S3 @: I8 ~答案:____________1 {, r6 p- W& p) W  T' }

' M. C! a! R5 g+ H1 _7 y# T; D
) S+ H& h  u0 l( A! L) ~4 v14.trigger_error()和user_error()有什么区别?
6 Q3 d  A6 Z& R& U
+ G+ Y; d* [' N  v) w+ O9 uA.trigger_error()允许脚本抛出系统级的错误
% f6 S7 E; K; OB.user_error()允许脚本抛出系统级的错误
+ e" _7 j6 {. g( x, KC.user_error()不能被用在错误管理器中
7 Z. l  A3 @: a2 p; UD.trigger_error只在PHP5中可用4 i6 i/ a& t! F/ v  E  ^# b
E.没有区别) J0 Q3 O  f" Y4 z' z( w

# Z$ I) c7 u  j9 Y1 I3 G' r- o- q; `0 _4 d8 m8 |
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
/ i; U! @+ `9 \4 Z( ]% Q; E/ K; ~2 l8 u" I1 ~& {4 r
A.print_r
2 S. h' a: m% w- JB.var_dump
  V. H, ?) a8 J2 M1 y/ wC.stack_dump
' F+ m+ S/ c7 o% l2 p$ E3 S1 lD.debug_backtrace
+ F6 A% i4 q* n9 XE.以上都不对
; u% v8 v$ j6 M- }8 b
+ }; t: l8 i9 k+ R- d) x, V, l7 ^答案
# w4 _* y7 K9 Z- A) v! B- m
% r8 Y# ~% t& G( |, r1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。/ I. R% [9 ^* A

; }$ o- v! w8 u& G2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
. G9 X; k" R: S* k) p$ X7 r8 |- l  Z6 W: G. b, H( \8 U
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
: g: p9 l4 m  V: n7 c0 {3 T/ F! v- w0 S) {4 ?7 I5 |
4.这是在描述===操作符。
5 H+ d3 ^3 L$ G1 t9 \/ }! {) c; U) C6 {. b  M4 ]  ?
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。# ~- H  I- K# y- g

8 |8 d+ ?9 A' J( G( ^& @6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。; `- w3 u+ N9 N. W6 D; k

1 [$ x9 W/ v  p4 y7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
# H7 d) e2 ~1 P0 [
/ T9 A0 R  H. u8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。1 w# z0 W6 k* Z0 B. ?

7 p+ Y5 e, S0 s6 r, h0 H! ^9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。" n5 g- G( Q  I2 R8 U

; H# L' w6 l: k2 Y& E# W) ^10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。! Q* i' p+ K9 ^! p( A$ k
% e/ |6 U, \4 T4 Y
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
- `5 s. e2 F1 u  V3 J+ E5 r, c- K5 C+ o: _7 `
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
* H  q) v! V9 S% L/ j7 V& i% [- c6 r) ]! r" y. M3 h' F) @: t; t
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。" P& Z8 s" ^7 I0 M

: H& s" y' t2 U14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。5 d: g  p& D( D9 W

6 q+ C1 Y) a9 p, j8 q- B2 X+ j15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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