【问题标题】:What PHP extensions write temp files to to /tmp folder?哪些 PHP 扩展将临时文件写入 /tmp 文件夹?
【发布时间】:2012-12-22 10:06:06
【问题描述】:

我的网络服务器有问题。

我注意到通常在 /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 和一些自定义包装器(例如,用于保管箱的自定义包装器)。一切都很好。

所以问题只针对 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 开头(会话以 sess_ 开头)

标签: php


【解决方案1】:

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

session.save_path

附加----

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

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

更新

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

更新 2

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

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

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

【讨论】:

  • 会话文件确实保存到 /tmp 文件夹。但是会话文件名是 /tmp/sess_CODE 并且会话文件很小。所以,这不可能是会话文件问题。这是不同的东西。
  • 编辑了更多细节 - 答案框比 cmets 更好用;)
  • 您能否确认脚本完成后文件是否被删除。还有它们有多大,里面有什么?
  • 是的。脚本执行完成后文件被删除。文件很大。但我没有检查里面有什么。我将单独发布。但我希望 tmp 文件内容与正在下载的文件相同。当大文件下载正在进行时,我注意到了这个问题。在这种情况下,2GB tmp 文件位于 /tmp 文件夹中。明天我会有更多信息。我认为这是一些已知问题。
  • 你对这个系统的看法很有趣。但我不同意。为什么系统文件的名称与 PHP 临时文件的命名方式相同?临时文件名是 phpUNIQUECODE
猜你喜欢
  • 2013-12-06
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 2012-08-14
  • 1970-01-01
  • 2017-06-28
相关资源
最近更新 更多