Gearman и inotify для выполнения задач

У меня есть некоторые сомнения в том, как я могу эффективно использовать gearman в моем приложении php.

Я использую inotify для мониторинга папки, где будет храниться и обрабатываться много файлов (более 1000 за раз).
Для разбора каждого из них и сохранения его содержимого в базе данных я пытаюсь использовать gearman.

    while(true){
sleep(5);   # spare some CPU Cycles
set_time_limit(0); # unlimited timeout request
// read events
$events = inotify_read($this->instance);

// if the event is happening within our 'Files directory'
if ($events[0]['wd'] === $this->watch_id){
foreach ($events as $key=>$value)
{
if($events[$key]['mask'] === IN_CREATE){
# A new file was created in folder
$client = new \GearmanClient();
$client->addServer();
$client->addTask("parse_file", $events[$key]['name']);  # add task to parse that file
printf("Created file: %s in Files directory\n", $events[$key]['name']);
}
else if ($events[$key]['mask'] === IN_DELETE){
printf("Deleted file: %s in Files directory\n", $events[$key]['name']);
}
}
if(!is_null($client)){  # once everything is done, run the tasks.
$client->runTasks();
}
}
}

Я создал файл worker.php примерно так:

<?php
namespace controllers;
use app\file\File;
require_once 'vendor/autoload.php';

$worker = new \GearmanWorker();
$worker->addServer();
$worker->addFunction('parse_file', function($job){
echo "entrou no add function!<br>";
print_r ($job->workload());
sleep(2);
return new File($job->workload()); # this class parses the files content in database
});
while ($worker->work());

Вещи происходят сейчас. Рабочая функция запускается, и данные первого файла сохраняются в базе данных, но возникает ошибка:

Это вывод моего файла nohup.out.

Catchable fatal error: Object of class app\file\File could not be converted to string in /var/www/html/worker.php on line 18

Что же он хочет? 🙂

3

Решение

Мне удается выяснить окончательную часть проблемы.

Ошибка:

Catchable fatal error: Object of class app\file\File could not be converted to string in /var/www/html/worker.php on line 18

Это потому, что я возвращал объект здесь:

sleep(2);
return new File($job->workload()); # this class parses the files content in database

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

Только для записи: Если вы попытаетесь подключить работника к удаленному серверу рабочих мест, у вас, вероятно, будет плохое время.
Чтобы разрешить удаленные подключения, вы должны изменить порт прослушивания в конфигурации gearman-server, расположенной по адресу /etc/default/gearman-job-server:

# Parameters to pass to gearmand.
PARAMS=""

Помните, что таким образом сервер полностью открыт для удаленных подключений из любой точки мира, если он есть в общедоступной сети.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]