PHP file_get_contents() 和 curl_exec() 从网站失败但从命令行工作

PHP file_get_contents() and curl_exec() fail from website but work from command line

用一行代码创建了 .test.php 文件:

<?php
var_dump(file_get_contents('https://checkip.amazonaws.com'));
?>

当我从浏览器打开 .test.php 时,它显示 bool(false) 但是当我从命令行 运行 它时,它按预期显示我的 WAN IP。

php -f .test.php

我正在使用 CentOS 9、nginx 1.20.1 和 PHP 8.1.3(尽管我也尝试过 RHEL8 和 Apache)

我尝试设置 /etc/php-fpm.d/www.conf 以使用我的用户 ID 和组来确保这不是权限问题。

phpinfo() 显示 allow_url_fopen 设置为 On,curl 7.76.1 已启用,OpenSSL 已启用 3.0 版。 1

我也尝试过使用 http: URL

我也尝试在 .php 文件中使用 curl() 库,但它们以同样的方式失败。

从 .php 文件调用 exec() 如果它调用 php -v 或其他.php 文件,但如果它调用 curl

不确定还能尝试什么,所以我可能会再次核爆整个服务器。

更新:在 /var/log/nginx/error.log 中找到了这个 FastCGI sent in stderr: "PHP message: PHP Warning: file_get_contents(https://checkip.amazonaws.com): Failed to open stream: Permission denied

现在怎么办?

命令行 Interpreter/Interface CLI 与通用网关接口 CGI 中使用的 PHP 环境设置可能不同。

首先比较两个环境中加载的.ini个文件,即

  1. for CLI 运行 php -i
  2. CGI 创建一个只有内容 <?php echo phpinfo(); 的文件 phpinfo.php 并在网络浏览器中打开它。

比较结果并查看加载了哪些 modules and/or 加载了哪些 .ini 文件。

找到错误日志后,我就找到了答案。这是一个 Linux 权限设置,运行 以下命令修复了它: setsebool -P httpd_can_network_connect on