考虑一个普通的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
查找相关脚本的参数/值 -
因此,我可以找出它们中的哪一个/其中有多少实际上被我的脚本侵犯并导致失败,我需要首先找到我的脚本的相应值。如何为我的脚本找到以下值:
可以使用哪种工具。我想,使用PHP代码,我可以找到一些:
microtime(true)
之间的差异。$_FILES
上的Foreach循环,用于查找['size']
属性的总和如何找出其余的内存使用情况,输入时间等?
在何处/如何覆盖
最后,当我找到违规设置时,假设我需要增加/覆盖2个设置的值。在哪里应用覆盖?我想为htaccess或PHP脚本中的所有模块设置memory_limit
等是不正确的。相反,仅在相关模块中应用更好。我对么?
要求较低的模块的设置
此外,对于其他不需要大量资源的模块,在仔细研究模块的资源需求后,是否优先覆盖设置以减少它们?它会减少不必要的资源消耗吗?如果是这样,如何有2或3个这些设置的组合(取决于项目要求,命名为普通脚本,重文件上传)并调用单个函数为每个模块加载任何一个组合?
memory_limit注意事项
关于memory_limit
,这里提到 -
设置太高的值可能非常危险,因为如果同时处理多个上传,则所有可用内存都将用完,而消耗大量内存的其他无关脚本也可能影响整个服务器。
对此采取哪些一般预防措施?
谢谢,
Sandeepan
答案 0 :(得分:1)
一些调试的想法:
对于手动测试,我会准备一系列不同尺寸的图像,其净尺寸(宽度x高度)以小步长增加:100 x 100,100 x 200,100 x 300 ....并尝试它们。在某些时候,如果问题是内存限制,他们可能会开始失败。您可以仅为自己打开error_reporting()
(可能使用某种类型的调试cookie),这样您就可以看到确切失败的原因。
如果那不是一个选项,我会建立一种长期日志记录的机制,在调整大小开始之前将图像的维度存储到日志文件或表中,以及$_FILES
的内容阵列。在脚本成功结束时,为该条目添加“确定”。这样,如果它们通过脚本(并且由于超时设置而事先没有失败),您将能够找到有关失败上传的更多信息。
此外,对于不需要大量资源的其他模块,覆盖设置以减少它们是好/明智的
我认为答案总是“不”。据我所知,内存限制是可以分配的最大内存限制,但不会为每个请求保留该数量。我从未听说过有人以这种方式微调内存限制。
但是,如果系统的某些部分(例如图像缩放器)需要极高的内存限制,那么仅对它们应用特定的memory_limit
设置可能是明智的,例如,通过a .htaccess
setting。