【问题标题】:Is there anyway to upload a file without using temp directory?有没有在不使用临时目录的情况下上传文件?
【发布时间】:2012-12-12 12:42:11
【问题描述】:

我使用 http 使用 HTML5 分块文件 api 创建了文件传输网站。它工作正常,除了在上传文件期间,服务器的 CPU 使用率几乎是 100%。此文件传输将用于平均上传文件 4GB 左右。

我的猜测是它几乎占用了 100% 的 cpu 使用率,因为它试图将文件从 tmp 目录移动到目标目录。

有没有在不使用临时目录的情况下上传文件?

我的问题是 PHP,但其他语言也可以接受

这是上传文件(18mb、38mb、60mb、33mb)期间“top”命令的结果

 1904 apache    20   0 33504 5740 1952 R 28.3  0.2   0:02.19 httpd
 1905 apache    20   0 33504 5740 1952 R 28.3  0.2   0:01.99 httpd
 1903 apache    20   0 33232 6968 3060 R 28.0  0.2   0:01.98 httpd
 1910 apache    20   0 33240 6020 2248 S 11.5  0.2   0:02.85 httpd
 2133 root      20   0  2656 1124  896 R  1.6  0.0   0:00.71 top
    1 root      20   0  2864 1404 1188 S  0.0  0.0   0:03.99 init

它表明 httpd 占用了所有资源.. 如果不是因为将文件复制或上传到服务器,有谁知道是什么问题?

【问题讨论】:

  • 我非常怀疑复制文件时 CPU 映像会超过百分之几。你为什么不做更多的研究并准确地查明原因?
  • 听 teh teh1.... :-D 说真的,尽管他是对的。复制过程不太可能导致 CPU 飙升...
  • @teh1 知道什么可能导致 CPU 飙升,请检查我在 linux 服务器上的“top”命令结果。显示httpd占用了所有cpu资源28.3,28.3,...
  • @Harts,你正遭受误入歧途的XY problem。在没有证据的情况下,您认为移动临时文件(simple I/O)会导致高负载,因此您想跳过使用临时文件。你没有证据表明临时文件是问题所在,如果是的话,我会吃一打大礼帽。您真正的问题是 Apache 使用了疯狂的 CPU 时间。排除那个的问题。
  • 我猜你有一个无限循环什么的。

标签: php file-upload


【解决方案1】:

您可以使用http put方法来处理文件上传。在这种方法中,数据直接流式传输到 PHP 脚本,您可以使用文件函数对其进行处理:

<?php
$f = fopen('php://input','r');
while(!feof($f)){
    $chunk = fread($f,CHUNK_SIZE);
    [Handle the uploading file here]
}
fclose($f);
?>

(将 CHUNK_SIZE 替换为您的值)

【讨论】:

  • PUT 和 POST 之间是否存在安全问题?是否可以使用 PUT 方法上传多个文件?
  • 您可以使用 put 上传多个文件,但您需要为要上传的每个文件发出请求。这意味着您不能在一个请求中上传多个文件。
  • 我想当您可以访问 php://input 时,该文件已经上传并存储在 tmp 文件中。
  • 详情请见this page
【解决方案2】:

如果您确定从 tmp 移动到目标是问题,您可以更改 php.ini 设置 (upload_tmp_dir) 以将 tmp 目录移动到与目标目录相同的目录中的另一个目录。

不要只在脚本中更改它,当你的脚本运行时,文件已经上传了。

只需在 php.ini 中更改即可。

【讨论】:

    【解决方案3】:

    我认为你应该多分析一下你的应用程序,因为移动文件不会显着占用 CPU。

    【讨论】:

      【解决方案4】:

      对于 4GB 这么大的文件,您可能会考虑设置一个 websocket 来为您的应用程序流式传输。

      http://net.tutsplus.com/tutorials/javascript-ajax/how-to-create-a-resumable-video-uploade-in-node-js/

      【讨论】:

      • 使用 websocket,这是否意味着我需要指定 ip 并且它打开了一个套接字?如果多人同时尝试上传,它会起作用吗?还是我需要每个人指定每个自己的套接字?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 2016-09-28
      • 1970-01-01
      • 2010-10-06
      • 2018-12-27
      • 1970-01-01
      相关资源
      最近更新 更多