【问题标题】:Does md5_file have a memory limit/timeout for remote files?md5_file 是否有远程文件的内存限制/超时?
【发布时间】:2010-07-01 20:47:21
【问题描述】:

我一直在尝试使用 PHP 的 md5_file 函数对来自远程源的一些 zip 文件的内容进行哈希处理:

md5_file($url);

我遇到了几个网址的问题;我收到以下错误:

Warning: md5_file($url): failed to open stream: HTTP request failed!

认为这是因为在这些情况下 zip 文件非常大。

但到目前为止,我还没有找到太多关于 md5_file 散列远程文件的信息或案例研究来证实或反驳我的理论。似乎大多数人都会抓取文件并在本地对它们进行哈希处理(如果需要,我可以这样做)。

所以我想这真的是出于好奇:md5_file 对远程文件的大小是否有任何特定限制?它是否有一个超时会阻止它下载更大的文件?

【问题讨论】:

    标签: php hash checksum md5-file


    【解决方案1】:

    可能最简单的解决方案是通过以下方式自己设置超时:

    ini_set('default_socket_timeout', 60);  // 60 secs
    

    当然,如果这些文件很大,另一种选择是使用file_get_contents(),因为您可以指定文件大小限制。您不想将其分配给一个值,因为这样包装它更有效:

    $limit = 64 * 1024; // 64 being the number of KB to limit your retrieval
    md5(file_get_contents($url, false, null, 0, $limit )); 
    

    现在您可以从文件的某些部分创建 MD5,而不必担心有人试图向您发送 2GB 的文件。当然请记住,它只是部分文件的 MD5,如果之后发生任何更改,则会中断。您根本不必设置文件大小限制,只需像这样尝试:

    ini_set('default_socket_timeout', 60);  // 60 secs
    md5(file_get_contents($url));
    

    【讨论】:

    • md5 确实只有两个参数。
    【解决方案2】:

    某些托管环境不允许您以这种方式访问​​远程文件。我认为 MD5 函数的运行方式很像 file() 函数。确保您可以先使用该命令访问远程文件的内容。如果没有,您可以通过 CURL 访问文件及其内容。

    【讨论】:

      【解决方案3】:

      如果文件比较大,你可以试试set_time_limit(0);,你不确定它会消耗多少时间

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-27
        • 1970-01-01
        相关资源
        最近更新 更多