【问题标题】:Read content of 12000 files from another FTP server从另一个 FTP 服务器读取 12000 个文件的内容
【发布时间】:2010-08-28 12:27:16
【问题描述】:

我想要编写的脚本:一个 PHP 脚本,用于在大量文件中查找某个字符串

是否可以从另一个 ftp 服务器读取数千个文本文件的内容而无需实际下载这些文件 (ftp_get)?

如果没有,将下载它们一次 -> 如果已经存在 = 跳过 / 文件大小不同 = 重新下载 -> 搜索某些字符串 -> ... 是最简单的选择吗?

【问题讨论】:

  • 遗憾的是,AFAIK,FTP 没有在文件中搜索的机制(仍在服务器上)

标签: php string ftp find


【解决方案1】:

如果启用了 URL fopen 包装器,那么 file_get_contents 可以解决问题,而您不需要将文件保存到您的服务器上。

<?php

$find = 'mytext'; //text to find
$files = array('http://example.com/file1.txt', 'http://example.com/file2.txt');  //source files

foreach($files as $file)
{
     $data = file_get_contents($file);
     if(strpos($data, $find) !== FALSE)
           echo "found in $file".PHP_EOL;
}
?>

[编辑]:如果文件只能通过 FTP 访问

在这种情况下,你必须像这样使用:

 $files = array('ftp://user:pass@domain.com/path/to/file', 'ftp://user:pass@domain.com/path/to/file2');

【讨论】:

  • 您假设文件可通过http 获得,OP 未指定或提及。 :S
【解决方案2】:

如果您要在下载文件后存储它们,那么您最好下载或更新所有文件,然后在它们中搜索字符串。

最佳方法取决于您将如何使用它。

如果您要在搜索完文件后删除这些文件,那么您可能还需要跟踪您搜索过的文件及其文件日期信息,以便以后再次搜索时,您不会浪费时间搜索自上次检查后未更改的文件。

当您处理如此多的文件时,请尝试缓存任何有助于您的程序在下次运行时更高效的信息。

【讨论】:

    【解决方案3】:

    PHP内置的文件读取功能,如fopen()/fread()/fclose()file_get_contents()确实支持FTP URLs,像这样:

    <?php
    $data = file_get_contents('ftp://user:password@ftp.example.com/dir/file');
    // The file's contents are stored in the $data variable
    

    如果您需要获取目录中的文件列表,您可能需要查看 opendir()readdir()closedir(),我很确定它们支持 FTP URL。
    一个例子:

    <?php
    $dir = opendir('ftp://user:password@ftp.example.com/dir/');
    if(!$dir)
      die;
    while(($file = readdir($dir)) !== false)
      echo htmlspecialchars($file).'<br />';
    closedir($dir);
    

    【讨论】:

      【解决方案4】:

      如果您可以通过 SSH 连接到该服务器,并且可以安装新的 PECL(和 PEAR)模块,那么您可以考虑使用PHP SSH2Here 是一个关于如何安装和使用它的好教程。这是 FTP 的更好替代方案。但如果不可能,您唯一的解决方案是file_get_content('ftp://domain/path/to/remote/file');

      ** 更新 **

      这是 SSH 客户端的纯 PHP 实现:SSH in PHP

      【讨论】:

        【解决方案5】:

        使用 FTP,您总是需要下载才能检查。

        我不知道您拥有什么样的带宽以及文件有多大,但这可能是一个有趣的用例,可以从 Amazon EC2 或 google-apps 等云端运行它(如果您可以下载时限内的文件)。

        在 EC2 情况下,您随后启动服务器一小时以检查文件中的更新,然后再次将其关闭。这将每月花费几美元,并避免您升级您的线路或托管合同。

        【讨论】:

          【解决方案6】:

          如果这是一项常规任务,那么可能值得使用一个简单的队列系统,这样您就可以一次运行多个进程(将大大提高速度)这将涉及两个步骤:

          1. 获取远程服务器上所有文件的列表
          2. 将列表放入队列(您可以将 memcached 用于基本消息队列系统)
          3. 使用单独的脚本从队列中获取下一项。

          处理脚本将包含简单的功能(在 do while 循环中)

          ftp_connect
          do 
          
            item = next item from queue
          
            $contents = file_get_contents;
          
            preg_match(.., $contents);
          
          while (true);
          
          ftp close
          

          理论上,您可以通过命令行分叉多个进程,而无需担心竞争条件。

          这种方法可能最适合 crons/批处理,但它也可能适用于这种情况。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多