search
Homephp教程php手册PHP5+引进$GLOBALS延迟初始化的概念

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

Jun 13, 2016 am 10:54 AM
servercodeuseinitializationDelaytidyconceptof

今天整理代码想使用$GLOBALS['_SERVER']来替代$_SERVER来访问相关的环境变量,总是会报“_SERVER undefined”错误。如下用例:

 

用例1:

 

 

print_r($GLOBALS);

此时输出中并没有_SERVER相关信息:

 

Array

(

    [GLOBALS] => Array

 *RECURSION*

    [_POST] => Array

        (

        )

 

    [_GET] => Array

        (

        )

 

    [_COOKIE] => Array

        (

        )

 

    [_FILES] => Array

        (

        )

)

用例2:

 

 

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

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

SublimeText3 English version

SublimeText3 English version

Recommended: Win version, supports code prompts!

WebStorm Mac version

WebStorm Mac version

Useful JavaScript development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version