|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。
! Q4 E+ m0 V K' N$ q4 D# ]& O- t要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
5 D# _# R) n8 G1 @6 A8 B: n3 y本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
6 \9 l, q$ s. ]! ~5 W9 B. _. C% O. N6 ?7 r9 Z2 w/ R8 ]$ E
: L4 ~' }1 p0 Z& C( |
问题4 b5 r/ v8 A5 V( a6 C" t0 C( b
; T1 }1 f; v% }9 b4 {
1.以下脚本如何用三元操作替代? ! }# v* z$ K, n6 ~5 A! i
-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码 / s! j8 W% F2 r0 g9 F8 V$ l
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;
% z& H( K) O) s# kB.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;
+ g O/ F9 i1 Z: fC.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
5 e# h8 G/ i- G# {; o. L; bD.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;" _: J0 Z$ `( h
E.以上都不对
5 M# \0 z% Q: O/ i5 b& Y1 p4 x$ [" X2 Y
# G- T- u6 ]# G2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)0 d2 d; q- S2 k* ]
2 K, d q+ g- p8 ^# e3 K
A.安装操作码缓存(opcode cache). d' f9 F/ I: w ]0 |
B.优化或者升级你的网络连接
1 X" I3 L3 V0 B, b6 \& WC.添置更多的硬件
! u" r7 _; P' f% B- ~, mD.增加服务器的可用RAM
/ G, ^6 T7 Q7 s3 F+ s4 bE.使用连接缓存: j" L2 k1 K1 E& c& e; ^
) v4 x% `% E/ D( ~$ k. X2 P" f
* e) l" @) j) ?) n! i7 ]/ |3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
+ O u: h$ z8 Z3 z7 `" t- _* u+ `8 u0 r/ U2 f
A.关闭错误报告
$ A5 i7 g7 F3 b4 m% w6 ]B.打开错误日志. `/ W t5 F7 ]$ k7 A# T
C.关闭错误日志8 C: ]: p! l" Y
D.关闭错误显示 L1 m& Z o4 O' K
E.使用@抑错符
. c, g: I- a5 ~2 q- N7 h* ]1 T, T3 u/ j1 k6 L; `
4 N3 ~: m. \: R9 v7 g3 K3 H
4.______操作符能对操作数的数据类型进行严格的比较?9 t. {% T7 e: l4 E# E, ~2 p
0 V3 X9 D* y) |! d1 Q答案:____________! s/ T' |1 [' o% q8 J! r+ k
; p- {. ?6 [5 C: v$ {2 K% X1 \
! H6 \+ V" A" t. m- ?* T4 k2 p7 L5.操作码缓存(opcode cache)能做什么?+ b$ B7 [1 k+ ]6 L
1 T0 I4 _" `/ `! `* p
A.把脚本编译成二进制对象,使它运行得更快/ \/ {% j5 X* A F2 v
B.代替Zend引擎加快解释器的运行
9 `3 I: C2 }1 y& R+ T' N" WC.缓存脚本输出以提高执行效率% b: Z' W3 [9 Z5 H' T7 J$ W* x" Z
D.缓存解析器产生的中间码,以提高运行效率0 o. b; E8 I( @" x- x, L
E.在内存中缓存脚本,减少从硬盘中读取的次数
* A( M/ E$ t0 C: ]+ \' v% k2 I# m* x- C2 m, q8 w
/ q0 E& F# K2 J6.以下哪些情况容易造成系统资源枯竭?(双选)
! m0 o1 o; W5 R) R) {% V3 d
" r+ W# W' i, S. p3 C+ LA.RAM太小
: w( V5 m! i5 A6 z- N% d; X! x1 lB.使用了低带宽的连接
7 n4 f7 F2 I$ j1 r; O, {! M- m2 XC.虚拟内存超过2GB0 \2 D# q" ], W- ]4 X/ Y
D.允许同时运行太多的服务器进程' y+ w% S; ?5 {& u/ f
E.以上都不对
( f' l9 b3 c8 F; T0 N1 L% P! |7 ?: g7 O3 g: }% D, Q
7 t; h4 [5 j: K. R* p7.以下脚本缺了些什么?(双选) " P# n- [" n' q
-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码 ) z9 ?' U0 o- ^+ | n
A.参数出口(Parameter escapement). m+ k9 H' W! y$ Q& I& C
B.输出格式化
9 j2 M. @3 p& |3 [3 M+ Z( mC.错误检查2 E% I# z: S4 T t: q. f! E! a x
D.一个SQL查询6 ]7 ~5 ^$ d+ x" H0 X; d# M: o
E.以上都不对
9 i- R$ a7 |( X& f( {4 G
# [1 G% `2 ?! f- a; A7 b0 t: P& z& U9 s5 d
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
. P/ H. a2 g( a5 M8 v- N- m- B+ }6 J8 z
A.E_WARNING
' L; E) W) d, z0 S( F, P# ?B.E_ERROR
9 z, M9 O1 j; a0 `! g* cC.E_USER_ERROR
! Y8 k" ~& Z# T* \* lD.E_PARSE
( A/ i4 s- N9 ~8 V' c& M8 pE.E_NOTICE
! C2 ]4 s& {4 V8 @) f9 E
* h, G" O/ x& S8 t- D2 G4 H2 z% l6 O! L2 \# R! k% Y2 h
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?! d {) V4 l0 D2 ~
5 x& \' P& Q' j' Z- _$ q
A.把变量转换成int
9 \' ^$ ^( W; N: o+ x- x gB.使用全等比较符(===)
2 L" b# D. M7 ~" n* Y0 oC.确保常量是第一个操作数9 |" q1 u" M9 B$ u/ T7 H
D.使用三元运算符
! p! p8 W! R6 bE.用括号把操作包起来
E A3 P5 ]. s/ a+ ~8 \; U+ K
' J* \- L: A+ Q' W0 v) P( O4 \) P% r1 c
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
' _1 k) G" L0 S/ V3 ^1 U% R% O
4 U9 S' W ~7 x- _: W9 O! @A.创建一个连接远程SMTP服务器的函数; f6 V: m! G& u3 o! J# ^; N! O
B.使用mail函数
, |2 N4 x7 F, `- |6 n3 o' p' aC.使用error_log函数
% h: k$ ?" e& h5 l& i* B( S; u' ~D.调用sendmial程序' h: c# n+ b& |- l E
E.使用webservice& N) ]: p6 W/ [5 O+ q
3 c, g3 Q) E1 s$ L" w6 \
- k; M0 i" \* s. D' U" g1 B11.能否仅调用一个函数就关闭脚本内所有的错误报告?
: l J% ]- D3 X: n
/ D* `6 O2 A4 V: xA.能3 x3 h" M+ i6 {* I& d
B.不能
9 Q; q6 z$ B; @. r# Q9 R
- d/ e" N% C- }& W$ L! r% u) b) @6 z
12.概要分析器(profiler)是做什么的?
4 v/ o/ T2 u+ P7 X U7 w, X: g: u1 }% j5 |% ^4 s7 j6 x5 l+ I5 w
A.创建关于脚本结构的档案
9 F& _- m& E. K! l$ B$ z" ~B.把脚本转化成UML图
0 D6 p# t2 Z6 L. W, h( Q4 [8 |C.精确测算脚本不同部分的运行时间
9 a& a; N. C. fD.计算脚本通过web服务器执行时的维度
^' u6 d( Z( Q1 S" e8 B/ w# K1 RE.扫描脚本,识别由常见错误导致的bug# I5 [ B& N3 h! n' o& |) L. d
! P- v& l( H4 h3 W- U9 I
; W" S) ~0 q. e( J, n7 w
13.______能帮助识别和解决bug。
6 r/ f$ c9 e) F: N: W1 l! `; y
7 u1 ~5 J+ h3 a+ g0 u) {! b! {8 C3 C, F; {答案:____________( {/ k4 }; H0 _& z" \3 z+ Z
$ y8 P! Y6 H- j. S r, j- n( M
' ?1 U$ m/ r; k- b5 U- T
14.trigger_error()和user_error()有什么区别?' b: z" R. i1 Y, S. [) K
4 s, Q/ r" ?& @! u0 u4 D9 Y2 H* T
A.trigger_error()允许脚本抛出系统级的错误% U1 K& H. |4 h0 }7 Y& S) b9 J
B.user_error()允许脚本抛出系统级的错误$ U: U2 w! r/ Y: f$ a
C.user_error()不能被用在错误管理器中
0 i; H- ~1 T( O0 b- y. _* yD.trigger_error只在PHP5中可用4 D3 H# n: S7 z, z+ r$ ~
E.没有区别
2 W1 T3 u; c; T0 n- d; [ c9 b* G9 D, R. \; Q
& t2 V6 ^7 y+ \2 J. K b+ o
15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。2 C; z) {; M7 T+ s* `$ S
4 v2 z9 g: `. O! a" DA.print_r7 q1 n- T" V& b8 z; A1 n7 |
B.var_dump! x; i* u6 e; ?
C.stack_dump y$ M f; U1 v+ g* ^$ T
D.debug_backtrace% K3 F. M6 v+ x; E* {+ b: K
E.以上都不对# b! H4 s# f8 b G- Q5 C
6 c2 @5 f/ ]- J# F4 w
答案: @3 | g6 }/ H* ~+ o/ N* {* f
8 |4 y, }+ d% w( q: V n" `, A4 _
1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
" }: \+ t6 r' V% v( S& j! {% c* u' `2 n' [' K+ a& d
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。" G7 D! r* L* R. D* X9 c0 B L# X% [
2 c. a, D- c1 n1 ?: w! j3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。( P7 f# x j1 a$ C. a1 f
) m1 f; k( z3 r$ E0 ~- T' L: q' X4.这是在描述===操作符。, I) q; W$ p& ]4 ]
0 Z9 G6 o1 O5 I% m
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。) P* I( c8 D! \8 Q+ d9 @
- }3 W1 r. s# o6 A; V9 Y, Y% t0 I1 I
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。3 M$ z% q/ u. S9 M1 k8 T
; h/ [2 H5 Z% F: D7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
" k: o$ z4 M7 y- G' w
4 g8 h/ A' m! c* y% z! g3 z8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。$ e" a. @8 U# g+ O) g/ ?& {
! Y, J: z. g$ A
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。: Y8 ~' h5 v* ]# P" `+ o, {
: d7 y7 ]0 |' A. L10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。8 O. z8 x7 M& G5 J& E% O
+ X% `# t& `) m8 P5 T7 Q( N: e11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。
8 E0 g8 h( \2 V- {1 C1 F2 O+ W: x2 B9 r% S% ~: t# M
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。 U: f2 p- O6 M3 v
0 I0 ?. j* ^ I; p7 \0 X
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。
. u% q# O' |, y! O, |5 X5 F
. ]' Q' {$ d* {4 v+ X14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。* T/ ^1 s+ H8 l' ~$ _0 E% R+ A
& V _/ a. Y1 K0 \15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|