gpt4 book ai didi

PHP 无法找到文件,即使它存在

转载 作者:行者123 更新时间:2023-12-04 15:20:18 25 4
gpt4 key购买 nike

我在带有 Apache 2 的 Ubuntu 18.04 上运行 PHP 7.4.9。

我的 PHP 错误日志中出现了这个错误:

"PHP Fatal error: require_once(): Failed opening required'HTMLPurifier.auto.php' (include_path='(otherdirs):/usr/share/php:(other dirs)') in /var/www/testing.php on line 8,referer: http://localhost:8080/testing.php"

所以我检查了文件是否存在于/usr/share/php中:

# ls -lah /usr/share/php
> -rwxrwxrwx 1 www-data www-data 274 Aug 15 15:53 HTMLPurifier.auto.php

所以它就在那里。权限是 777,因为我在尝试解决问题时更改了它们。

然后我在浏览器中访问了一个 phpinfo(); 文件并检查了目录是否在包含路径中并且 open_basedir 是空的:

Directive       Local Value   Master Value
include_path (other dirs) .:/usr/share/php
open_basedir no value no value

然后我创建了另一个 PHP 文件并写了这个来检查 php 是否可以看到该文件:

<?php

clearstatcache();

$dir = '/usr/share/php/';
$filename = 'HTMLPurifier.auto.php';
$fullpath = $dir . $filename;

var_dump($dir);
var_dump($filename);
var_dump($fullpath);

var_dump(is_dir($dir));

$all_files = scandir($dir);

var_dump($all_files);
var_dump(file_exists($fullpath));
var_dump(file_exists($dir . $all_files[12]));

当我在浏览器中访问它时,我得到:

string(15) "/usr/share/php/" // $dir

string(21) "HTMLPurifier.auto.php" // $filename

string(36) "/usr/share/php/HTMLPurifier.auto.php" // $fullpath

bool(true) // is_dir($dir)

// $all_files
array(40) {
(other files)
[12]=> string(21) "HTMLPurifier.auto.php"
}

bool(false) // file_exists($fullpath)

bool(false) // file_exists($dir . $all_files[12])

因此 PHP 可以扫描目录,可以看到那里的文件,但是说它(或目录中的任何其他文件)不存在。我测试了将 /var/www 中的文件传递给 file_exists 并且它有效。我也尝试重命名该文件,但什么也没得到。

什么给了?


编辑:使用 strace php test.php 运行上面的脚本(按照@Progman 的建议)给我:

access("/usr/share/php/HTMLPurifier.auto.php", F_OK) = -1 EACCES (Permission denied)
write(1, "bool(false)\n", 12bool(false)
) = 12

access("/usr/share/php/HTMLPurifier.auto.php", F_OK) = -1 EACCES (Permission denied)
write(1, "bool(false)\n", 12bool(false)
) = 12

所以这是一个权限问题。以 root 身份运行脚本。

$ ls -lah /user/share
drw-rw-rw- 20 root root 4.0K Aug 16 11:52 php

所以我尝试了 sudo chmod 777/usr/share/php 并且脚本有效。少一点(例如 776),我会被拒绝许可。知道我应该如何设置这些权限吗?

最佳答案

在 linux 中,普通用户(如正常工作用户或网络服务器分配的用户)需要目录权限“搜索”,即 --x 或位掩码 1 , 以访问目录内的文件。权限 -r- 或位掩码 2 将只允许您读取目录中的文件名。

要解决此问题,您必须将目录 /usr/share/php 的 chmod 更改为 755

关于PHP 无法找到文件,即使它存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63440067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com