php file_get_contents("/tmp/some_file") 不工作 php7.1

php file_get_contents("/tmp/some_file") not working php7.1

我在读取 /tmp/some_file 文件时遇到了一个奇怪的问题。

但是 file_exists("/tmp/some_file")file_get_contents("/tmp/some_file") 都返回 false

我试过了

$data =  file_get_contents("/tmp/some_file");
var_dump($data); //is false

// OR even this code outputs: Unable to open the file!
$myfile = fopen("/tmp/some_file", "r") or die("Unable to open the file!");
echo fread($myfile,filesize("/tmp/some_file"));
fclose($myfile);

None 以上代码有效,我没有收到任何错误消息。 当我在终端中使用 php -a 模式或直接 运行 php myfile.phpwww-data 用户一起执行 PHP 代码时,上述所有功能都工作正常并且文件通常会被读取。

是否有任何有效的调试方法或它与 PHP 版本有某种关系?

---更新---

经过一番挖掘,我发现该文件位于任何其他直接读取正常。似乎问题出在 /tmp 目录,但 is_readable("/tmp") returns true 和 file_exists("/tmp/some_file") returns 仍然是 false ...

尝试error_get_last()

Get the last occurred error

例如:

$content = file_get_contents("/tmp/some_file");
if($content === false){
    print_r(error_get_last());
}

或者

$fp = fopen("/tmp/some_file", "r");
if($fp === false){
    print_r(error_get_last());
}

echo fread($myfile,filesize("/tmp/some_file"));
fclose($myfile);

我在这里找到问题答案:https://serverfault.com/questions/614781/php-script-cant-access-tmp-folder?newreg=e8651c2bcaea4a718a38f4e1dc94805b

ubuntu 16.04apache有关。对于此配置文件中的 apache 服务 PrivateTmp=true /etc/systemd/system/multi-user.target.wants/apache2.service.

这就是为什么在通过浏览器+apache 执行 php 文件期间结果为 false 而通过终端结果为 true 的原因,因为在没有 /tmp/some_file 的情况下生成了 apache 执行虚拟 /tmp 目录

我尝试了 "multi-user.target.wants" 解决方案,它有效,但在重新启动后,但在某些时候,PrivateTmp 返回 true。 就像我对 Apache2 的主要用途是 PHP,我最终编辑了 php.ini 并取消了 sys_temp_dir.

行的注释

默认情况下,系统使用函数 sys_get_temp_dir 分配的临时目录。函数 sys_get_temp_dir 将 return "/tmp" 但事实是您的 tmp 文件存储在某些路径,例如 /tmp/systemd-private-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-apache2.service-YYYYYY//tmp/*。所以,对我来说工作是:

编辑 php.ini(路径可以在 PHP 个版本之间更改)

sudo nano /etc/php/7.2/cli/php.ini

然后取消注释 sys_temp_dir 行

; Directory where the temporary files should be placed.
; Defaults to the system default (see sys_get_temp_dir)
sys_temp_dir = "/tmp"