Чтение содержимого 12000 файлов с другого FTP-сервера - PullRequest
1 голос
/ 28 августа 2010

Что я хотел бы написать: PHP-скрипт для поиска определенной строки в загрузках файлов

Можно ли считывать содержимое тысяч текстовых файлов с другого ftp-сервера, фактически не загружая эти файлы (ftp_get)?

Если нет, будет ли загрузка их ОДНАЖДЫ -> если уже существует = пропустить / размер файла отличается = повторная загрузка -> поиск определенной строки -> ... будет самым простым вариантом?

Ответы [ 6 ]

3 голосов
/ 28 августа 2010

Если включены обёртки 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 голос
/ 28 августа 2010

PHP встроенные функции чтения файлов, такие как fopen() / fread() / fclose() и file_get_contents() поддерживает URL-адреса FTP , например:

<?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(), которые, я уверен, поддерживает URL-адреса 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);
1 голос
/ 28 августа 2010

Если вы собираетесь хранить файлы после их загрузки, то вам лучше всего просто загрузить или обновить все файлы, а затем искать в них строку.

Лучший подход зависито том, как вы будете его использовать.

Если вы собираетесь удалять файлы после того, как искали их, то вы можете также отслеживать, какие из них вы искали, и информацию о дате их файла, чтобыпозже, когда вы снова начнете поиск, вы не будете тратить время на поиск файлов, которые не изменились с момента последней проверки.

Когда вы работаете с таким количеством файлов, попробуйте кэшировать любую информацию.это поможет вашей программе быть более эффективной в следующий раз.

0 голосов
/ 28 августа 2010

Если это обычная задача, то, возможно, стоит использовать простую систему очередей, чтобы вы могли запускать несколько процессов одновременно (это значительно увеличит скорость). Это будет включать два этапа:

  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

Теоретически вы можете отключить несколько процессов через командную строку, не беспокоясь о состоянии гонки.

Этот метод, вероятно, лучше всего подходит для обработки крон / пакетной обработки, однако он может работать и в этой ситуации.

0 голосов
/ 28 августа 2010

С FTP вы всегда должны будете скачать, чтобы проверить.

Я не знаю, какая у вас полоса пропускания и насколько большие файлы, но это может быть интересным вариантом использования длязапустите это из облака, например, Amazon EC2 или google-apps (если вы можете загрузить файлы в установленные сроки).

В случае EC2 вы затем запускаете сервер на час, чтобы проверить наличие обновлений в файлах, а затем снова выключаете его.Это будет стоить пару долларов в месяц и позволит избежать потенциального обновления вашей линии или хостинга.

0 голосов
/ 28 августа 2010

Если вы можете подключиться через SSH к этому серверу и установить новые модули PECL (и PEAR), то вы можете рассмотреть возможность использования PHP SSH2 . Здесь хорошее руководство по установке и использованию. Это лучшая альтернатива FTP. Но если это невозможно, ваше единственное решение - file_get_content('ftp://domain/path/to/remote/file');.

** ОБНОВЛЕНИЕ **

Вот реализация PHP-клиента только для PHP: SSH в PHP .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...