2016-05-09 50 views
3

我对如何在PHP应用程序中高效地使用gearman有一些疑问。Gearman和inotify执行任务

我使用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 

“他”想要什么? :)

回答

0

我设法找出问题的最后一块。

错误:

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作业服务器,您可能会有一个糟糕的时间。 要允许远程连接,您必须更改监听端口在位于/etc/default/gearman-job-server Gearman的服务器配置:

# Parameters to pass to gearmand. 
PARAMS="" 

当心这样的服务器是从,如果你拥有了它在公共网络中的任何地方远程连接完全开放。