Ich habe einige Zweifel, wie ich gearman in meiner php-Anwendung effizient verwenden kann.Gearman und inotify für Aufgabenausführung
Ich benutze inotify für die Überwachung eines Ordners, in dem viele Dateien gespeichert und verarbeitet werden (mehr als 1000 pro Zeit). Zum Analysieren von jedem von ihnen und speichern Sie seinen Inhalt in einer Datenbank im Versuch, gearman zu verwenden.
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();
}
}
}
Ich habe eine worker.php-Datei wie folgt:
<?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());
Dinge jetzt passieren. Die Worker-Funktion wird ausgeführt und die Daten der ersten Datei werden in der Datenbank gespeichert. Es tritt jedoch ein Fehler auf:
Dies ist die Ausgabe meiner nohup.out-Datei.
Catchable fatal error: Object of class app\file\File could not be converted to string in /var/www/html/worker.php on line 18
Was will "er"? :)