我被错误困住了
directive 'register_globals' is no longer available in PHP in unknown on line 0
在 php.ini 文件中启用后,尝试使用“php -v”检查 php 版本register_globals
。这样做并没有得到任何 php 版本信息。相反,它抛出了上述错误。关闭此选项后,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
答案1
来自文档:
该功能自 PHP 5.3.0 起已被弃用,并自 PHP 5.4.0 起已被删除。
您可以降级 PHP,或者register_globals
从 php.ini 文件中删除并修复引用它的任何代码。后者更可取。
答案2
指令注册全局变量从 PHP 5.3.0 开始已弃用,并从 PHP 5.4.0 开始删除(原因很简单:如果您没有创建高质量的代码,它很容易导致安全漏洞)
你不能在 PHP 5.4 中不再启用 register_gobals 选项。因此,如果您确实需要在某些脚本中将所有变量注册为全局变量,则需要模拟旧行为:
创建脚本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, e.g. '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"); ?>