快速调试和有效修复大型图像文件上载失败的最佳方法

时间:2010-10-19 08:08:49

标签: php debugging file-upload large-files php-ini

考虑一个普通的PHP图像上传功能(不使用AJAX),偶尔发生大图像上传失败的问题 - 在一个测试服务器上频率降低,在另一个测试服务器上频率更低。假设调试器尚未开始调试问题并且没有文件/文件夹权限问题,如何继续?

我确信我已经file_uploads了。我不想盲目地设置一些安全值或增加值直到它工作。基本上,我希望这些值完全符合我关注的模块。如果这是最好的方法,我准备覆盖相关模块中的设置。

根据settings related to file upload,这些都是相关/相关的设置 -
    * file_uploads
    * upload_max_filesize
    * max_input_time
    * memory_limit
    * max_execution_time
    * post_max_size

  1. 查找相关脚本的参数/值 -
    因此,我可以找出它们中的哪一个/其中有多少实际上被我的脚本侵犯并导致失败,我需要首先找到我的脚本的相应值。如何为我的脚本找到以下值:

    • 上传的文件总量
    • 输入时间
    • 内存使用
    • 脚本执行时间
    • 发布数据大小

    可以使用哪种工具。我想,使用PHP代码,我可以找到一些:

    • 脚本执行时间 - 脚本开始和结束时microtime(true)之间的差异。
    • 总上传文件大小 - $_FILES上的Foreach循环,用于查找['size']属性的总和

    如何找出其余的内存使用情况,输入时间等?

  2. 在何处/如何覆盖
    最后,当我找到违规设置时,假设我需要增加/覆盖2个设置的值。在哪里应用覆盖?我想为htaccess或PHP脚本中的所有模块设置memory_limit等是不正确的。相反,仅在相关模块中应用更好。我对么?

  3. 要求较低的模块的设置
    此外,对于其他不需要大量资源的模块,在仔细研究模块的资源需求后,是否优先覆盖设置以减少它们?它会减少不必要的资源消耗吗?如果是这样,如何有2或3个这些设置的组合(取决于项目要求,命名为普通脚本,重文件上传)并调用单个函数为每个模块加载任何一个组合?

  4. memory_limit注意事项
    关于memory_limit,这里提到 -

      

    设置太高的值可能非常危险,因为如果同时处理多个上传,则所有可用内存都将用完,而消耗大量内存的其他无关脚本也可能影响整个服务器。

  5. 对此采取哪些一般预防措施?

    谢谢,
    Sandeepan

1 个答案:

答案 0 :(得分:1)

一些调试的想法:

对于手动测试,我会准备一系列不同尺寸的图像,其净尺寸(宽度x高度)以小步长增加:100 x 100,100 x 200,100 x 300 ....并尝试它们。在某些时候,如果问题是内存限制,他们可能会开始失败。您可以仅为自己打开error_reporting()(可能使用某种类型的调试cookie),这样您就可以看到确切失败的原因。

如果那不是一个选项,我会建立一种长期日志记录的机制,在调整大小开始之前将图像的维度存储到日志文件或表中,以及$_FILES的内容阵列。在脚本成功结束时,为该条目添加“确定”。这样,如果它们通过脚本(并且由于超时设置而事先没有失败),您将能够找到有关失败上传的更多信息。

  

此外,对于不需要大量资源的其他模块,覆盖设置以减少它们是好/明智的

我认为答案总是“不”。据我所知,内存限制是可以分配的最大内存限制,但不会为每个请求保留该数量。我从未听说过有人以这种方式微调内存限制。

但是,如果系统的某些部分(例如图像缩放器)需要极高的内存限制,那么仅对它们应用特定的memory_limit设置可能是明智的,例如,通过a .htaccess setting