|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14389
- 金币
- 2480
- 威望
- 1647
- 贡献
- 1428
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。) b+ B1 J( {5 |( e
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。* M* K& z. B, ?; w0 W' p, C
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。, m" n' i C! F! k
9 ]2 N- P3 }! d7 w' f7 A7 F9 Y+ A, l9 p- @0 Q9 }+ r
问题
' h& {* j- u' w! p
" G2 B. z6 @9 d, [6 G' u$ O, d2 ?4 T8 w1.以下脚本如何用三元操作替代?
- R+ ~( R3 x" i: P/ L-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码 ( i4 }+ @0 Y; r- N; E: t
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;) g' x7 G: ~- s$ O q7 q ^( E
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;/ T+ y" B: [2 g8 f' q
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;* z5 K% e9 a* P
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;' T. e' }4 X+ l& |8 D) u7 J( a6 o4 B
E.以上都不对, V5 e4 d* |$ W3 P5 e+ S
, @' x% t. s2 h& ?6 K
: }" S* h$ u1 ?2 ~: d( ?1 r2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)
: s( M3 v, @. ?# [& ]8 l, L, b W8 c0 U) i& ^6 A8 b
A.安装操作码缓存(opcode cache)/ e' d9 g2 J. q3 D* o
B.优化或者升级你的网络连接8 H% I. z/ \1 @# V% Q: L# c
C.添置更多的硬件
2 ~0 t$ X! S+ ?. i" sD.增加服务器的可用RAM5 X. \3 d) `4 j9 D7 H& \* y `1 Z
E.使用连接缓存$ u: L% N; l, K/ N, r* d; p
, q1 G: F/ l, i2 l, ?
# q- `4 S- O8 D7 Z. L
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)5 E7 r6 u! }! s
8 {3 x9 N0 t9 G! }; H5 u
A.关闭错误报告* L8 L5 m% B' l. M
B.打开错误日志
" p' |1 _/ P2 \7 J+ bC.关闭错误日志
6 }! ]' O' O) B% s: WD.关闭错误显示
; {; d( ?5 N, e, s0 YE.使用@抑错符
1 g; m1 b7 O& x2 D1 F8 t% I
b9 L# X$ W4 {2 {: Z
/ Q+ B$ S* m2 q! [4.______操作符能对操作数的数据类型进行严格的比较?6 Z- F+ o# z8 I9 z
% D, J+ ` I; A3 d$ {; `
答案:____________
' X2 ^0 O/ G6 U% t& ^0 n# H/ J2 M, V) l$ r6 ~+ |7 S
( R6 O& O" r7 }6 W z5.操作码缓存(opcode cache)能做什么?
$ I1 a3 n# G9 w% m4 V% D' X1 s2 ^
) e. [; ]! G: u& vA.把脚本编译成二进制对象,使它运行得更快6 x: E3 L d4 S5 m ]& ?: |0 Z
B.代替Zend引擎加快解释器的运行: n) i% ]1 {" y! A
C.缓存脚本输出以提高执行效率. ^* v1 ]% i5 y: C" ?* [
D.缓存解析器产生的中间码,以提高运行效率9 @* I0 E* ]. t- p) x/ t. q
E.在内存中缓存脚本,减少从硬盘中读取的次数
& v( V' ?# H5 d" r [% R) _( |
& H: Q" I8 j# E8 ]0 K2 J( v
6.以下哪些情况容易造成系统资源枯竭?(双选)
% }* s' N0 _( ~7 ]# X3 U! d3 f0 z
: Z$ {. m: \' c; S5 I U* ]: mA.RAM太小
2 d$ d: |8 U8 [B.使用了低带宽的连接
6 ?( d9 R3 w0 bC.虚拟内存超过2GB
9 m. [0 b; u( L; W3 h2 L8 cD.允许同时运行太多的服务器进程
/ G1 |' r2 g) ^4 f9 ]E.以上都不对
2 b% `/ V. e4 `2 f# s( q2 |; i* x
" W% E) ^% c3 i a
7.以下脚本缺了些什么?(双选)
& K' M% ^/ v0 {/ X-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码 : S @( G7 P/ w$ G6 ?
A.参数出口(Parameter escapement)
( D! S C5 o0 {9 \B.输出格式化
) f9 n: v7 @+ k$ k, y9 b% dC.错误检查. K: z4 ?9 {& k1 ~
D.一个SQL查询
1 O! H6 F8 f3 I/ W, [E.以上都不对
1 x- K/ u9 z3 y% B9 r7 K" o
9 g% T, k: c" O0 b$ ?( ~% k9 N9 H/ M- w
8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)- S/ a' [9 w2 M" {
8 t4 z; @* ~2 u# y, |
A.E_WARNING6 v' b+ ]% r- d( f/ i* v8 j
B.E_ERROR
% r% _: X# q- P7 P9 G" RC.E_USER_ERROR. b3 d4 s( f# W8 _ {; j K3 a
D.E_PARSE
5 @* j5 f) Z/ Y. x2 LE.E_NOTICE
* Z T9 t# }! }
! q7 w: D& u5 _+ A/ Y1 L& |# d3 q$ ~0 K/ I
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
. d. }: _% n7 X+ T: e' v( ], p, O, o5 r
A.把变量转换成int
2 ]8 p; c0 f3 GB.使用全等比较符(===)
7 l! f0 _& A9 W* |- t) @C.确保常量是第一个操作数8 U- X8 J) e# ]+ s/ L r
D.使用三元运算符* W, a; O. v+ y
E.用括号把操作包起来* i8 m) X" Y5 Q9 i0 N
) @" h* k E* Z; T( J5 I
9 b" u5 V0 Q5 L6 [! w8 t/ v* o10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?
: g7 A) E9 g( ?' I% y$ Y1 s! V. L) ~$ }2 l% Z% D1 h6 d4 {
A.创建一个连接远程SMTP服务器的函数; I7 A" d+ X# M7 N7 L
B.使用mail函数+ S9 d; d6 E: q0 N# _
C.使用error_log函数
, j1 a/ M1 j1 d- w* cD.调用sendmial程序
% R/ }' M5 b( b& z; qE.使用webservice
- \6 B4 p* E. t, u; A9 Y2 k) x | D1 n& P" _+ Z$ W! K- h9 L
# g- e, Q; R% P: t* C- [8 t% b11.能否仅调用一个函数就关闭脚本内所有的错误报告?4 T* C2 H( _* o% N) J
% z; X% t/ v; L2 F3 [% W
A.能. v- z* E+ P" S- X4 W
B.不能
7 `: k2 H/ z5 w C$ z3 w G( T
3 L" B8 @9 C' h# }- o
. ]/ c- K& Y8 J4 y9 F% h: D; V12.概要分析器(profiler)是做什么的?
. K5 Y* `3 ]9 u# Y2 }1 i
8 s. _& V- t* e4 M3 {4 m* }' {A.创建关于脚本结构的档案, b* S/ I% Q) c1 g9 A b1 g$ m% C
B.把脚本转化成UML图" [ g0 G% i8 s7 g1 C C1 {8 q
C.精确测算脚本不同部分的运行时间
; j- F, d" ^# FD.计算脚本通过web服务器执行时的维度# D& \0 E& e# ^
E.扫描脚本,识别由常见错误导致的bug: M+ n3 l' L+ ^
& c- A, O7 d4 L! y5 v& g! U* \4 |% ]
# y( j* j: v# }13.______能帮助识别和解决bug。5 r* A4 o: L- D0 x
5 G P" ]% i+ n. U5 f
答案:____________
1 [3 C J, f, _3 L
7 h Z7 S/ m7 S. X0 \! h, j1 e/ }( D' c0 `
14.trigger_error()和user_error()有什么区别?, ]" k* W- a; E- N
1 M1 ~! W7 _% S4 d" b7 |) J+ S4 PA.trigger_error()允许脚本抛出系统级的错误
2 ~! z( P# _7 G- f) t* I2 GB.user_error()允许脚本抛出系统级的错误- h( I7 }& l, W+ n# L( I% K
C.user_error()不能被用在错误管理器中
- ^2 o& `% E# R2 WD.trigger_error只在PHP5中可用) h9 U' P. s. d
E.没有区别
" }9 w& ^; L! @! R5 G8 k
$ j+ o) z& p0 B: S$ q( F
+ ^) U: P j3 C' m+ S15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
/ s/ s* a- X3 v0 o; `& I
4 N: v7 F0 j) s) O) a) lA.print_r
( f" z. P9 d% [* O- _" @; rB.var_dump
N3 F* d4 H4 |9 v' G( TC.stack_dump
% i6 w( y( E" M' T X* ] AD.debug_backtrace* P( b* c4 j. s/ L
E.以上都不对$ i* {- F/ F/ O6 x1 z
! Y* E! G2 V3 c& y' F* ~
答案
. I, Q8 { b8 E; h5 x7 |: C# g
1 |5 T$ U7 H; y/ m. r1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
1 H+ A h; [: b& q1 l& Q G* D' u9 f2 ]
( {, [( n2 c m1 I( X, V1 @2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。- K6 s9 q$ }! N# m0 V9 O
9 q$ }" l' M# p) A3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
! x: [$ i" d' z* r0 e K
8 |3 f4 W t0 z4.这是在描述===操作符。 ]7 q: C) q3 q0 y+ g& E7 O
+ A3 I8 ~; i; _# ?
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。
7 ?. G) @$ {' [! z& ~! U, |$ K Y* R) D5 c8 e; q
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
, p1 V i$ d( v# ^4 Z+ t
+ e2 E6 ?) `3 l' }! w! t i7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。' {+ A/ J7 x: K- \2 Y/ t2 c
! X I& _2 k+ Z' j
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。- @' H2 U1 q, I. j- L& C
% S# R9 K+ B1 ~' x% T9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。' U1 r* g- _$ G, ]. F: m7 t3 X- V
& Q- u8 |! h' u# K$ ?, U% F
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。! L% e1 C5 \: p) l0 w% S! m
: [8 y3 F: |" Q+ B9 {2 l
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。; Z% e# X- c% \' S, T6 S
: C" W! `& d2 p$ E M
12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。" @9 T3 e9 F, d* B
5 O) L' ]; Q" x( V, T7 ^
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。$ y2 y1 d: ^/ S# L% `* r
+ x% k6 \ f' l1 z1 [9 V
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。
7 c; l; T B( M( C' ^0 d; W
( d( ?+ B4 N# X/ U; F) h9 ^; E15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|