Разбор файлов с помощью Beanstalkd Queue

0

В настоящее время я переписываю файл-загрузчик. Синхронизация скриптов для разных типов данных, которые в настоящее время существуют, - это perl-скрипты. Программа написана на php. То, как он в настоящее время состоит в том, что он позволяет загружать только один файл, и как только файл находится на сервере, он вызовет скрипт perl для типа данных загруженного файла. У нас более 20 типов данных.

То, что я сделал до сих пор, - это написать новую систему, которая позволяет загружать несколько файлов. Сначала вы сможете проверить свои атрибуты перед загрузкой, сжать их с помощью zipjs, загрузить заархивированный файл, распаковать его на сервере, для каждого файла, вызвать для него синтаксический анализатор.

Я в той части, где мне нужно сказать для каждого файла, поместить вызов парсера в очередь. Я не могу запускать сразу несколько парсеров. Ниже приведен грубый эскиз.

for each file 
$job = "exec('location/to/file/parser.pl file');";
// using the pheanstalkd library 
$this->pheanstalk->useTube('testtube')->put($job);

В зависимости от файла разбор может занимать 2 минуты или 20 минут. Когда я помещаю задание в очередь, мне нужно убедиться, что синтаксический анализатор файла2 срабатывает после завершения анализатора для файла1. Как я могу это сделать? Спасибо

Теги:
file-upload
queue
beanstalkd

2 ответа

0

Я достиг того, что хотел, чтобы требовать больше времени, если парсер занимает больше минуты. Рабочий - это php-скрипт, и я могу получить идентификатор процесса, когда я выполняю команду "exec" для исполняемого файла анализатора. В настоящее время я использую фрагмент кода ниже у своего работника.

$job = $pheanstalk->watch( $tubeName )->reserve();
// do some more stuff here ... then 
// while the parser is running on the server
while( file_exists( "/proc/$pid" ) )
{
// make sure the job is still reserved on the queue server
    if( $job )  {
        // get the time left on the queue server for the job
        $jobStats = $pheanstalk->statsJob( $job );
        // when there is not enough time, request more
        if( $jobStats['time-left'] < 5 ){
            echo "requested more time for the job at ".$jobStats['time-left']." secs left \n";
            $pheanstalk->touch( $job );
        }
    } 
}
0

У Beanstalk нет понятия зависимости между заданиями. Кажется, у вас две работы:

  • Задание A: Файл анализа 1
  • Задание B: Файл анализа 2

Если вам нужна работа B для запуска только после задания A, самый простой способ сделать это - для задания A, чтобы создать Job B в качестве последнего действия.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню