4

我的网络服务器有问题。

我注意到通常在 /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 文件夹中创建

关于这个奇怪的问题有什么想法吗?

4

1 回答 1

2

正如神秘所说,这听起来像 php 会话,在您的 php.ini 中检查以查看

session.save_path

额外的 - -

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

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

更新

由于 /tmp 文件与下载文件的大小和时间相匹配,因此看起来确实是操作系统在整理数据时存储文件的方式。我怀疑这有什么可担心的,特别是如果文件通常是几个演出。它可能会假脱机到磁盘以保留系统 RAM

更新 2

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

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

这些 tmp 文件会给您带来什么问题?

于 2013-01-08T16:40:55.117 回答