从另一台FTP服务器读取12000个文件的内容

时间:2010-08-28 12:27:16

标签: php string ftp find

我想编写脚本:用于在文件加载中查找特定字符串的PHP脚本

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

如果没有,将下载ONCE - >如果已经存在= skip / filesize不同= redownload - >搜索某些字符串 - > ... 是最简单的选择吗?

6 个答案:

答案 0 :(得分:3)

如果启用了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');

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

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网址。
一个例子:

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

答案 3 :(得分:0)

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

** 更新 **

以下是SSH客户端的仅PHP实现:SSH in PHP

答案 4 :(得分:0)

使用FTP,您将始终需要下载以进行检查。

我不知道你拥有什么样的带宽以及文件有多大,但这可能是一个有趣的用例,可以从像Amazon EC2或谷歌应用程序(如果你可以下载)的云中运行时间限制中的文件)。

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

答案 5 :(得分:0)

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

  1. 获取远程服务器上所有文件的列表
  2. 将列表放入队列(您可以使用memcached作为基本消息排队系统)
  3. 使用单独的脚本从队列中获取下一个项目。
  4. 处理脚本将包含简单的功能(在循环中执行)

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

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

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

相关问题