php fopen-如何使用fopen打开文件的一部分,

php fopen-如何使用fopen打开文件的一部分,,php,calendar,fopen,icalendar,Php,Calendar,Fopen,Icalendar,让我们承认我们有一个巨大的文本文件,更确切地说是一个ics文件。巨大的。。。10MB或更多 我们只想用php读出其中的一部分 从 '开始:VEVENT 创建日期:20111130T144848Z' ... 到下一次发生的 ... 'END:VEVENT'. ... “结束:VEVENT”。 为了将其用作数组 有人有提示吗?试试这样的方法: $numb=0; $result=array(); $handle = @fopen("inputfile.txt", "r"); $exit=0; w

让我们承认我们有一个巨大的文本文件,更确切地说是一个ics文件。巨大的。。。10MB或更多
我们只想用php读出其中的一部分

'开始:VEVENT 创建日期:20111130T144848Z' ... 到下一次发生的

... 'END:VEVENT'. ... “结束:VEVENT”。 为了将其用作数组

有人有提示吗?

试试这样的方法:

$numb=0;
$result=array();
$handle = @fopen("inputfile.txt", "r");
$exit=0;
  while (($buffer = fgets($handle) && $exit==0) {
        if(strpos($buffer,'BEGIN:VEVENT')){
          $onoff=1;
        }
        if ($onoff==1){
          $result[$numb]=$buffer;
          $numb=numb+1;
        }
        if(strpos($buffer,'END:VEVENT')){
          $onoff=0;
          $exit=1;
         }

    }
  if (!feof($handle)) {
      echo "Error: unexpected fgets() fail\n";
  }
  fclose($handle);
 }

使用fseek导航:并使用fread读取数据:
fopen()
只打开文件,不读取任何文件。当您到达终点线时,停止调用
fgets()
。我建议每X分钟缓存一次所需的零件,这样可以减少负载。特别是当您不知道此部件位于何处时,最坏的情况是搜索10 MB的数据,但根本找不到它。因此,如果你必须这样做,那么每次请求都会花费很多时间。你说的
只输出一个片段是什么意思,因为
VCALENDAR
可以包含多个
VEVENT
。。你在看第一个吗?还是最后一个。。还是最后一个好问题。创建的包含时间戳,该时间戳应在VEVENT unique之后。否则就拿最后一个。。。。(2分钟后)好的,我查过了。时间戳是唯一的。如果必须在同一个文件中处理多个ISTANCE,则只需添加一个新的if即可设置“exit”参数:)
$numb=0;
$result=array();
$handle = @fopen("inputfile.txt", "r");
$exit=0;
  while (($buffer = fgets($handle) && $exit==0) {
        if(strpos($buffer,'BEGIN:VEVENT')){
          $onoff=1;
        }
        if ($onoff==1){
          $result[$numb]=$buffer;
          $numb=numb+1;
        }
        if(strpos($buffer,'END:VEVENT')){
          $onoff=0;
          $exit=1;
         }

    }
  if (!feof($handle)) {
      echo "Error: unexpected fgets() fail\n";
  }
  fclose($handle);
 }