PHP偶发性$_SERVER为空

偶发性PHP中$_SERVER为空,重启apache后可以恢复
php版本为7.1.31(cli) 在windows环境下安装
不能稳定重现,查看过apache和php的日志,未发现相关报错
windows系统日志中也没有相关报错

$_SERVER 是一个超全局变量,用于存储服务器和请求相关的信息。如果您发现 $_SERVER 偶尔为空,那么可能是由于以下原因之一所导致。

  1. 代理服务器问题

    如果您的 Web 应用程序在代理服务器后面运行,则有时可能会出现 $ _SERVER 变量中缺少某些值的情况。这是因为一些代理服务器不会将所有请求头信息转发到 Web 服务器,导致丢失一些 $_SERVER 中的值。如果您遇到这种情况,可以尝试直接访问 Web 服务器来解决此问题。

  2. Web 服务器配置问题

    如果您的 Web 服务器配置错误,也可能会导致 $_SERVER 变量中缺少某些值。例如,如果您使用 Nginx 和 FastCGI,在某些情况下 FastCGI 进程可能会意外退出并重新启动,这可能会导致 $_SERVER 变量中的值丢失。检查并修复您的 Web 服务器配置可能会解决此问题。

  3. 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://ask.csdn.net/questions/858015
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:windows安装apache和php并完成配置和代码测试
  • 除此之外, 这篇博客: php windows环境安装(图文版)中的 3、安装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后可以恢复。

这个问题的可能原因有:

  1. PHP配置问题。PHP的配置文件php.ini中可能存在问题,如更改了默认的变量赋值顺序等,导致$_SERVER变量无法正确获取。
  2. Apache配置问题。Apache的配置文件httpd.conf或PHP配置文件中PHP相关配置可能存在问题,进而影响$_SERVER变量。
  3. 第三方扩展或插件问题。如果安装了其他PHP扩展或Apache模块,可能与PHP或Apache有冲突,导致$_SERVER变量获取异常。
  4. 系统资源问题。如果系统资源如内存不足,可能导致PHP无法正常工作,影响$_SERVER变量。
  5. 其他软件或进程问题。其他运行在系统上的软件或进程可能与Apache或PHP产生冲突,影响$_SERVER变量。

针对这个问题,我的建议如下:

  1. 检查PHP配置文件php.ini,确保相关配置正确。如variables_order保持默认。
  2. 检查Apache配置文件及PHP配置,确保PHP配置正确加载。
  3. 尝试禁用其他PHP扩展和Apache模块,查看问题是否消失。如果消失,则这些扩展或模块可能存在问题。
  4. 重启系统和服务,释放系统资源。观察问题是否可重现。
  5. 查看系统进程和服务,尝试结束不必要的进程和服务。查看问题是否消失。
  6. 更新PHP和Apache到最新版本。旧版本的软件可能存在已知的相关问题。
  7. search引擎搜索"php $_server empty"等关键字,查看是否存在已知相关问题的解决方案。