Рубрики
Uncategorized

PHP использует немецкий язык для распределения задач

Автор оригинала: David Wong.

В этой статье приведен пример PHP, использующего немецкий язык для распределения задач. Подробности заключаются в следующем:

1、 Установка редуктора

Загрузите немецкий исходный пакет

https://launchpad.net/gearmand/+download

Например: gearmand-1.1.12.tar.gz

Скачайте немецкий пакет расширений PHP

http://pecl.php.net/package/gearman

Например: немецкий-1.1.2.tgz

Установка немецкого

> yum install boost-devel gperf libevent-devel libuuid-devel
> tar xf gearmand-1.1.12.tar.gz
> cd gearmand-1.1.12
> ./configure
> make && make install

Установите расширение gearman PHP (рекомендуется, чтобы версия PHP была не слишком высокой, так как расширение gearman php7 еще недоступно)

> yum install autoconf
> tar xf gearman-1.1.2.tgz
> cd gearman-1.1.2
> /data/php56/bin/phpize
> ./configure --with-php-config=/data/php56/bin/php-config
> make && make install

Изменить php.ini

> vi /data/php56/lib/php.ini

Добавьте следующие два пункта

extension_dir=/data/php56/lib/php/extensions/no-debug-zts-20131226/
extension=gearman.so

Просмотр расширений

> /data/php56/bin/php -m

2, Простое использование немецкого языка

В gearman есть три роли, участвующие в обработке запросов: клиент > задание > работник, где клиент является инициатором запроса, Задание-планировщик запроса, который используется для распространения запроса клиента среди разных работников. Работник является обработчиком запроса

Например, здесь нам нужно обработать клиента, отправляющего запрос на задание, чтобы вычислить сумму двух чисел. Задание отвечает за планирование работника для вычисления суммы двух чисел.

Сначала мы пишем клиенту. PHP

addServer('127.0.0.1', 4730);
//Donormal is synchronized, waiting for the worker to finish processing and return the result
//Do () is not recommended
$ret = $client->doNormal('sum', serialize(array(10, 10)));

if($ret) {
  Echo 'calculation result:', $RET ',' \ n ';
}

Напишите работнику. Снова PHP

addServer('127.0.0.1', 4730);
//Register a callback function for business processing
$worker->addFunction('sum', function($job) {
  //Workload () gets the serialized data sent by the client
  $data = unserialize($job->workload());

  return $data[0] + $data[1];
});

//Dead cycle
while(true) {
  //Tasks waiting for job submission
  $ret = $worker->work();
  if ($worker->returnCode() != GEARMAN_SUCCESS) {
    break;
  }
}

Давайте сначала запустим немецкую службу

> mkdir -p /usr/local/var/log
> gearmand -d

Запустите рабочий файл

> /data/php56/bin/php /data/worker.php

Запустите файл клиента еще раз

> /data/php56/bin/php /data/client.php

Результаты заключаются в следующем

3, Асинхронная задача обработки немецкого языка

Здесь наш клиент отправляет запрос по электронной почте на работу. Мы не ждем завершения запроса, а продолжаем выполнять его в обратном направлении.

В client.php код выглядит следующим образом:

addServer('127.0.0.1', 4730);
//Dobackground asynchronously returns the handle of the submitted task
$ret = $client->doBackground('sendEmail', json_encode(array(
  'email' => '[email protected]',
  'title '= >'test asynchronous',
  'body' = >'asynchronous execution looks like cow B ',
)));

//Continue with the following code
Echo "there is no fluctuation in my heart, and I even want to laugh.";

do {
  sleep(1);

  //Gets the state of the task handle
  //Jobstatus returns an array
  //First, whether the work has been known
  //Second, is the work running
  //The third and fourth correspond to the numerator and denominator of the percentage of completion respectively
  $status = $client->jobStatus($ret);
  
  Echo "completion status: {$status [2]} / {$status [3]} n";

  if(!$status[1]) {
    break;
  }
} while(true);

Кодекс поведения worker.php заключается в следующем:

addServer('127.0.0.1', 4730);
//Register a callback function for business processing
$worker->addFunction('sendEmail', function($job) {
  //Workload () gets the serialized data sent by the client
  $data = json_decode($job->workload(), true);
  //Simulate time taken to send mail
  sleep(6);
  Echo "send {$data ['email ']} message successfully \;
});

//Dead cycle
//Tasks waiting for job submission
while($worker->work());

Результаты заключаются в следующем

4、 Немецкий язык выполняет несколько задач параллельно

Как мы вычисляем сумму двух чисел параллельно? Добавьте несколько задач в очередь с помощью addtask, а затем выполните параллельные вычисления.

В client.php код выглядит следующим образом:

addServer('127.0.0.1', 4730);
//Set the callback function when the task is completed
$client->setCompleteCallback(function($task) {
  //Gets the data returned by the worker
  echo $task->data(), "\n";
});

//Calculate the cumulative sum of 1 to 500
//Add five tasks to the queue
$client->addTask('sum', json_encode(array(1, 100)));
$client->addTask('sum', json_encode(array(100, 200)));
$client->addTask('sum', json_encode(array(200, 300)));
$client->addTask('sum', json_encode(array(300, 400)));
$client->addTask('sum', json_encode(array(400, 500)));

//To run a task in a queue, the do series does not need runtask ()
$client->runTasks();

Кодекс поведения worker.php заключается в следующем:

addServer('127.0.0.1', 4730);
//Register a callback function for business processing
$worker->addFunction('sum', function($job) {
  //Workload () gets the serialized data sent by the client
  $data = json_decode($job->workload(), true);
  sleep(1);
  $sum = 0;
  for($ix = $data[0]; $ix < $data[1]; ++$ix) {
    $sum += $ix;
  }
  return $sum;
});

//Dead cycle
//Tasks waiting for job submission
while($worker->work());

Мы запускаем пять рабочих рабочих процессов. Когда выполняется запрос клиента, пять задач расчета возвращают результаты почти одновременно.

Результаты заключаются в следующем

Для получения дополнительной информации о PHP читатели, интересующиеся этим сайтом, могут ознакомиться со следующими темами: краткое описание навыков работы с процессами и потоками PHP, краткое описание навыков сетевого программирования PHP, вводный курс базового синтаксиса PHP, полная коллекция навыков работы с массивами PHP, краткое описание использования строк PHP “Руководство по работе с базой данных PHP + MySQL” и “Краткое описание навыков работы с общей базой данных PHP”.

Я надеюсь, что эта статья будет полезна для программирования на PHP.