PHP file_get_contents() 和curl_exec() 在网站上失败,但在命令行上工作
使用一行代码创建了 .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,并且在版本 3.0.1 中启用了 OpenSSL
我也尝试过使用 http: URL
我也尝试过使用 curl .php 文件中的 () 库和这些库以相同的方式失败。
如果从 .php 文件调用 php -v 或另一个 .php 文件,则从 .php 文件调用 exec() 有效,但如果调用 curl 则无效
不确定是什么否则要尝试,所以我可能会再次对整个服务器进行核攻击。
更新:在 /var/log/nginx/error.log 中找到此内容 FastCGI 在 stderr 中发送:“PHP 消息:PHP 警告:file_get_contents(https://checkip.amazonaws.com): 无法打开流:权限被拒绝
现在怎么办?
Created .test.php file with one line of code:
<?php
var_dump(file_get_contents('https://checkip.amazonaws.com'));
?>
When I open .test.php from browser, it shows bool(false) but when I run it from command line, it shows my WAN IP as expected.
php -f .test.php
I am using CentOS 9, nginx 1.20.1, and PHP 8.1.3 (Although I've also tried RHEL8 and Apache)
I tried setting /etc/php-fpm.d/www.conf to use my userid and group to make sure it was not a permission problem.
phpinfo() shows allow_url_fopen is set to On and that curl 7.76.1 is enabled and that OpenSSL is enabled with version 3.0.1
I also tried with an http: URL
I also tried using curl() libraries in the .php file and those fail in the same manner.
Calling exec() from .php file works if it calls php -v or another .php file but not if it calls curl
Not sure what else to try, so I will probably nuke the whole server again.
UPDATE: Found this in /var/log/nginx/error.logFastCGI sent in stderr: "PHP message: PHP Warning: file_get_contents(https://checkip.amazonaws.com): Failed to open stream: Permission denied
Now what?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
命令行解释器/接口
CLI
与通用网关接口CGI
中使用的 PHP 环境可能有不同的设置。首先比较两个环境中加载的
.ini
文件,即。CLI
运行php -i
CGI
创建一个仅包含内容的文件
并在网络浏览器中打开它。phpinfo.php
?php echo phpinfo();比较结果并查看加载了哪些
模块
和/或加载了哪些.ini
文件。There might be different settings of your PHP environment used in Command Line Interpreter/Interface
CLI
vs Common Gateway InterfaceCGI
.First compare what
.ini
files are loaded in both environment, ie.CLI
runphp -i
CGI
create a filephpinfo.php
with only content<?php echo phpinfo();
and open it in the web browser.Compare the results and see what
modules
are loaded and/or what.ini
files are loaded.一旦我找到错误日志,我就能找到答案。这是一个 Linux 权限设置,运行以下命令修复了它:
setsebool -P httpd_can_network_connect 上
Once I found the error log, I was able to find my answer. It was a Linux permission setting and running the following command fixed it:
setsebool -P httpd_can_network_connect on