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
个文件,即
- for
CLI
运行 php -i
- 为
CGI
创建一个只有内容 <?php echo phpinfo();
的文件 phpinfo.php
并在网络浏览器中打开它。
比较结果并查看加载了哪些 modules
and/or 加载了哪些 .ini
文件。
找到错误日志后,我就找到了答案。这是一个 Linux 权限设置,运行 以下命令修复了它:
setsebool -P httpd_can_network_connect on
用一行代码创建了 .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
个文件,即
- for
CLI
运行php -i
- 为
CGI
创建一个只有内容<?php echo phpinfo();
的文件phpinfo.php
并在网络浏览器中打开它。
比较结果并查看加载了哪些 modules
and/or 加载了哪些 .ini
文件。
找到错误日志后,我就找到了答案。这是一个 Linux 权限设置,运行 以下命令修复了它:
setsebool -P httpd_can_network_connect on