偶发性PHP中$_SERVER为空,重启apache后可以恢复
php版本为7.1.31(cli) 在windows环境下安装
不能稳定重现,查看过apache和php的日志,未发现相关报错
windows系统日志中也没有相关报错
$_SERVER
是一个超全局变量,用于存储服务器和请求相关的信息。如果您发现 $_SERVER
偶尔为空,那么可能是由于以下原因之一所导致。
代理服务器问题
如果您的 Web 应用程序在代理服务器后面运行,则有时可能会出现 $ _SERVER
变量中缺少某些值的情况。这是因为一些代理服务器不会将所有请求头信息转发到 Web 服务器,导致丢失一些 $_SERVER 中的值。如果您遇到这种情况,可以尝试直接访问 Web 服务器来解决此问题。
Web 服务器配置问题
如果您的 Web 服务器配置错误,也可能会导致 $_SERVER 变量中缺少某些值。例如,如果您使用 Nginx 和 FastCGI,在某些情况下 FastCGI 进程可能会意外退出并重新启动,这可能会导致 $_SERVER 变量中的值丢失。检查并修复您的 Web 服务器配置可能会解决此问题。
PHP-FPM 配置问题
如果您使用 PHP-FPM 来处理 PHP 脚本,则可能会出现由于 PHP-FPM 进程池设置的问题导致 $_SERVER 变量丢失的情况。例如,如果您将 pm.max_children
设置得太低,可能会导致 PHP-FPM 进程不足,从而导致 $_SERVER 变量丢失。增加 PHP-FPM 进程池的大小可能会有所帮助。
以上是可能导致 $_SERVER 变量偶尔为空的一些常见原因,您可以根据具体情况进行排查和解决。
在项目里面打印日志看看。
这种感觉就像是没有走到Apache那一层
可以试试看
看看你php.ini里的register_globals设置是on么?如果不是,修改后重启APACHE
引用ChaTGPT部分内容参考:
这种情况可能是由于Apache或PHP配置问题导致的。以下是一些可能的解决方案:
1、检查Apache配置文件中的PHP模块是否正确加载。可以在httpd.conf文件中查找以下行:
LoadModule php7_module "path/to/php7apache2_4.dll"
确保路径和文件名正确,并且没有注释掉。
2、检查PHP配置文件中的$_SERVER变量是否启用。可以在php.ini文件中查找以下行:
variables_order = "GPCS"
确保变量顺序中包含"S",即启用了$_SERVER变量。
3、检查Apache的错误日志文件,查看是否有任何与PHP相关的错误或警告。可以在httpd.conf文件中查找以下行:
ErrorLog "logs/error.log"
确保路径和文件名正确,并且Apache有权限写入该文件。
4、尝试使用PHP内置的Web服务器(如果您的应用程序允许)。在命令行中运行以下命令:
php -S localhost:8000
然后在浏览器中访问http://localhost:8000,查看是否仍然存在$_SERVER为空的问题。
5、如果以上解决方案都无法解决问题,建议升级到最新版本的PHP和Apache,并重新安装它们。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先我们需要了解 $_SERVER
是一个包含了执行脚本时全部HTTP头信息的数组,但如果 PHP 运行在 CLI 模式下,此数组将会为空。所以请确认你的 PHP 是以 FastCGI 模式运行(如在 Apache 中使用 mod_fastcgi),或者 PHP 运行在 Apache/PHP-FPM 模式下。
如果确认 $_SERVER 是应该被填充的,请尝试更新 PHP 版本或者查找在 PHP 的 bug tracker 中是否已经记录了此类 bug。
在代码中,以下是可以查看 $_SERVER 是否正常工作的示例:
<?php
if(isset($_SERVER['HTTP_USER_AGENT'])) {
echo 'User agent: ' . $_SERVER['HTTP_USER_AGENT'] . "\n";
} else {
echo 'HTTP_USER_AGENT not set';
}
?>
如果在输出中您看到了 HTTP_USER_AGENT not set
,则表示 $_SERVER 没有正确被填充。如果您能提供更多的上下文信息,例如是在执行什么脚本时出现此问题,以及 Apache 和 PHP 的配置,那么我们将可以给出更针对性的建议。
如果我的回答解决了您的问题,请采纳!
进入 https://windows.php.net/download 下载最新版本的zip安装包,注意:下载的PHP VC版本不能比前面安装的vc redist版高,并且需要thread safe版本。
进入PHP安装目录,复制一份php.ini-development 改名为php.ini 放到安装路径下
打开php.ini 找到"extension_dir",去掉注释符,将值改为"PHP安装路径\ext"
打开Apache的配置文件conf\httpd.conf,找到LoadModule区域,加入
# 在Apache中以module的方式加载PHP,“php7_module”中的“7”要和PHP的版本对应;
# 此外,不同的PHP版本“php7apache2_4.dll”可能不同。
LoadModule php7_module "PHP安装路径\php7apache2_4.dll"
# 告诉Apache PHP的安装路径
PHPIniDir "PHP安装路径"
查找 AddType application/x-gzip .gz .tgz,在其下一行添加代码:AddType application/x-httpd-php .php .html:声明.php和.html的文件能执行PHP程序。
测试:在 Apache安装路径\htdocs下新建文件:test.php,里面编辑:<?php phpinfo(); ?>, 启动Apache, 在浏览器输入:localhost:80/test.php
以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:
根据你的描述,这是一个偶发性的PHP $_SERVER全局变量为空的问题,重启Apache后可以恢复。
这个问题的可能原因有:
针对这个问题,我的建议如下: