Gearman обрабатывает параллельно и выдает промежуточный результат

Я использую Gearman и Slim PHP для создания успокоительного API, в котором:

Пользователь вызовет спокойный API и отправит файл URL. Это будет тогда:

  1. Загрузите файл и отправьте пользователю уникальный идентификатор файла в виде ответа http
  2. Когда ответ отправлен, я хочу начать обработку файла
  3. Пользователь может проверить состояние процесса с помощью вызова GET www.example.com/api/status API.

Я использовал gearman для doNormal для части загрузки файла, но ответ о состоянии отправляется только после того, как обработка завершена. Кроме того, как получить статус каждого клиентского процесса?
Мне нужна дополнительная помощь о том, как именно я мог бы структурировать то же самое, и несколько деталей о том, как поставить в очередь обработку, поскольку я новичок в gearman.

1

Решение

Вам нужно использовать рабочий статус а также doBackground ().
Во-первых, вам нужно инициализировать перевод. Это делается путем отправки задачи в фоновый режим и отправки пользователю дескриптора задания. Вы вызываете это через yourserver.com/api/file-transfer и должны отправить запрос POST с набором fileurl. Ответ — объект json.

<?php
// use composer for slim
require_once "vendor/autoload.php";
$app = new \Slim\Slim();

// init file transfer
$app->post('/file-transfer', function () use ($app) {
$resp = array();
try {
// get file url
$fileurl = $app->request->post('fileurl');
$data = json_encode(array("fileurl"=>$fileurl);

// send to gearman
$client = new GearmanClient();
$client->addServer();

// store the gearman handle and send the task to the background
$jobHandle = $client->doBackground("fileUpload", $data);

if ($client->returnCode() != GEARMAN_SUCCESS) throw new Exception("Could not add the job to the queue.", 1);

$resp["msg"] = "File upload queued";
$resp["handle"] = $jobHandle;
} catch(Exception $e) {
// some error handling
$resp["msg"] = "There occured a strange error.";
$resp["error"] = true;
} finally {
$response = $app->response();
$response['Content-Type'] = 'application/json';
$response->status(200);
$response->body(json_encode($resp));
}
});
?>

На втором шаге пользователь должен запросить сервер с дескриптором задания (который он получил от первого вызова):

$app->post('/file-status', function () use ($app) {
$jobHandle = $app->request->params('handle');
$resp = array();
try {
// ask for job status
$client = new GearmanClient();
$client->addServer();
$stat = $client->jobStatus($jobHandle);
if (!$stat[0]) { // it is done
$resp["msg"]    = "Transfer completed.";
} else {
$resp["msg"]    = "Transfer in progress.";
$w = (float)$stat[2]; // calculate the percentage
$g = (float)$stat[3];
$p = ($g>0)?$w/g*100:0;
$resp["percentage"] = $p;
}
} catch(Exception $e) {
// some error handling
$resp["msg"] = "There occured a strange error.";
$resp["error"] = true;
} finally {
$response = $app->response();
$response['Content-Type'] = 'application/json';
$response->status(200);
$response->body(json_encode($resp));
}
});

Во втором запросе у вас есть массив $ stats из $ client-> jobStatus ().
$ stats [0] сообщает вам, известно ли задание серверу Gearman. Второй инструмент проверяет, работает ли он, и три и четыре (2/3) используются для расчета процента перевода (вам необходимо установить эти значения самостоятельно!).

1

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

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

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