2013-08-02 35 views
0

我正在建立一个网站,其基本前提是有两个文件。 index.php和file.txt。PHP文件寻求性能优化

File.txt具有(当前)10megs的数据,可能高达500mb。该网站的想法是,人们去index.php,然后可以寻求文件的任何位置。另一个特点是他们可以从搜索的角度读取10kb的数据。所以:

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

开始

index.php?pos=555&len=5000将得到的数据5KB从文件现在,想象一下,该网站得到数千次点击的日子。

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

+0

现阶段您应该考虑使用带索引的数据库。 –

+0

然而,文件中的数据不会以任何方式进行人工编辑。它实际上只是存储随机系列的数字和字母。应用程序将根据用户的请求检索任意数据段(最多10kb)。所以有人可能会要求位置10的1000个字节和位置11的1000个字节。虽然结果几乎相同,但它们是不同的。你的数据库实现如何解决这个问题? – Ozzy

回答

0

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

+0

我明白你的意思了。它可能不会超过每秒几个最大值。那么如果它不值得担心优化,我想我会继续使用fseek和fread。我只是不想最终在硬盘上创建一个瓶颈 – Ozzy

+0

当用户开始均匀访问网站时?如果他们大部分会在几个小时内到来会怎么样? –

+0

@Eugene,即使所有用户在一分钟内访问该网站,就磁盘而言都无关紧要。即使是消费级桌面系统每秒钟也能处理大约100次磁盘搜索,而且如果文件经常被访问,操作系统将在虚拟内存中提供请求,而无需实际访问磁盘。 – Joni

0

如果将所有数据保存到一个文件是至关重要的,我建议您将文件分割成一小块较小的文件。

因此,例如,您可以做出决定,即文件大小不应超过1 MB。这意味着,你有你的file.txt文件拆分成10个不同的文件:file-1.txtfile-2.txtfile-3.txt等等...

当你将处理一个请求,你需要确定由师pos争论什么文件皮卡文件大小和显示适量的数据。在这种情况下,fseek功能将工作得更快,也许...

但无论如何,你必须坚持fseekfopen功能。

0

编辑:现在,我认为,只要你使用fseek()去抵消字节,然后使用fread()获得AA一定数量的字节它不应该是一个问题。出于某种原因,我从一个真正可怕的文件中读取了你的问题,因为它服务于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; 
    
0

如果文件永远不会改变,并且真正受限于最大尺寸,我只需挂载一个ramdisk,并有一个引导脚本将文件从永久存储器复制到RAM存储器。

这可能需要托管在Linux上的网站,如果你还没有。

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