3

考虑一个普通的 PHP 图片上传功能(不使用 AJAX),偶尔会出现大图片上传失败的问题 - 在一个测试服务器上不太频繁,而在另一台测试服务器上更频繁。假设调试器尚未开始调试问题并且没有文件/文件夹权限问题,如何进行?

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

根据与文件上传相关的设置,这些都是相关/相关的设置 -
* file_uploads
* upload_max_filesize
* max_input_time
* memory_limit
* max_execution_time
*post_max_size

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

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

    哪些工具可以用于相同的目的。使用 PHP 代码,我想,我可以找到一些:

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

    如何找出诸如内存使用、输入时间等的其余部分?

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

  3. 要求不高的模块的设置
    此外,对于不需要太多资源的其他模块,在仔细研究模块的资源需求后,覆盖设置以减少它们是否好/明智?它会减少不必要的资源消耗吗?如果是这样,那么拥有 2 或 3 个这些设置的组合(取决于项目要求,将它们命名为 normal-script、heavy-file-upload)并调用一个函数来为每个模块加载任何一个组合怎么样?

  4. memory_limit 预防措施
    关于memory_limit这里提到的 -

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

对此采取什么一般预防措施?

谢谢,
桑迪潘

4

1 回答 1

1

调试的一些想法:

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

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

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

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

However, if some parts of the system (e.g. the image resizer) require an enormously high memory limit, it may be wise to apply specific memory_limit settings only to them, e.g. through a .htaccess setting.

于 2010-10-19T11:11:22.203 回答