То, что вы описываете, не должно происходить, я привел пример того, как вы можете освоиться. Клиентский сценарий не будет завершен, пока рабочий ответ с ответом. Но вы можете легко адаптироваться, изменив «doNormal» на «doBackground». Поместите счетчик сна в свою рабочую функцию, чтобы замедлить работника, и поместите своего клиента в цикл, чтобы создать множество рабочих мест, чтобы увидеть процесс, работающий легче.
Код клиента
// Create our client object
$client = new GearmanClient();
// Add a server
$client->addServer(); // by default host/port will be "localhost" & 4730
echo "Sending job\n";
// Send reverse job
$result = $client->doNormal("reverse", "Hello!");
if ($result) {
echo "Success: $result\n";
}
Рабочий код
// Create our worker object
$worker = new GearmanWorker();
// Add a server (again, same defaults apply as a worker)
$worker->addServer();
// Inform the server that this worker can process "reverse" function calls
$worker->addFunction("reverse", "reverse_fn");
while (1) {
print "Waiting for job...\n";
$ret = $worker->work(); // work() will block execution until a job is delivered
if ($worker->returnCode() != GEARMAN_SUCCESS) {
break;
}
}
// A much simple reverse function
function reverse_fn(GearmanJob $job) {
$workload = $job->workload();
echo "Received job: " . $job->handle() . "\n";
echo "Workload: $workload\n";
$result = strrev($workload);
echo "Result: $result\n";
return $result;
}