在php中的register_globals错误

我被卡住的错误

directive 'register_globals' is no longer available in PHP in unknown on line 0 

当试图在php.ini文件中启用register_globals后,使用“php -v”检查php版本。 我没有得到任何PHP版本信息这样做。 相反,它会抛出上述错误。closures此选项后,PHP信息工作得很好。 对于我来说,开启register_globals是非常重要的。我可以如何纠正这个问题。

我的php.ini如下所示:

 ; Default Value: None ; Development Value: "GP" ; Production Value: "GP" ; http://php.net/request-order request_order = "GP" ; Whether or not to register the EGPCS variables as global variables. You may ; want to turn this off if you don't want to clutter your scripts' global scope ; with user data. ; You should do your best to write your scripts so that they do not require ; register_globals to be on; Using form variables as globals can easily lead ; to possible security problems, if the code is not very well thought of. ; register_globals = On ; Determines whether the deprecated long $HTTP_*_VARS type predefined variables ; are registered by PHP or not. As they are deprecated, we obviously don't ; recommend you use them. They are on by default for compatibility reasons but ; they are not recommended on production servers. ; Default Value: On ; Development Value: Off ; Production Value: Off ; register_long_arrays = Off ; This directive determines whether PHP registers $argv & $argc each time it ; runs. $argv contains an array of all the arguments passed to PHP when a script ; is invoked. $argc contains an integer representing the number of arguments ; that were passed when the script was invoked. These arrays are extremely ; useful when running scripts from the command line. When this directive is ; enabled, registering these variables consumes CPU cycles and memory each time ; a script is executed. For performance reasons, this feature should be disabled ; on production servers. ; Note: This directive is hardcoded to On for the CLI SAPI ; Default Value: On ; Development Value: Off ; Production Value: Off ; register_argc_argv = Off ; When enabled, the SERVER and ENV variables are created when they're first ; used (Just In Time) instead of when the script starts. If these variables ; are not used within a script, having this directive on will result in a ; performance gain. The PHP directives register_globals, register_long_arrays, ; and register_argc_argv must be disabled for this directive to have any affect. ; auto_globals_jit = On 

从文档 :

这个特性自PHP 5.3.0开始已经被拒绝,从PHP 5.4.0开始已经被删除了。

您可以降级PHP,或从您的php.ini文件中删除register_globals ,并修复引用它的任何代码。 后者是可取的。

register_gobals指令从PHP 5.3.0开始已经被取消,从PHP 5.4.0开始已经被取消了(原因很简单:如果你没有创build高质量的代码,很容易导致安全漏洞)

不能在PHP 5.4中启用register_gobals选项。 所以,如果你真的需要在一些脚本中注册全局variables,你需要模拟旧的行为:

创build脚本php5.4-workaround.inc.php

 <?php // workaround for register_globals PHP 5.4: /** * function to emulate the register_globals setting in PHP * for all of those diehard fans of possibly harmful PHP settings :-) * @author Ruquay K Calloway * @param string $order order in which to register the globals, eg 'egpcs' for default */ function register_globals($order = 'egpcs') { // define a subroutine if(!function_exists('register_global_array')) { function register_global_array(array $superglobal) { foreach($superglobal as $varname => $value) { global $$varname; $$varname = $value; } } } $order = explode("\r\n", trim(chunk_split($order, 1))); foreach($order as $k) { switch(strtolower($k)) { case 'e': register_global_array($_ENV); break; case 'g': register_global_array($_GET); break; case 'p': register_global_array($_POST); break; case 'c': register_global_array($_COOKIE); break; case 's': register_global_array($_SERVER); break; } } } register_globals(); ?> 

在debian php.ini include_path包含/usr/share/php所以如果你把你的脚本放在那里,你可以将它包含在你需要的所有脚本中:

 <?php include("/usr/share/php/php5.4-workaround.inc.php"); ?>