我的网络服务器出了问题。
我注意到/ 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函数。将每4kb数据发布到浏览器后,ob_flush就是calles。
这个问题可以与ob_ *函数有关吗?
更新2。 我发现在我执行相同PHP代码下载文件的其他服务器上,/ tmp文件夹中没有临时文件。所以这必须与php.ini设置或apache设置有关。 另外我发现临时文件正在下载文件的副本。下载完成后,临时文件将从/ tmp文件夹中删除。
更新3。 我解决了这个问题。我发现这不是下载问题。这是使用PHP HTTP包装器读取文件的问题。 我的文件存储在amazon s3上。我用
打开socket下载文件$fh=fopen('http://s3.amazonaws.com/.....');
然后我读取文件并发送到用户浏览器。我做了一些测试,发现如果我是来自本地来源的真实文件,那么一切都很好。不创建临时文件。 此外,我测试了其他包装 - ftp和一些自定义包装(例如,Dropbox的自定义包装)。一切都很好。
所以这个问题仅适用于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文件夹中创建
关于这个奇怪问题的任何想法?
答案 0 :(得分:2)
作为神秘的说它听起来像php会话,在你的php.ini检查中看到
的值session.save_path
附加----
好吧,所以可能不是会话文件,我已经重读了你的OP和你的额外评论,如果文件是由下载数据的脚本创建的,并且在脚本完成时清理了什么问题?
另外我会指出设置upload_tmp_dir用于通过HTTP上传文件(根据默认的php.ini中的注释),因此可能与下载无关。你用什么代码下载?该命令是否有设置?
<强>更新强>
由于/ tmp文件与下载文件的大小和时间相匹配,因此它看起来就是操作系统在整理数据时存储文件的方式。我怀疑它是否值得担心,特别是如果这些文件通常是几个演出。它可能是假脱机到光盘以保留系统RAM
已更新2
也许我指的是操作系统不太正确,也许它在PHP的内容中选择名称/创建tmp文件。我认为它的底线 - 基于你所说的一切 - 是这里没有问题,这就是PHP的工作原理。
其他服务器可能设置为在其他地方写入tmp文件,但如果没有实际提供用于检查的代码段,我看不出有人可以帮助您了解更多细节。
这些tmp文件导致什么问题?