我的网络服务器有问题。
我注意到通常在 /tmp 目录中创建大文件。文件就像 /tmp/phpUNIQUECODE 但这些不是上传。因为在我的 php.ini 设置中配置是
upload_tmp_dir = /backup/tmp
upload_max_filesize = 300M
post_max_size = 300M
我发现 /tmp 中的文件是由 PHP 进程在下载文件时写入的(PHP 进程从 TCP 套接字读取文件并写入输出)。
我阅读了一些 PHP 手册,发现 tehre 是 PHP 函数 tmpfile()。它在 /tmp 文件夹中创建临时文件(即使 upload_tmp_dir 不同)。但是我的代码中没有使用这个函数。在我的代码中,没有任何内容保存到磁盘中。
这会是什么?还有哪些 PHP 扩展可以在 /tmp 文件夹中创建临时文件?
谢谢。
更新 1. 在我的下载功能中,我使用 ob_start 和 ob_flush 功能。ob_flush 在每 4kb 数据发布到浏览器后调用。
这个问题可能与 ob_* 函数有关吗?
更新 2. 我发现在我执行相同 PHP 代码以下载文件的其他服务器上,/tmp 文件夹中没有临时文件。所以这一定和php.ini设置或者apache设置有关。我还发现临时文件是正在下载的文件的副本。下载完成后,临时文件将从 /tmp 文件夹中删除。
更新 3. 我隔离了这个问题。我发现这不是下载的问题。这是使用 PHP HTTP 包装器读取文件的问题。我的文件存储在 amazon s3 上。我打开套接字以下载文件
$fh=fopen('http://s3.amazonaws.com/.....');
然后我读取文件并发送到用户浏览器。我做了一些测试,发现如果我是来自本地来源的真实文件,那么一切都很好。不会创建临时文件。我还测试了其他包装器 - ftp 和一些自定义包装器(例如,用于保管箱的自定义包装器)。一切都很好。
所以问题只针对 php http 包装器,并且只在我的一台服务器上(其他服务器上的相同代码很好)。
这个简单的代码演示了我的问题:
$filepath='http://bucket.s3.amazonaws.com/.....';
$_fp=fopen($filepath,'r');
if ($_fp) {
$i=1;
$total=0;
while (!feof($_fp)) {
$tmpbuf=fread($_fp, 4096);
$total+=strlen($tmpbuf);//this is done only to make downloading slower
if($total>=$i*4194304){
$i++;
sleep(1);//just to make downloading slower
}
}
fclose($_fp);
}
如果我将第一行替换为
$filepath='/path/to/local/file';
那么一切都很好。临时文件未在 /tmp 文件夹中创建
关于这个奇怪的问题有什么想法吗?