php file_get_contents("/tmp/some_file") 不工作 php7.1
php file_get_contents("/tmp/some_file") not working php7.1
我在读取 /tmp/some_file
文件时遇到了一个奇怪的问题。
- 我的PHP版本是7.1.13-1+ubuntu16.04.1+deb.sury.org+1
服务器版本:Apache/2.4.29 (Ubuntu) 服务器构建:2018-01-14T11:23:59
文件/tmp/some_file
肯定是0777
!
但是 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.php
与 www-data
用户一起执行 PHP 代码时,上述所有功能都工作正常并且文件通常会被读取。
是否有任何有效的调试方法或它与 PHP 版本有某种关系?
---更新---
经过一番挖掘,我发现该文件位于任何其他直接读取正常。似乎问题出在 /tmp
目录,但 is_readable("/tmp")
returns true 和 file_exists("/tmp/some_file")
returns 仍然是 false ...
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);
与ubuntu 16.04
和apache
有关。对于此配置文件中的 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"
我在读取 /tmp/some_file
文件时遇到了一个奇怪的问题。
- 我的PHP版本是7.1.13-1+ubuntu16.04.1+deb.sury.org+1
服务器版本:Apache/2.4.29 (Ubuntu) 服务器构建:2018-01-14T11:23:59
文件
/tmp/some_file
肯定是0777
!
但是 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.php
与 www-data
用户一起执行 PHP 代码时,上述所有功能都工作正常并且文件通常会被读取。
是否有任何有效的调试方法或它与 PHP 版本有某种关系?
---更新---
经过一番挖掘,我发现该文件位于任何其他直接读取正常。似乎问题出在 /tmp
目录,但 is_readable("/tmp")
returns true 和 file_exists("/tmp/some_file")
returns 仍然是 false ...
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);
与ubuntu 16.04
和apache
有关。对于此配置文件中的 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"