我在 tmp 目录中创建文件的函数遇到问题,例如tmpfile()
and tempnam()
。他们似乎都无法写入 tmp 并返回 false。upload_tmp_dir
在 php ini 中设置,文件上传工作正常。
在调试这个错误时我发现sys_get_temp_dir()
获取 tmp 目录的位置,不幸的是,我的 PHP 版本(5.1.6)不支持它。我还看到使用以下方法替换了功能sys_get_temp_dir()
:
if ( !function_exists('sys_get_temp_dir')) {
function sys_get_temp_dir() {
if (!empty($_ENV['TMP'])) { return realpath($_ENV['TMP']); }
if (!empty($_ENV['TMPDIR'])) { return realpath( $_ENV['TMPDIR']); }
if (!empty($_ENV['TEMP'])) { return realpath( $_ENV['TEMP']); }
$tempfile=tempnam(__FILE__,'');
if (file_exists($tempfile)) {
unlink($tempfile);
return realpath(dirname($tempfile));
}
return null;
}
}
但 $_ENV 数组中没有对 tmp 目录的引用,并且tempnam()
正如我之前提到的,失败了。
另外 open_basedir 未设置,我听说这可能会导致类似的问题
如何找出 tmp 目录在哪里或者是否已设置?
这是 apache 服务器配置问题还是 PHP 问题?
感谢您的帮助
我正在运行 Ubuntu 18.04,当我从 CLI 运行 PHP 脚本时,我可以在 /tmp 目录中创建/修改文件,但是当我尝试访问与网页相同的脚本时,我永远找不到正在创建的文件。事实证明,Apache 默认情况下会创建一个私有的 tmp 目录。以下帖子提供了对该问题的一些见解Odd Bits - 私有 /tmp 目录 http://blog.oddbit.com/2012/11/05/fedora-private-tmp/。然而,帖子中提到的 /usr/lib/systemd 目录在我的机器上不包含任何 http 或 apache2 服务。为了帮助追踪问题,我执行了以下命令:
sudo find / -mount -type f -exec grep -e "PrivateTmp" '{}' ';' -print
并发现于/lib/systemd/system/apache2.service the PrivateTmp=true在奇数位帖子中提到。将文件从 /lib/systemd/system 复制到 /etc/systemd/system/ 并更改true to false并执行
systemctl daemon-restart
systemctl restart apache2
解决了问题。一个比我更聪明的人建议将文件复制到 /etc 而不是在 /lib 中编辑它是正确的做法,因为 /lib 是由包“拥有”的,并且本地编辑应该在 /etc 中执行。系统手册页 https://www.freedesktop.org/software/systemd/man/systemd.unit.html详细描述了 systemd 配置处理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)