PHP文件搜索性能优化


PHP file seek performance optimisations

我正在构建一个网站,其中的基本前提是有两个文件。index.php和file.txt。

File.txt(目前)有10兆字节的数据,可能高达500兆字节。该网站的想法是,人们可以访问index.php,然后可以查找文件的任何位置。另一个功能是,他们可以从搜索点读取高达10kb的数据。因此:

index.php?pos=432将在文件上的位置423处获得字节。

index.php?pos=555&len=5000将从555 位置开始的文件中获得5kb的数据

现在,想象一下这个网站每天有数千次点击。

我目前使用fseekfread来提供数据。有什么更快的方法吗?或者我的使用率太低,无法考虑高级优化,例如缓存每个请求的结果,或者将文件加载到内存中并从中读取?

每天有数千次点击,就像几秒钟就有一次吗?这肯定太低了,目前不需要优化,所以只要使用fseek和fread,如果这对你来说最简单的话。

如果将所有数据保存到一个文件中对您来说至关重要,我建议您将文件拆分为一块较小的文件。

例如,您可以做出一个决定,即文件大小不应超过1mb。这意味着您必须将file.txt文件拆分为10个单独的文件:file-1.txtfile-2.txtfile-3.txt等等…

在处理请求时,您需要通过分区pos关于文件大小的参数来确定要拾取的文件,并显示适当的数据量。在这种情况下,fseek功能将工作得更快,也许。。。

但无论如何,您必须坚持使用fseekfopen函数。

edit :现在我考虑一下,只要您使用fseek()转到字节偏移量,然后使用fread()获得一定数量的比特,这应该不会有问题。出于某种原因,我读到你的问题是从一个文件中提供X个,这真的很糟糕。


问题是,你绝对是在用IO操作敲打磁盘,而这不仅仅是一个文件/脚本的性能问题,你还导致了任何需要该磁盘的东西的性能问题。其他用户,操作系统等。如果你在共享主机上,我保证其中一个系统管理员会试图弄清楚你是谁,这样他们就可以关闭你

你需要找到一种方法:

  1. 将其卸载到内存中
    在服务器上设置一个守护进程,将文件加载到内存中,并根据请求提供块
  2. 将其卸载到更高效的东西上,比如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上托管网站,如果你还没有的话。

这将允许您保证从内存提供文件段,而不依赖于操作系统文件系统缓存。