В настоящее время я переписываю файл-загрузчик. Синхронизация скриптов для разных типов данных, которые в настоящее время существуют, - это 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. Как я могу это сделать? Спасибо
Я достиг того, что хотел, чтобы требовать больше времени, если парсер занимает больше минуты. Рабочий - это 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 );
}
}
}
У Beanstalk нет понятия зависимости между заданиями. Кажется, у вас две работы:
Если вам нужна работа B для запуска только после задания A, самый простой способ сделать это - для задания A, чтобы создать Job B в качестве последнего действия.