|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14321
- 金币
- 2446
- 威望
- 1647
- 贡献
- 1394
|
[Zend权威认证试题讲解]第十二章 -调试与性能管理
作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。/ `& E7 U' d2 d6 h2 `: C* e
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。
) [5 i: Y) ~# D& K& h6 s/ _本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。
- e, O# I. g% W* r( {6 o% ]2 c
1 H& } C) Z: B9 o( z
问题$ I* M) p; ~8 R* i
# a: e$ p1 R7 [* b% w0 }. X! P1.以下脚本如何用三元操作替代? % p9 ?" _. X5 Z8 h, m7 w) p
-
- <?php
- if ($a < 10) {
- if ($b > 11) {
- if ($c == 10 && $d != $c) {
- $x = 0;
- } else {
- $x = 1;
- }
- }
- }
- ?>
复制代码
5 B( u- c' D% V0 S# u& EA.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;& E. p Y2 [% ]$ Y4 s6 B
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;# o$ h1 C! F! g5 u, B# |: u- Q
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;
' x( i7 t2 L1 F! \1 \D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;6 V1 Y0 ^/ q2 `6 N8 m+ V8 r2 W
E.以上都不对
" M* J7 l" ~8 ]/ }) w, n) D' _0 g; k6 t: I
9 t6 A- T, j* ?5 f# c2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)$ T6 ]& h8 x0 Y3 [; B& D1 f9 ~
, M7 V7 m# W2 K/ ^) `. B
A.安装操作码缓存(opcode cache)* T- |5 n" n: S+ m; T/ P0 `3 V
B.优化或者升级你的网络连接
+ D2 X8 ]5 d' d1 e' s+ k4 {1 a qC.添置更多的硬件
! u! i9 V% J1 gD.增加服务器的可用RAM8 L6 R1 y2 G, n2 O
E.使用连接缓存' I b1 w! Y: W5 k$ n) L2 P
) @, Q! D D1 { ~" N, Z
3 \, i1 g0 t: E; h) i; ^3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
( Q" v1 ^2 m. V/ R# ~7 l- _0 }* ?2 [: |+ p( j
A.关闭错误报告
* {$ U5 E5 c, y2 R3 bB.打开错误日志
. ]/ V( p. U$ d3 A6 E/ Z E( YC.关闭错误日志$ L) p5 C- n5 y- S. M: N
D.关闭错误显示2 B) i2 b5 V' P' K% m1 }2 s. f2 i
E.使用@抑错符
- L+ k8 c- O6 y, [# d! k/ `) L2 \4 l9 M) l! v: t
! V1 y& T \( Y Y
4.______操作符能对操作数的数据类型进行严格的比较?
- T% ^# v8 @0 w! P" g4 k
+ K" g' R8 @" b0 z0 ]8 A答案:____________& u; Q& O% k5 J# G
/ F! w; v5 w f w8 W: b
* O- ~% t2 v' y! Y5.操作码缓存(opcode cache)能做什么?
b3 \5 D. {6 B- s r$ L' a- j- Z+ c: |1 L6 D" K$ v
A.把脚本编译成二进制对象,使它运行得更快
4 Z* ]; K! [* a ^- {B.代替Zend引擎加快解释器的运行* M! t1 v3 D3 y5 H$ j; J Z7 P- L6 P, e
C.缓存脚本输出以提高执行效率
% x3 H, w0 k" k2 F* d; QD.缓存解析器产生的中间码,以提高运行效率; s3 O* P3 [7 J+ u- D! {) j6 g" m
E.在内存中缓存脚本,减少从硬盘中读取的次数$ }! a1 X. v' E) \! K E8 D
$ j$ _% K {! I; k; q* A9 [" Q9 A6 h- Y' ~6 ^% V
6.以下哪些情况容易造成系统资源枯竭?(双选)
0 r0 T+ K4 G7 I
8 o7 O, `% M3 p w7 g) W3 b- @A.RAM太小
" D( ]$ ]8 g1 j1 ~3 w6 }- @* ~B.使用了低带宽的连接
. Z: p, X( M6 a' A9 x! T0 R) g. g8 jC.虚拟内存超过2GB' M% p9 d2 e* e7 V3 S
D.允许同时运行太多的服务器进程
q5 g( c/ e, G) |$ ]# hE.以上都不对
; s4 B* L( H0 i* N6 {3 _* A+ ~) \' h+ B S+ k1 t5 [- z$ h! U
& h9 ]$ G: V% y+ ~7.以下脚本缺了些什么?(双选)
2 j' b. ?) c1 P/ `-
- <?php
- $rs = database_query ("select * from mytable where id = " .
- $my_id);
- while ($a = database_get_data ($rs)) {
- var_dump ($a);
- }
- ?>
复制代码
# k3 G5 ]" `+ z R4 O. j% b" Z6 g$ bA.参数出口(Parameter escapement)
8 ^: c' T6 ^; t7 u! @3 k$ ^; `B.输出格式化$ o0 ~6 q- e2 t: ?0 @+ v
C.错误检查0 o5 A+ y z1 x& @) w( [
D.一个SQL查询5 d1 F! n( t. {2 h8 }# e2 n/ M
E.以上都不对
+ J2 V& K0 f( o5 Z. k
: M$ [2 U! M- S/ x
" R' {4 T, C2 s; E& o9 M& [" K5 j8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)% R( p L. _4 V ] L ?
' x* m; i- S- y! W( _7 Q1 w
A.E_WARNING
7 A( S. z$ i6 [/ g! f+ KB.E_ERROR2 R& I- \* E! P
C.E_USER_ERROR. k1 ?& s7 w6 F6 T t
D.E_PARSE+ u0 k' R7 l. n2 m3 A0 p
E.E_NOTICE, k9 K; W* ^5 ?
4 G/ ~; |$ D- `2 n, Y5 D4 z4 g' c7 ^" q X, ?
9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?
3 V4 L7 X( `( L# S8 {( y7 h* k2 i1 @. Z* o* o
A.把变量转换成int
& n `5 k# h6 Z3 C; F& qB.使用全等比较符(===)
, E" d7 L( z8 qC.确保常量是第一个操作数! \8 h1 `$ A$ @4 y; b7 O/ z
D.使用三元运算符8 m( G/ I3 u3 q4 j3 q
E.用括号把操作包起来
) |9 ?+ A, T2 Q" q- y' _# f
3 V! b, A; l; q9 e( V
' N& e+ p0 L* ]3 v' w* _10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?4 C3 `/ i# K0 Z/ a& U; H" I! q4 ~
6 }2 O) ^! w- d
A.创建一个连接远程SMTP服务器的函数* X. _* y- Q, @& e* h8 [
B.使用mail函数7 O2 z4 V M: Y6 T
C.使用error_log函数
: X+ K! T3 w; vD.调用sendmial程序0 Q' N' _9 \6 W9 B, l& Z# q1 K
E.使用webservice# u4 ~8 S+ l- |; v! R
0 b2 K; {* f6 Y. d! h
6 }! ^) V- p+ t2 Y1 }11.能否仅调用一个函数就关闭脚本内所有的错误报告?+ E" H \! h) e4 S6 v# I
! ]/ E s5 T+ A$ d; B
A.能
5 B5 ?9 @1 t. Q3 b2 ]/ J& L# y: zB.不能& G1 M9 H# Q# {8 P; B6 B
6 _6 h' }# b/ c }2 f2 n) R D# T( e
12.概要分析器(profiler)是做什么的?6 G6 J" h3 }% L# m& E* p
+ ?& u9 J: R2 x7 L7 \A.创建关于脚本结构的档案( i' O" O+ |# o/ s% P2 G1 ?
B.把脚本转化成UML图( R( h) u5 b" J
C.精确测算脚本不同部分的运行时间; S$ k2 B* ]5 W7 W+ j
D.计算脚本通过web服务器执行时的维度. Z; v+ t- y) @
E.扫描脚本,识别由常见错误导致的bug
. x; w: F8 j g( P1 k! N! x4 ^
9 T/ I$ H( I& x# d
) {0 t, m4 [( v: K13.______能帮助识别和解决bug。
$ b. n! k/ C6 w8 |. p$ l
6 A9 h* t+ p) N答案:____________
. r w4 U8 ~" \: p4 l% y) v; {$ Y" Q: _3 x5 A' F
2 X7 B; }: d P, e, L6 e+ ?14.trigger_error()和user_error()有什么区别?
+ h1 `% n- ~$ f' ~/ Q
j& n% ~! A g# O g' o( RA.trigger_error()允许脚本抛出系统级的错误5 A3 \+ _5 i+ M! q- O: t/ l
B.user_error()允许脚本抛出系统级的错误
: p' N9 S7 F9 IC.user_error()不能被用在错误管理器中3 n# l" e7 E) o
D.trigger_error只在PHP5中可用 V( w3 U2 o5 \8 P
E.没有区别
' q) t& |. P# w+ G$ J
4 L9 z# m8 p+ l, m2 t$ q& V
: {2 m0 W7 A. b: W4 U+ ~15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。/ k" z+ A% O& B$ T0 d" t
, ?/ }% F+ ?% _) e* A/ ?; T3 `A.print_r" A) a# H4 ?) d( H. m1 ?
B.var_dump
9 C- a( b% c7 uC.stack_dump: |: X! E# B# H5 P6 a2 O
D.debug_backtrace+ @, D7 Z7 L* U8 t) W8 \# q( [
E.以上都不对
7 j( `$ q: o c2 K- ^+ s$ ?8 |- Z" {5 O6 c
答案7 o }# r J9 X* }5 f
' [9 g+ x9 [8 ]5 a8 d) U1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。( v/ B4 m. u9 F5 f x [6 ^
0 V0 q5 O# W0 S& u* X
2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
6 a* C3 M. G/ c. v' }& y ^! o3 B3 a% g( K4 x) p
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。
% m; k( B8 H. Q
1 B2 \. {7 J' L: @% B, @/ U' V" ~6 v4.这是在描述===操作符。
* u& [& y" Z: @* I' [, L0 R( l, ?3 F, d' x2 b* q3 J' I
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。0 K# s8 v7 ~/ c: q' g# l) I
3 P/ m0 |- G2 Q
6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。
* S' d0 c$ Z5 s* s" O) v: a, x5 v; n. v* E( O1 H8 G/ }
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。
8 ]- u' S+ b& ^; f8 K% K# W1 X }- Z( }
8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。* n# N: S0 y7 O
+ @3 h: Z9 ?8 h' d3 }9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。
8 n) m0 o9 @ N" Y7 v1 W# w# R, n, s8 S
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。$ u" v6 R- X) x1 A6 g' x
3 n( D3 X& `0 F! K5 g0 y* b! a
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。* f! T7 h$ H- I, Y/ E4 H) v
$ @9 s+ i( p/ k8 l9 j) O; L12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。
! P6 Q0 j0 W/ j) g" o( ~4 ~& d3 a9 S
13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。& m( t6 p& S4 o% {/ \4 ]
, x. H7 f- P9 ?
14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。# h) ^3 a2 \& I _
/ l }# V/ Y) I15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。 |
|