2016-05-09 12 views
3

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"? :)

Antwort

0

Ich schaffe es, das letzte Stück des Problems herauszufinden.

Der Fehler:

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

war, weil ich wurde hier ein Objekt zurückkehr:

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

Nicht in meinem Arbeiter Funktion etwas Rückkehr passiert, den Fehler zu beheben. Sie müssen Gearman besser studieren und mehr Mitarbeiter für die Ausführung meines Codes erstellen.

Nur für das Protokoll: Wenn Sie versuchen, einen Arbeiter zu einem entfernten gearman Job-Server zu verbinden, werden Sie wahrscheinlich eine schlechte Zeit. Damit Remote-Verbindungen müssen Sie das an /etc/default/gearman-job-server befand Port in gearman-Server-Konfiguration hören ändern:

# Parameters to pass to gearmand. 
PARAMS="" 

Beachten Sie, dass auf diese Weise der Server Remote-Verbindungen von überall vollständig geöffnet ist, wenn Sie es in einem öffentlichen Netz haben.

Verwandte Themen