|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14391
- 金币
- 2481
- 威望
- 1647
- 贡献
- 1429
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。 \# X& H( O2 X. O
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
3 ^9 g( r: Q" o Q- ]" Q/ u: `( ?本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。: }& l- v/ u6 t8 v3 m2 f8 z
+ `8 g1 l+ E; ~6 L& ]' u: W
2 J. z! p8 e3 _4 p5 \2 d; J/ `$ Y
问题
, r& V) w4 V5 d
" o/ z" x/ W$ \' y+ y1.以下脚本如何用三元操作替代? ) F% `4 V' l! c
-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码 1 _; p9 J; b9 y. S
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
9 q3 Z: R2 H, O# K% s4 I* q3 |7 n4 ?3 fB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
- v# @9 W9 v+ KC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
3 Z; j9 L5 M7 T0 p) S- WD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;0 h; {! _$ l3 p3 P0 r* S
E.以上都不对
3 D9 d* U) {6 N" p
- V& Z5 R# a+ ?+ F/ z! r v, R
& s/ V8 |+ o& I3 f5 s7 D2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)" H( d0 `7 L6 f k$ T8 p/ p; e
$ K4 a* @ d7 C4 \4 M- pA.安装操作码缓存(opcode cache)
$ b |. K# J, a3 E! AB.优化或者升级你的网络连接
/ `) w5 U9 u) O, q0 i+ ?: Y; rC.添置更多的硬件
: e v; [' l: J$ q; M; L$ qD.增加服务器的可用RAM4 U4 c! _* T9 {# H5 p& U! H
E.使用连接缓存% E+ s' ^% h5 f8 D; ^/ L
# p; i( m8 M6 X8 c4 q& V2 ^; Z; b
7 Q7 M( L0 F6 S' @ ~+ T% Q& O
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
2 G/ C" u3 S! }. k, G1 k+ [9 |+ Q0 F& m7 ~2 t
A.关闭错误报告$ c; _- D: [; P5 k }/ }- T x) H) M' {
B.打开错误日志
* ~! V. V+ a4 e9 dC.关闭错误日志7 P+ k. P3 E" R8 @0 a
D.关闭错误显示! ?' \( Y0 P% o5 d
E.使用@抑错符, T O7 j& @4 c" k& W
I1 D4 [' z. W+ V
4 U: ~: j+ F% E8 m) E4.______操作符能对操作数的数据类型进行严格的比较?6 w" e7 @9 X- a+ E# E3 N
( C' Z- z! G) {, F5 ]7 q5 V
答案:____________
: F" g% B3 w! E; C+ P/ P* O, P6 Q6 Q7 q$ P
2 r$ w' r( q# r/ D1 x( M$ _0 }
5.操作码缓存(opcode cache)能做什么?3 p' J2 a% l b2 @; o& k
- i4 C# u4 q; I& a- A0 l$ @3 S
A.把脚本编译成二进制对象,使它运行得更快
; N- v! ?, G9 `, o9 {. Z2 Q5 v, d# m5 sB.代替Zend引擎加快解释器的运行& a; e9 D9 q7 T' U4 R2 S
C.缓存脚本输出以提高执行效率9 |. O# f. J' p8 F4 i! `. u* e: |
D.缓存解析器产生的中间码,以提高运行效率
* P+ a) K! K3 gE.在内存中缓存脚本,减少从硬盘中读取的次数
; {2 [& v# ]& s- ?9 c
) N+ B5 I8 Q* _9 X0 w; A% d4 j) ?3 ]0 D1 S4 }5 e* P+ R3 Q
6.以下哪些情况容易造成系统资源枯竭?(双选)
1 n5 S9 G/ w6 h% H7 f" e4 H- U" u2 m. l" A4 q+ w) [
A.RAM太小0 l! R6 g3 ]* N% c, N/ S% G
B.使用了低带宽的连接
4 t; e' z- D) k: U! g" g4 I+ uC.虚拟内存超过2GB1 u, x( c- r' |) j$ `1 R
D.允许同时运行太多的服务器进程
- g7 b# Y* W8 B5 F+ ~5 R8 L1 uE.以上都不对/ @3 M; J- m% x$ Q
Q; n1 ]: f# d! X# J- ?; l
e! n/ H0 ^0 I/ ?3 u! Z
7.以下脚本缺了些什么?(双选) 7 L: y& u9 C5 Q$ `8 O
-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码 & z& F5 ^& t0 g2 c0 e
A.参数出口(Parameter escapement)
2 G9 `# B9 s" c- AB.输出格式化
- t' w& v n# T! g, q6 d- `C.错误检查* l* @, T0 |5 n/ z* C
D.一个SQL查询( }& k& I8 d6 L0 z
E.以上都不对
6 P7 {+ j; ?8 H; S$ @0 Z. f, S3 M3 O9 z8 n
# p, a( s) T( K% I. f% K8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)9 R/ F9 }& ~; J, z
( I1 Y5 t; N, g
A.E_WARNING7 q! H# e5 q: n' b- W
B.E_ERROR8 d0 D/ C# Q# O' b5 T# Q' Y
C.E_USER_ERROR- |! N2 E+ W; }6 J' x* N- h1 l
D.E_PARSE
" a& d, f' _2 w: RE.E_NOTICE
, p% i; N1 {$ o2 z' T' B/ m- n. L. L o
1 m$ B. F) V3 B d9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?* r9 b# R. a( K' t' q2 F
" ?8 I5 M/ i/ \6 k6 f$ XA.把变量转换成int
. a* K4 e% n8 l+ H! C4 O* J9 AB.使用全等比较符(===)
& j& H! s& f& Y, y8 k3 t O; W& sC.确保常量是第一个操作数
: w9 ]- L, H; k! v* K: o' h5 YD.使用三元运算符7 J# T& |. R! a2 x8 T& g
E.用括号把操作包起来
j! o2 ?( q& Q$ q0 b+ o$ S* k; O+ s" Y; ]
% c' T1 Z' `9 q" ~0 f
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
& y/ k I4 d8 W1 q" T s6 D F2 U- ]- H1 A" c
A.创建一个连接远程SMTP服务器的函数
. r5 e6 P! A( Q5 o& r1 L. OB.使用mail函数6 p0 J; k' f* C6 v9 T& d% ~7 }
C.使用error_log函数3 Z5 V; ]( n/ ~- J3 C$ ]
D.调用sendmial程序
- C, |: B* F$ K$ PE.使用webservice
# N! m" U+ t' i% t4 V" J/ f5 L# g7 A( m7 ]; Y6 e$ I
3 a* t! Y+ ]1 F1 ~7 ?& p
11.能否仅调用一个函数就关闭脚本内所有的错误报告?/ w; O3 f4 e, q0 G% W. z
5 [+ m' y' |6 k& N
A.能7 y/ x8 i/ H! h- w
B.不能
9 i- l. ^- B2 S) r1 M! }% M! [% a8 b/ v* B* `. a. U0 ]
1 x! i8 R. h$ K12.概要分析器(profiler)是做什么的?8 S- U6 @6 K: m$ e
9 |7 X1 j9 E% P/ g" S$ lA.创建关于脚本结构的档案4 S+ t0 U* D3 [* u$ X1 a7 L+ T# K
B.把脚本转化成UML图& W# W( v+ K2 `7 y- T, v8 Z; M
C.精确测算脚本不同部分的运行时间
& D8 r1 O0 [3 I# W" s" d; xD.计算脚本通过web服务器执行时的维度
1 s. X" h$ _3 ~' {. f" h6 IE.扫描脚本,识别由常见错误导致的bug
4 ]* {1 N0 S) B. M0 n3 D& L7 F
6 t9 ~8 ?+ n( K) ]* [# S
( g; Y" _4 L) w8 W: ~13.______能帮助识别和解决bug。
( g# q! o( c' |) I: R2 H0 [7 ~
: C# \; ]! M/ x, n/ v答案:____________
' N9 v/ \% [9 \, h& \0 P8 B5 b; Q3 J- F
9 \( u! z. S" f, x' ]$ n
14.trigger_error()和user_error()有什么区别?
. m5 x* I& d0 a) ~
1 w3 ~$ Z+ ]1 h0 d& e* r V! D' GA.trigger_error()允许脚本抛出系统级的错误
6 I. B* a7 `& qB.user_error()允许脚本抛出系统级的错误1 X, H0 e6 _" U8 ~
C.user_error()不能被用在错误管理器中
' {# _9 D* O9 PD.trigger_error只在PHP5中可用
! R# a6 S( L+ {' a0 H; bE.没有区别0 W6 C( b. y5 h4 w1 A
' L! Q- S9 g; R5 H O
g" [9 W$ N3 W) t0 y. B# g15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。, o4 ?0 P/ t: ]! l# T$ P4 X
3 g: Q! L: |# @3 g. x6 z$ v( k8 l# n7 QA.print_r
2 c* n6 M) I5 |( X8 l/ D* EB.var_dump/ S2 e, P' r: T, s. a% P8 x
C.stack_dump8 \$ R* P' R, |, M
D.debug_backtrace
1 \' U7 L8 }" y( b6 SE.以上都不对
! V% C0 t/ m6 ~$ V& o
* L3 G/ V3 _& _; W+ \8 M答案( |) C& g: Z1 ?5 i2 _2 t
* E( |. A: O( T7 u5 |6 X o$ N1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。& \# n. w8 f0 W: W8 O8 A, ]
" L2 O c. f% m0 i1 \7 T7 ]
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
+ w( }" c3 l! ]: s" c& T& f0 F& Y/ r) _7 K; w
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。) U \, z& s: x: T
3 l+ P% ?* j; f1 w1 @4.这是在描述===操作符。4 a8 q/ Q f* [+ s
3 u) |/ c* o- i* h' r' j
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。# \" @4 W: G1 d) Z/ ^4 h4 F" d9 F
* f8 E! \2 C2 t/ m6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。3 r2 I0 [1 A& x$ l) {2 X: n
" w& c3 ^% I) V/ J3 A
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。' N4 |" b5 r1 w0 L8 V, \
/ h" ~( T. g# }5 d+ D, C
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
( I+ N& @! z: V' I T
% X, z9 u5 h4 `- L% ?9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。: u5 D$ }0 O7 E% o* E" n
$ s- n7 j( L. o3 u10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
' [; s7 O- G4 i* P! e P6 i) B' _: e* k
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
1 D& M; t' |" R4 \: e) d
+ Q( _: v! v5 J" b: B12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
7 j- Z% T; V* U; q {# o M2 ~! U4 r/ ^; a. S P
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。7 M a: ?# ^" w: `& h: n# r# _7 Z( _
4 y9 h* y, ?3 Q5 T) B
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
2 z# M' s4 H; E9 Y* V6 w8 m
& l# [) ~% s5 z( k/ Q; |15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|