我正在构建一个网站,其中的基本前提是有两个文件。index.php和file.txt。
File.txt(目前)有10兆字节的数据,可能高达500兆字节。该网站的想法是,人们可以访问index.php,然后可以查找文件的任何位置。另一个功能是,他们可以从搜索点读取高达10kb的数据。因此:
index.php?pos=432
将在文件上的位置423处获得字节。
index.php?pos=555&len=5000
将从555 位置开始的文件中获得5kb的数据
现在,想象一下这个网站每天有数千次点击。
我目前使用fseek
和fread
来提供数据。有什么更快的方法吗?或者我的使用率太低,无法考虑高级优化,例如缓存每个请求的结果,或者将文件加载到内存中并从中读取?
每天有数千次点击,就像几秒钟就有一次吗?这肯定太低了,目前不需要优化,所以只要使用fseek和fread,如果这对你来说最简单的话。
如果将所有数据保存到一个文件中对您来说至关重要,我建议您将文件拆分为一块较小的文件。
例如,您可以做出一个决定,即文件大小不应超过1mb。这意味着您必须将file.txt
文件拆分为10个单独的文件:file-1.txt
、file-2.txt
、file-3.txt
等等…
在处理请求时,您需要通过分区pos
关于文件大小的参数来确定要拾取的文件,并显示适当的数据量。在这种情况下,fseek
功能将工作得更快,也许。。。
但无论如何,您必须坚持使用fseek
和fopen
函数。
edit
:现在我考虑一下,只要您使用fseek()
转到字节偏移量,然后使用fread()
获得一定数量的比特,这应该不会有问题。出于某种原因,我读到你的问题是从一个文件中提供X个行,这真的很糟糕。
问题是,你绝对是在用IO操作敲打磁盘,而这不仅仅是一个文件/脚本的性能问题,你还导致了任何需要该磁盘的东西的性能问题。其他用户,操作系统等。如果你在共享主机上,我保证其中一个系统管理员会试图弄清楚你是谁,这样他们就可以关闭你
你需要找到一种方法:
- 将其卸载到内存中
在服务器上设置一个守护进程,将文件加载到内存中,并根据请求提供块 -
将其卸载到更高效的东西上,比如mySQL
您已经在顺序块中提供数据,例如:第466行到第476行,从类似的表中检索数据会快得多CREATE TABLE mydata ( line INTEGER NOT NULL AUTO_INCREMENT, data VARCHAR(2048) ) PRIMARY KEY (line);
发件人:
SELECT data FROM mydata WHERE line BETWEEN 466 AND 476;
如果文件从未更改,并且最大大小确实受到限制,我只需安装一个ramdisk,并使用一个引导脚本将文件从永久存储复制到RAM存储。
这可能需要在linux上托管网站,如果你还没有的话。
这将允许您保证从内存提供文件段,而不依赖于操作系统文件系统缓存。