返回列表 发帖

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

作为一个开发者,无论你经验多么丰富,或者无论你多么努力,你的程序中总会有bug。这是生命中一个必然的部分,如同死亡与缴税(尽管并没有后面两个那么严重)。# F) ?0 |, Z: v& |- V& }# p$ \
要想解决bug,首先要能找到bug。事实上,许多开发者花费了无数小时茫然得盯着代码,只是因为他们没有把程序的容错能力摆在首位。忽略了这个部分,那么期望一个没有bug的程序就是——不可能的。5 E7 L* V' J# ~6 s3 z
本章测试题将考察你对调试和性能管理相关知识的了解,以及如何用PHP做好这两件事。  }- N$ _1 @. l/ k
: K- \* w9 A- }* w0 A
3 q( B6 F  y2 f1 d
问题4 b; P$ F) `+ N5 a

$ ^; G9 i9 o& Z* V1.以下脚本如何用三元操作替代?
% N8 E* Y- f" ~' q% E9 z; z

  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. ?>
复制代码
8 O4 y7 j! F: n2 o- n% g" Z
A.$x = ($a A. < 10 || $b > 11 || $c == 1 && $d != $c) ? 0 : 1;- C' Z: A& g" F! N
B.$x = ($a < 10 || $b > 11 || ($c == 1 && $d != $c)) ? 0 : 1;2 x, F$ p: V; {# |0 H; s* _( X
C.$x = (($a < 10 && $b > 11) || ($c == 1 && $d != $c)) ? 0 : 1;$ l) M" m. K, Y# L
D.$x = ($a < 10 && $b > 11 && $c == 1 && $d != $c) ? 1 : 0;3 n' R6 i! v& l1 |) d2 m
E.以上都不对
1 m# Z8 [" x1 S0 z% E8 e) J& R/ Y6 q5 T( w7 P7 V

( C, K- J8 l  R  [2.有一个脚本由于要从远程获取数据,因而运行速度很慢,以下那种方法能对其进行优化?(双选)7 b. d. L+ J  w% i" W

0 M7 _5 U8 T3 LA.安装操作码缓存(opcode cache)
. E- L- Y9 P- [# d7 ^5 SB.优化或者升级你的网络连接$ T3 ~7 O' m; Y9 a1 }
C.添置更多的硬件  S- _2 ]- Z9 o+ F" j' S1 X, z
D.增加服务器的可用RAM) s5 g9 ~* O$ {# ]
E.使用连接缓存
" P5 h# C4 M* p& h1 Z: K
+ E# \* Z8 x. n( h, i* {8 V: y7 q9 n5 R  F2 x4 T- p. \& m
3.架设生产环境下的服务器时,需要做哪些步骤?(双选)
/ V0 v+ N( h; J6 T- f+ o9 ^' ?' V! O4 C+ @% Q! t
A.关闭错误报告
) x4 m9 N7 h) b% S$ UB.打开错误日志
% v7 P# ^# z) c  O9 }7 I) o) vC.关闭错误日志$ h4 Z) F2 s/ S& M& [* k$ O
D.关闭错误显示! I( ]$ f. m# U
E.使用@抑错符
5 |* p: X- z8 [; c. N$ c! F9 Z7 s" Y! j* W# @8 h( A
/ U8 r$ X( ?9 o' x6 j
4.______操作符能对操作数的数据类型进行严格的比较?
" ^* a1 L) t; v2 e3 Z
$ u' U' i" j: V答案:____________" `! s) q3 G  ^3 k6 B

* B( r% |8 [% F( r% t) J: E! c8 t) }# u$ N! h% a
5.操作码缓存(opcode cache)能做什么?
' D# F% w8 M& s8 q3 C$ X' S2 a3 N3 U' W9 n: r' E. c1 F
A.把脚本编译成二进制对象,使它运行得更快
! ^2 |8 l) c3 ?4 W: }B.代替Zend引擎加快解释器的运行
2 e' N, f( z& }, u- r" v0 EC.缓存脚本输出以提高执行效率, \  }- m, G! M7 @( ^  ?) c5 B- [
D.缓存解析器产生的中间码,以提高运行效率4 I3 q1 T' ~$ ^% W- r% G2 [
E.在内存中缓存脚本,减少从硬盘中读取的次数; B$ B+ {, q4 ~' |6 A' D

! v: {+ O3 I! Z) A" u& t: R, u0 L
6.以下哪些情况容易造成系统资源枯竭?(双选)9 N* K0 W7 o+ q. r% C  S
! i# x" i8 R7 f6 |9 @& @
A.RAM太小0 r$ U, b8 S. Q7 n0 q  V# h
B.使用了低带宽的连接) A9 ?# v) `/ X
C.虚拟内存超过2GB* m2 o" [9 l# q
D.允许同时运行太多的服务器进程; Y" i$ b& G; Z& I7 Z+ b2 `+ b" O. h' {* a
E.以上都不对% q: b) N- ?% w2 v
$ F3 M- q% l* g/ E, k2 }

& ^9 {/ H* g8 `4 f7.以下脚本缺了些什么?(双选)
2 D2 o: y/ M5 L! e8 M- @7 l# S

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

3 e0 B4 h" J* zA.参数出口(Parameter escapement)6 H) E7 s# i' s* x% W
B.输出格式化
6 p0 \  n+ V$ I9 \9 b8 [$ M/ @C.错误检查
5 ^0 y$ N4 t2 T* dD.一个SQL查询
$ n, [. h4 K; TE.以上都不对, C9 c0 n: G3 {9 U+ Y' T
6 Q$ ^7 Q, M+ l# F

% u7 v6 ]( S" g2 |8 N1 h" f8.以下那种错误类型无法被自定义的错误处理器捕捉到?(双选)
, D+ `( B% Q6 b0 }
% @$ X; ?2 K- P& ~2 VA.E_WARNING- f  X8 g) d- `$ K1 U
B.E_ERROR
- t: s; g# J% B1 y  @* AC.E_USER_ERROR5 y5 {9 m) [7 S/ x8 W5 R- J- ]0 [
D.E_PARSE  ~" @, B* d+ o* C8 }" \* Y  Y
E.E_NOTICE. X/ {9 f! z, d) I

) w9 B* r% x& ]; A& p, v5 U% g
2 @- m9 o) f* [& z- V9.当需要比较一个常量和一个变量时,如何才能保证不会错弄成赋值?4 U7 \/ J/ E, W$ Q" c$ |
$ o6 H: ]& R& g$ O- {# g
A.把变量转换成int1 @$ \9 M1 V, p$ N8 m
B.使用全等比较符(===)
( g4 X4 U5 a0 _5 W- cC.确保常量是第一个操作数
# S0 a4 p6 `$ R) g6 j) T+ R; cD.使用三元运算符
7 [: e8 ?2 f; Z6 |E.用括号把操作包起来
) r$ W4 M0 F2 M. n7 D, e2 f" u
6 }) K2 Q1 V: i+ d6 B4 P9 W  Y# R% c- D+ K) J: z
10.要通过邮件给系统管理员发送错误信息,以下那种方法最简便?& h* F9 x; N+ \$ L' ^* e( W9 z
- I8 _# t7 V. u; T  Q
A.创建一个连接远程SMTP服务器的函数
8 F+ \  ]% u4 @. P3 vB.使用mail函数" x7 i4 V) r+ \+ j( b2 A
C.使用error_log函数
4 `# @7 n* ~( x6 WD.调用sendmial程序: c9 h3 X# x# a& M$ a
E.使用webservice9 d. h8 N1 m% g( K% k6 Q- {
4 i6 c! P; N+ L% M1 @2 w) g; C" x1 `

2 a, ?$ C+ x& J. f( P% g11.能否仅调用一个函数就关闭脚本内所有的错误报告?% d* q1 Y! ]6 I5 `4 @) j* B9 [

3 r$ W- c. ~# h* fA.能
) m! |1 `+ x% c0 U2 @! R& b% wB.不能+ k8 U/ r8 W8 R5 Z: }

1 w) U6 p. U* h3 O9 |; y1 r. |# x* e: ^) |( F
12.概要分析器(profiler)是做什么的?
; Z5 h& R$ L  R6 e2 g) U9 K
! B) B  B6 I, \+ F# G6 lA.创建关于脚本结构的档案9 K* P$ @( u0 Y" t# b' X1 g
B.把脚本转化成UML图! f; X: _3 u* ]$ H5 K4 U, l) w. x
C.精确测算脚本不同部分的运行时间
% V& F+ P$ I1 U1 L) {7 P5 q( UD.计算脚本通过web服务器执行时的维度$ L/ V4 K! a4 D0 X# a
E.扫描脚本,识别由常见错误导致的bug
1 z; }1 H- a- S+ @2 E$ Z& d9 b7 [
$ H+ b. }6 @6 m/ M0 _3 z; z# z8 b4 i) o% y2 u/ ]! [2 N
13.______能帮助识别和解决bug。
0 B9 Y# s3 P. z8 Q/ ~1 V
" {! f) F8 U, t+ O答案:____________
' P/ @) T& L. g. h* t6 Z
$ h, Z$ B: v* h+ _* V; f; R) w
6 O/ m$ Y3 X1 A0 A14.trigger_error()和user_error()有什么区别?
$ X" b1 Y9 m4 B+ C% G; T7 p5 l0 P. D% e( O+ b- e
A.trigger_error()允许脚本抛出系统级的错误
  L* W% x+ |" x( C9 h( Q& w' fB.user_error()允许脚本抛出系统级的错误
1 l8 T' A$ U6 |; aC.user_error()不能被用在错误管理器中" b9 r# |9 o* c
D.trigger_error只在PHP5中可用
5 C# m$ K! P, ~. hE.没有区别) U% K0 J3 h  \* ?' P% p, J
- t0 O; z6 u* o4 @8 g

) c& r! R8 j3 [0 v: q( V15.______函数能返回脚本里任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。
$ V* T- ~( R2 I  [% s" a) N
* E1 [8 D, x" G9 m, r9 b5 oA.print_r" N) c4 D: v1 O
B.var_dump
; ~5 i/ v& o2 _  I7 ?9 L; g- ]( YC.stack_dump
$ f( N) e6 F4 R+ nD.debug_backtrace
. ~# d# k& J& |# j* oE.以上都不对9 W$ v3 v, X1 [5 G! h* d
4 G* g3 [8 ?& x) R- q& t: W+ c. j
答案
9 K; x2 V# l- Y; I+ Q, g: o6 U* V
# H: U, E2 i# u* U' t5 \$ g1.答案是E。三元操作符把每个if语句连到一起,作为&&操作的一部分。然而本题中,$x=1这个赋值只在第三个if为false时发生。如果第一个和第二个条件都不成立,$x=1就不会执行。这题对三元操作的应用有些极端,实际应用时,需要根据可读性来决定是否需要用三元运算符(本题这种情况就最好不要用)。
% D9 R- G4 h, b# E2 i* i
( r; f' S9 l4 s# J2.问题是由第三方数据源传输缓慢导致的,而你无法控制这个数据源。你也许能在网络连通性上做些工作(假设问题出在你这一边)。还可以对接收到的内容进行缓存,这样能减少获取重复数据的时间。因此,答案是B和E。
$ u  i! E+ Q8 a0 K/ d" y. `3 l$ m3 d0 A& l
3.正确的选择是B和D。如果关闭错误报告、使用@抑错符和关闭错误日志,那么在你交付给客户的网站出现问题时,你将很难进行分析和调试。) j3 w" H' a  u) f7 J8 h3 v
* B6 t4 x- Y3 ^! `+ w/ W$ V! C
4.这是在描述===操作符。2 }/ y: Z3 x: O% Y3 y  `5 Z7 C
5 C5 o% y) B7 a
5.正确答案是D。PHP脚本在执行时,将首先被解析成“中间”码(也叫opcode,操作码),然后解释器执行。操作码缓存出现在这两个步骤之间,对解析器的输出进行缓存。下次执行该脚本时,将缓存的输出直接送入解释器。这样就就不需要再解析一次了。+ W  T9 F( P. {- r0 ]3 Q& g0 b5 j

: j3 g& U% ]6 w3 a8 ^6 _. n4 t6.正确答案是A和D。如果RAM太小,进程间将出现资源竞争,服务器将大量使用硬盘交换。同样的,如果允许过多进程同时执行,也会使服务器频繁进行交换,导致速度下降。9 f; G2 t0 W( h, t: Y) X% R
5 L2 K( N; G; w- e4 f
7.正确答案是A和C。脚本不检验datebase_query()的调用是否成功,因此将持续执行下去,最终产生错误。此外,$my_id参数没有转义——可能导致代码注入(详见第11章)。: \% y7 H. o4 d# ?

" Y" N3 R% o4 k2 w: B8.答案B和D正确。出现解析错误往往表示脚本中有语法错误,自定义的错误管理器无法捕捉到它们的原因很明显:错误管理器在脚本里,而现在无法解析脚本,管理器也就无法执行。类似的,E_ERROR表示有致命的运行错误出现,比如内存耗尽。因此脚本会立刻被中断,因为解释器无法执行后面的代码。
! N6 b3 w  ?# a: q$ t/ M( {2 e  z* u+ h/ ]9 `, }6 N
9.答案是C。比较操作是一个可交换的操作(就是说结果独立于操作数之外),而赋值不是。因此,比如说,$a==10和10==$a是等效的,而$a=10和10=$a却不是,而且后者会导致一个错误,因为这不是一个合法的操作。确保常量在操作符前面,能保证你不会错误得将比较变成赋值。3 g' e: z7 P. q3 ]
* Z2 N. ~- o$ e$ H) p% `
10.答案是C。error_log函数能将信息送往一个指定的地址。尽管mail()也可以用,但error_log能自动给邮件添加标题,因此这才是最简单的方法。
) n/ N: N% j" U4 q$ W/ L  v% d" k. U) K. M" O
11.答案是不能。error_reporting函数能关闭所有运行时的错误报告,但对解析时的错误无效,因为解析错误发生在脚本执行之前。" N$ S5 w! C* v

/ c2 s9 ]& E5 C. {3 a12.显然,答案是C。概要分析器(profiler)能监视脚本的运行,并记录单个部分的运行时间。它可以用来找出和解决瓶颈。% M/ m% W; z; A5 m/ x

1 }' W4 J7 [# G  _+ @* y13.这是对调试器的完美定义!你可以用调试软件监视脚本运行,同时分析系统资源消耗,从而发现和解决程序缺陷。% u$ T4 Y& [: ~5 G! M. X( H8 ^+ W

" W3 Q- f! ]* j2 G" ]. ^1 r14.trigger_error()和user_error()之间没有区别。后者其实是前者的别名。8 G7 Q& _/ H1 Q7 O2 C
: X/ `" C% q; L! f& F4 A6 F0 C
15.答案是D。题目是在描述debug_backtrace函数,它返回一个由所有在代码的特定位置调用过的函数名组成的数组。

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