PHP gearman - вызов работника gearman в рамках работника gearman - PullRequest
0 голосов
/ 21 октября 2018

Я очень новичок в снаряжении.Я пытаюсь написать сценарий PHP для загрузки сценариев с URL-адреса и загрузки его на диск Google пользователя.своего рода сценарий резервного копирования ..

Я пытаюсь вызвать рабочий процесс gearman внутри процесса, чтобы сначала загрузить изображение из источника в временный каталог, а затем загрузить его на диск Google.Вот сценарий:

    <?php
require_once "../classes/drive.class.php";
    $worker = new GearmanWorker();
    $worker-> addServer('localhost');
    $worker->addFunction('init', 'downloader');
    $worker->addFunction('upload', 'uploader');
    function downloader($job){
        // downloads the images from facebook
        $data = unserialize($job->workload()); // receives serialized data
        $url = $data->url;
        $file = rand().'.jpg';
        $saveto  = __DIR__.'/tmp/'.$file;
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
        $raw=curl_exec($ch);
        curl_close ($ch);
        if(file_exists($saveto)){
            unlink($saveto);
        }
        $fp = fopen($saveto,'x');
        fwrite($fp, $raw);
        fclose($fp);
        // create a gearman client to upload image to google drive
        $client = new GearmanClient();
        $client->addServer();
        $data['file'] = $saveto;
        return $client->doNormal('upload', serialize($data)); // ensure synchronous dispatch
        // can implement a post request return call, to denote a loading point on a loading bar.
    }
    function uploader($job){
        $data = unserialize($job->workload());
        $file = $data->file;
        $google = $data->google; 
        $drive = new Drive($google);
        return $drive->init($file); // returns boolean
    }
?>

Проблема в том, что когда я запускаю работника, используя php worker.php & Процесс запускается, но завершается сам, как только я начинаю что-то делать в консоли с сообщением "DONE", напечатанным на моемconsole.

Как мне выполнять свои процессы?и продолжаете ли этот сценарий работать?

Это расплывчатое объяснение, но, пожалуйста, попробуйте разобраться в нем и помочь.Я действительно новичок в снаряжении.

Спасибо

1 Ответ

0 голосов
/ 21 октября 2018

Вам не хватает рабочего цикла.

// Create the worker and configure it's capabilities
$worker = new GearmanWorker();
$worker->addServer('localhost');
$worker->addFunction('init', 'downloader');
$worker->addFunction('upload', 'uploader');

// Start the worker
while($worker->work());

// Your function definition
function downloader($job) {
    // do stuff with $job
}

function uploader($job) {
    // do stuff with $job
}
...