PHP5+引进$GLOBALS延迟初始化的概念
作者:zhanhailiang 日期:2013-01-18
今天整理代码想使用$GLOBALS[‘_SERVER’]来替代$_SERVER来访问相关的环境变量,总是会报“_SERVER undefined”错误。如下用例:
用例1:
<span class="kw2"><?php</span> <span class="kw3">print_r</span><span class="br0">(</span><span class="re0">$GLOBALS</span><span class="br0">)</span><span class="sy0">;</span>
此时输出中并没有_SERVER相关信息:
<span class="kw3">Array</span><span class="br0">(</span> <span class="br0">[</span>GLOBALS<span class="br0">]</span> <span class="sy0">=></span> <span class="kw3">Array</span> <span class="sy0">*</span>RECURSION<span class="sy0">*</span> <span class="br0">[</span>_POST<span class="br0">]</span> <span class="sy0">=></span> <span class="kw3">Array</span> <span class="br0">(</span> <span class="br0">)</span> <span class="br0">[</span>_GET<span class="br0">]</span> <span class="sy0">=></span> <span class="kw3">Array</span> <span class="br0">(</span> <span class="br0">)</span> <span class="br0">[</span>_COOKIE<span class="br0">]</span> <span class="sy0">=></span> <span class="kw3">Array</span> <span class="br0">(</span> <span class="br0">)</span> <span class="br0">[</span>_FILES<span class="br0">]</span> <span class="sy0">=></span> <span class="kw3">Array</span> <span class="br0">(</span> <span class="br0">)</span><span class="br0">)</span>
用例2:
<span class="kw2"><?php</span><span style="color:#333333"> </span><span class="kw3">print_r</span><span class="br0">(</span><span class="re0">$GLOBALS</span><span class="br0">)</span><span class="sy0">;</span><span style="color:#333333"></span><span style="color:#ff0000"><span class="kw3">print_r</span><span class="br0">(</span><span class="re0">$_SERVER</span><span class="br0">)</span><span class="sy0">;</span></span>
此时输出中含有_SERVER相关信息:
<span class="kw3">Array<div>)本文来源gaodai.ma#com搞#代!码网_</div><strong>搞代gaodaima码</strong></span><span style="color:#333333"></span><span class="br0">(</span><span style="color:#333333"> </span><span class="br0">[</span><span style="color:#333333">GLOBALS</span><span class="br0">]</span><span style="color:#333333"> </span><span class="sy0">=></span><span style="color:#333333"> </span><span class="kw3">Array</span><span style="color:#333333"> </span><span class="sy0">*</span><span style="color:#333333">RECURSION</span><span class="sy0">*</span><span style="color:#333333"> </span><span class="br0">[</span><span style="color:#333333">_POST</span><span class="br0">]</span><span style="color:#333333"> </span><span class="sy0">=></span><span style="color:#333333"> </span><span class="kw3">Array</span><span style="color:#333333"> </span><span class="br0">(</span><span style="color:#333333"> </span><span class="br0">)</span><span style="color:#333333"> </span><span class="br0">[</span><span style="color:#333333">_GET</span><span class="br0">]</span><span style="color:#333333"> </span><span class="sy0">=></span><span style="color:#333333"> </span><span class="kw3">Array</span><span style="color:#333333"> </span><span class="br0">(</span><span style="color:#333333"> </span><span class="br0">)</span><span style="color:#333333"> </span><span class="br0">[</span><span style="color:#333333">_COOKIE</span><span class="br0">]</span><span style="color:#333333"> </span><span class="sy0">=></span><span style="color:#333333"> </span><span class="kw3">Array</span><span style="color:#333333"> </span><span class="br0">(</span><span style="color:#333333"> </span><span class="br0">)</span><span style="color:#333333"> </span><span class="br0">[</span><span style="color:#333333">_FILES</span><span class="br0">]</span><span style="color:#333333"> </span><span class="sy0">=></span><span style="color:#333333"> </span><span class="kw3">Array</span><span style="color:#333333"> </span><span class="br0">(</span><span style="color:#333333"> </span><span class="br0">)</span><span style="color:#333333"> </span><span class="br0">[</span><span style="color:#ff0000">_SERVER</span><span class="br0">]</span><span style="color:#333333"> </span><span class="sy0">=></span><span style="color:#333333"> </span><span class="kw3">Array</span><span style="color:#333333"> </span><span class="br0">(</span><span style="color:#333333"> </span><span class="br0">)</span><span style="color:#333333"> </span><span class="br0">)</span>
查了下PHP手册关于$GLOBALS描述,引用therandshow at gmail dot com的评论:
therandshow at gmail dot comAs of PHP 5.4 $GLOBALS is now initialized just-in-time. This means there now is an advantage to not use
the $GLOBALS variable as you can avoid the overhead of initializing it. How much of an advantage that is
I’m not sure, but I’ve never liked $GLOBALS much anyways.追根数源,发现PHP5Changelog更新日志的描述:
Unordered List ItemImproved Zend Engine, performance tweaks and optimizationsUnordered List ItemChanged $GLOBALS into a JIT autoglobal, so it’s initialized only if used. (this may affect opcode caches!)<span style="color:#333333"> </span><span class="nu0">718</span><span style="color:#333333"> </span><span class="co0">; </span><span class="co0" style="font-style:italic"><span style="color:#ff0000">When enabled, the SERVER and ENV variables are created when they're first</span></span><span style="color:#333333"> </span><span class="nu0">719</span><span style="color:#333333"> </span><span class="co0">; </span><span class="co0" style="font-style:italic"><span style="color:#ff0000">used (Just In Time) instead of when the script starts.</span></span><span class="co0"> If these variables</span><span style="color:#333333"> </span><span class="nu0">720</span><span style="color:#333333"> </span><span class="co0">; are not used within a script, having this directive on will result in a</span><span style="color:#333333"> </span><span class="nu0">721</span><span style="color:#333333"> </span><span class="co0">; performance gain. The PHP directives register_globals, register_long_arrays,</span><span style="color:#333333"> </span><span class="nu0">722</span><span style="color:#333333"> </span><span class="co0">; and register_argc_argv must be disabled for this directive to have any affect.</span><span style="color:#333333"> </span><span class="nu0">723</span><span style="color:#333333"> </span><span class="co0">; http://php.net/auto-globals-jit</span><span style="color:#333333"> </span><span class="nu0">724</span><span style="color:#333333"> auto_globals_jit </span><span class="sy0">=</span><span class="re2"> On</span>终于弄明白了,PHP5+中在开启auto_globals_jit = On情况下,$_SERVER变量和$_ENV变量不会在脚本启动时就创建,而是会在第一次使用$SERVER和$ENV时才会创建。所以就会出现上述两个用例的情况。
备注:
实测结论:
auto_globals_jit setting is also affecting $_REQUEST superglobal in 5.3 It is not explicitly stated in documentation.
至少5.3.13版本中开启auto_globals_jit = On情况下,$_REQUEST也只会在第一次使用时才会创建。