PHP扩展将临时文件写入/tmp文件夹


What PHP extensions write temp files to to /tmp folder?

我的web服务器有问题。

我注意到经常在/tmp目录下创建大文件。文件类似于/tmp/phpUNIQUECODE但这些不是上传。因为在我的php。ini设置中配置是

upload_tmp_dir = /backup/tmp 
upload_max_filesize = 300M
post_max_size = 300M

我发现/tmp中的文件是由PHP进程在下载文件时写入的(PHP进程从TCP套接字读取文件并写入输出)。

我读了一些PHP手册,我看到有一个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和一些自定义包装(例如,自定义包装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目录下未创建临时文件对于这个奇怪的问题有什么想法吗?

听起来像PHP会话,在PHP .ini中查看

的值

会话。save_path

额外——

好吧,所以可能不是会话文件,我已经重读了你的OP和你的额外评论,如果文件是由一个脚本创建的下载数据,并在脚本完成时进行清理,问题是什么?

我还会指出设置upload_tmp_dir是用于通过HTTP上传文件(根据默认php.ini中的注释),所以可能与下载无关。你下载的代码是什么?该命令有设置吗?

由于/tmp文件匹配下载文件的大小和时间,那么看起来这就是操作系统在整理数据时存储文件的方式。我怀疑这没有什么值得担心的,特别是如果文件通常是几gb。它很可能会脱机到磁盘以保留系统内存

更新2

也许我把它称为操作系统是不太正确的,也许它是在PHP内部的某个地方选择名称/创建tmp文件。我看到的底线——基于您所说的一切——是这里没有问题,这就是PHP的工作方式。

另一个服务器可能被设置为在其他地方写tmp文件,但是如果没有您实际提供用于检查的代码片段,我不知道任何人如何帮助您提供更多细节。

这些tmp文件给你带来了什么问题?