微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 fopen() 中的某些访问模式会在我的新服务器上发出 PHP 警告?

如何解决为什么 fopen() 中的某些访问模式会在我的新服务器上发出 PHP 警告?

我正在将 PHP 脚本从 PHP 5.6.40(Apache 2.2.15 CentOS 6.10 服务器)迁移到 PHP 8.0.1(Apache 2.4.37 CentOS 8.3 ).

我在使用 fopen() 函数时遇到问题,该函数根据模式选项抛出警告。 我在网上搜索没有发现类似的问题...

在每台服务器上,我都拥有相同的上下文和相同的权限:

$ pwd
/export/PHP/logs/aita
$ ll
-rw-r--r--. 1 apache apache     33 27 janv. 15:30 testFopen.txt

我的测试脚本非常简单,它检查所有 fopen 模式:

<?PHP
$handle = fopen("/export/PHP/logs/aita/testFopen.txt",'r');  // line 2
$handle = fopen("/export/PHP/logs/aita/testFopen.txt",'r+'); // line 3
$handle = fopen("/export/PHP/logs/aita/testFopen.txt",'w');  // line 4
$handle = fopen("/export/PHP/logs/aita/testFopen.txt",'w+'); // line 5
$handle = fopen("/export/PHP/logs/aita/testFopen.txt",'a');  // line 6
$handle = fopen("/export/PHP/logs/aita/testFopen.txt",'a+'); // line 7
$handle = fopen("/export/PHP/logs/aita/testFopen.txt",'x');  // line 8
$handle = fopen("/export/PHP/logs/aita/testFopen.txt",'x+'); // line 9
$handle = fopen("/export/PHP/logs/aita/testFopen.txt",'c');  // line 10
$handle = fopen("/export/PHP/logs/aita/testFopen.txt",'c+'); // line 11

运行此脚本时,我获得:

在我的旧服务器 PHP 5.6.40 上

[error] [client x.x.x.x] PHP Warning:  fopen(/export/PHP/logs/aita/testFopen.txt): Failed to open stream: File exists in /export/html/aita_dev/testFopen.PHP on line 8
[error] [client x.x.x.x] PHP Warning:  fopen(/export/PHP/logs/aita/testFopen.txt): Failed to open stream: File exists in /export/html/aita_dev/testFopen.PHP on line 9

那些警告是合乎逻辑的(文件存在和排除)。

在我的新服务器 PHP 8.0.1 上

[proxy_fcgi:error] [pid 37251:tid xxxx] [client x.x.x.x:x] AH01071: Got error '
PHP message: PHP Warning:  fopen(/export/PHP/logs/aita/testFopen.txt): Failed to open stream: Permission denied in /var/www/html/aita_dev/testFopen.PHP on line 3
PHP message: PHP Warning:  fopen(/export/PHP/logs/aita/testFopen.txt): Failed to open stream: Permission denied in /var/www/html/aita_dev/testFopen.PHP on line 4
PHP message: PHP Warning:  fopen(/export/PHP/logs/aita/testFopen.txt): Failed to open stream: Permission denied in /var/www/html/aita_dev/testFopen.PHP on line 5
PHP message: PHP Warning:  fopen(/export/PHP/logs/aita/testFopen.txt): Failed to open stream: File exists in /var/www/html/aita_dev/testFopen.PHP on line 8
PHP message: PHP Warning:  fopen(/export/PHP/logs/aita/testFopen.txt): Failed to open stream: File exists in /var/www/html/aita_dev/testFopen.PHP on line 9
PHP message: PHP Warning:  fopen(/export/PHP/logs/aita/testFopen.txt): Failed to open stream: Permission denied in /var/www/html/aita_dev/testFopen.PHP on line 10
PHP message: PHP Warning:  fopen(/export/PHP/logs/aita/testFopen.txt): Failed to open stream: Permission denied in /var/www/html/aita_dev/testFopen.PHP on line 11'

第 8 行和第 9 行的警告在这里也有意义。

模式 r+、w[+] 和 c[+] 生成“权限被拒绝”警告。

模式 r,a[+] 运行良好,没有警告。

我可以使用“r”选项读取文件。 我可以使用“a”和“a+”选项写入文件,因此这似乎不是权限问题。

我想了解并且不必更正我的应用程序的所有 fopen()...

解决方法

负责服务器的管理员已经降低了 SELinux(Security-Enhanced Linux)的警报级别,现在一切正常。

系统设置为仅允许 Apache 用户按照 IMSoP 的建议读取/附加文件

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。