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

飘逸的风14年前 (2013-01-26)程序5889
今天在使用$GLOBALS['_SERVER']来替代$_SERVER来访问相关的环境变量,总是会报“_SERVER undefined”错误。如下用例:   

用例1:
    <?php
    print_r($GLOBALS);
    此时输出中并没有_SERVER相关信息:
    Array
    (
    [GLOBALS] => Array
    *RECURSION*
    [_POST] => Array
    (
    )
    [_GET] => Array
    (
    )
    [_COOKIE] => Array
    (
    )
    [_FILES] => Array
    (
    )
    )


用例2:
    <?php
    print_r($GLOBALS);
    print_r($_SERVER);
    此时输出中含有_SERVER相关信息:
    Array
    (
    [GLOBALS] => Array
    *RECURSION*
    [_POST] => Array
    (
    )
    [_GET] => Array
    (
    )
    [_COOKIE] => Array
    (
    )
    [_FILES] => Array
    (
    )
    [_SERVER] => Array
    (
    )
    )
    查了下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!)www.2cto.com
    718 ; When enabled, the SERVER and ENV variables are created when they're first
    719 ; used (Just In Time) instead of when the script starts. If these variables
    720 ; are not used within a script, having this directive on will result in a
    721 ; performance gain. The PHP directives register_globals, register_long_arrays,
    722 ; and register_argc_argv must be disabled for this directive to have any affect.
    723 ; https://php.net/auto-globals-jit
    724 auto_globals_jit = On
    终于弄明白了,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也只会在第一次使用时才会创建。

FROM:https://www.php100.com/html/webkaifa/PHP/PHP/2013/0124/11987.html

相关文章

php_curl扩展模块无法正常加载的处理方法

好不容易通过自己的学习动手写了一套网站自动收录的程序,正当我把源码都传到服务器作演示和大家共享的时候,忽然发现网址无法正常添加,提示错误Fatal error:Call to undefined fu...

二十一个实用便利的PHP代码摘录

1. PHP可阅读随机字符串 此代码将创建一个可阅读的字符串,使其更接近词典中的单词,实用且具有密码验证功能。 /************** *@length - length of rand...

MemCache安装使用

Windows下的Memcache安装: 1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached 2. 在终端(也即cmd命令界面)下输入 ‘c:\me...

Emlog常用日志列表页的判断

  Emlog 用得久了,emer 们就难免会折腾一下自己的模板,谁让 Emlog 这么简单实用呢?除了折腾外观及各种特效,当然还有实用的功能,日志列表页的判断应该就属于此类。我们可以根据日志列表页面...

PHP给图片添加水印和生成缩略图函数

给图片添加水印: /************************************ 函数: watermark($bigimg, $smallimg, $coord = 1) 作用:...

ECShop设置模板的原理以及一些模板设置函数说明(个人观点)

ECShop设置模板的原理以及一些模板设置函数说明(个人观点) admin/includes/lib_template.php 一些函数及变量说明 $template_files...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。