file_get_contents是否使用缓存?如果它确实如何预防?

时间:2017-01-20 11:46:03

标签: php laravel

使用此代码:

for($i = 1; $i <= $times; $i++){
    $milliseconds = round(microtime(true) * 1000);
    $res = file_get_contents($url);
    $milliseconds2 = round(microtime(true) * 1000);

    $milisecondsCount = $milliseconds2 - $milliseconds;
    echo 'miliseconds=' . $milisecondsCount . ' ms' . "\n";
}

我得到了这个输出:

miliseconds=1048 ms
miliseconds=169 ms
miliseconds=229 ms
miliseconds=209 ms
....

但是睡觉:

for($i = 1; $i <= $times; $i++){
    $milliseconds = round(microtime(true) * 1000);
    $res = file_get_contents($url);
    $milliseconds2 = round(microtime(true) * 1000);

    $milisecondsCount = $milliseconds2 - $milliseconds;
    echo 'miliseconds=' . $milisecondsCount . ' ms' . "\n";
    sleep(2);
}

这:

miliseconds=1172 ms
miliseconds=1157 ms
miliseconds=1638 ms
....

那么这里发生了什么?

2 个答案:

答案 0 :(得分:1)

我的问题:

1)为什么不使用clearstatcache自行测试并使用和不使用时间签名检查时间签名?

2)你的测试方法很糟糕,作为第一个修复 - 你尝试过交换,以便“睡眠”阅读功能首先播放而不是第二次吗?

3)你做了多少次测试迭代?
如果它少于10,000次,那么我建议你重复测试,以确保首先确定平均延迟(或缺少)然后是什么让你认为这是由缓存特别引起的?

4)有什么规格。您的机器,RAM以及每次迭代时的可用和可用内存?

5)你的服务器是否有效?您是否能够删除外部服务作为时间差异的可能原因? (如反病毒,后台进程加载,服务器流量等)?

我的回答:

  

但是,操作系统级缓存可能会缓存最近使用过的文件   让更快的访问,但我不会指望那些存在   可用。

     

多次调用文件引用只会读取文件   从磁盘一次,后续调用将从中读取值   函数内的静态变量。请注意,你不应该指望   这种方法适用于大型文件或每页只使用一次的文件,因为   静态变量使用的内存将持续到结束   请求。保持文件内容不必要的静态   变量是使脚本成为内存的好方法。

引自This answer

  • 对于远程(非本地文件系统)文件,有很多可能导致可变延迟的原因,实际上file_get_contents缓存在选项列表中有很长的路要走。

  • 当您声称使用localhost/参考结构进行连接时,我会冒险(但不确定)您的服务器将使用各种防火墙和检查技术来检查将要添加的传入请求大变量到时间。

答案 1 :(得分:1)

将随机查询字符串与url连接。 例如:$url = 'http://example.com/file.html?r=' . rand(0, 9999);