我正在使用IndexedDb API在本地存储大型文件进行一些测试,并且我使用PHP和JSON(以及Javascript&#39的AJAX)来接收文件数据。
实际上,我试图获取一些视频,为此,我使用以下PHP代码:
$content_ar['content'] = base64_encode(file_get_contents("../video_src.mp4", false, NULL, $bytes_from, $package_size)));
return json_encode($content_ar);
我知道base64_encode
将提供比原始信息多1/3的信息,但这不是现在的问题,因为它是我知道如何检索的唯一方式二进制数据,但不会丢失它。
正如您所看到的,我指定从哪个字节开始来读取以及我想要检索多少个字节。所以,在我的JS方面,我知道我已经存储了多少文件,并且我要求脚本将我从actual_size
转换为actual_size + $package_size
字节。
我已经看到的是,随着时间的推移,脚本似乎运行得更慢,具体取决于文件大小。我试图了解那里发生的事情。
我已经读过file_get_contents()将文件内容存储在内存中,因此对于大文件来说这可能是一个问题(这就是为什么我要以块的形式阅读它)。
但是看到大文件(和时间)变得越来越慢,它是否有可能仍然将整个文件存储在内存中然后向我提供我告诉它的块?就像它加载所有东西然后返回我要求的部分?
或者只是将所有内容存储到$bytes_from + $package_size
之前(随着时间的推移,它会随着时间的推移而变慢)?
如果有上述任何一种情况,有没有办法让它更有效地运行并提高性能?也许我必须在清空内存资源之前或之后做一些操作?
编辑:
我做了一个屏幕截图,显示了我调用获取所需文件字节的时刻(以毫秒为单位),以及收到AJAX响应的正确时刻(在我执行任何操作之前)收到数据,所以Javascript对性能没有影响)。这是:
正如您所看到的,每次通话都会增加。
我认为问题在于它需要花费多少时间来获取我需要的初始字节。它不会将整个文件加载到内存中,但是在进入第一个文件之前它很慢要读取的字节,因此它增加了初始点,需要更多时间。
编辑2:
是否与我编写base64内容的JSON编码事实有关?我已经进行了一些性能测试,并且我已经看到设置$content_ar['content'] = strlen(base64_encode(file...))
的时间要少得多(理论上,它正在做同样的工作)。
然而,如果是这样的话,我仍然无法理解为什么它会在时间中增加慢度。编码相同长度的字节的工作应该花费相同的时间,不是吗?
非常感谢你的帮助!