• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP5+引进$GLOBALS推迟初始化的概念

php 搞代码 4年前 (2022-01-24) 29次浏览 已收录 0个评论

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 com

As 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 optimizations

Unordered 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也只会在第一次使用时才会创建。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP5+引进$GLOBALS推迟初始化的概念

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址