Оптимальный язык для асинхронной обработки информации - PullRequest
0 голосов
/ 05 января 2011

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

  • Пользователь отправляет некоторые данные через веб-сайт, и они сохраняются в базе данных
  • PHP-скрипт, выполняемый через CLI, циклически просматривает все данные в базе данных каждые 5 минут или около того. Он считывает информацию, представленную пользователем в базе данных, обрабатывает ее, а затем создает несколько других записей в других базах данных. Часто может потребоваться опубликовать что-либо через http, используя file_get_contents.
    • Я не всегда могу обрабатывать информацию просто, когда пользователь отправляет ее по логистическим причинам (это не подлежит обсуждению)

Код для него будет выглядеть примерно так:

$q = mysql_query("SELECT username, infoA, infoB FROM data");

while($r = mysql_fetch_array($q))
{

 some_function($r['username'], $r['infoA']);
 another_function($r['infoB']);

}

Функции «some_function» и «another_function» - это место, где происходит вся фактическая обработка информации. Вот в чем проблема: часто приходится много циклически проходить между записями, а между временем обработки первой и последней слишком велика задержка. Мне нужны все данные, обработанные с минимальной задержкой между первой и последней записью. Сами функции хорошо оптимизированы и работают довольно быстро, так что это не проблема. Поскольку будущие вызовы функций не должны ссылаться на данные предыдущих вызовов функций, я думаю, что мне нужно, чтобы функции выполнялись асинхронно. Таким образом, сценарий может перейти к следующей записи, не дожидаясь обработки первой записи.

Сценарий php cli, который я создал, предназначен в основном для тестирования. Он хорошо работает для предварительного тестирования, но после запуска количество данных будет значительно больше. Какой идеальный язык для решения такой задачи, как эта. Мне, конечно, нужно, чтобы функции выполнялись асинхронно. Однако если одновременно выполняется слишком много асинхронных вызовов, это может привести к перегрузке системы или неправильной обработке информации. Следовательно, также должен быть эффективный способ справиться с этим. Могу ли я сделать это в php или перейти на что-то еще и почему?

Требования состоят в том, чтобы я мог делать http-запросы с данными GET (мне не нужно ждать результатов), иметь возможность использовать mysql и memcached.

На самом деле, я найму программистов для работы над этим. Итак, я действительно ищу как можно больше информации, чтобы точно определить, какие навыки нужно искать в программистах.

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

1 Ответ

1 голос
/ 05 января 2011

Я рекомендую вам использовать Gearmand прямо сейчас.

С этим расширением очень легко работать с PHP http://php.net/manual/fr/book.gearman.php

Просто настройте сервер Gearman и выполните рефакторинг кода, чтобы делегировать всю обработку этому серверу.

Ваш предыдущий код может быть изменен следующим образом:

<?php

# Client Code
$client= new GearmanClient();
$client->addServer();
print $client->doBackground("action1", json_encode(array($username, $infoA)));
print $client->doBackground("action2", $infoB);


# Worker Code
$worker= new GearmanWorker();
$worker->addServer();
$worker->addFunction("action1", "some_function");
$worker->addFunction("action2", "another_function");
while ($worker->work());

function some_function($job)
{
    list($username, $infoA) = json_decode($job->workload(), true);
    // do the stuff ...
}

function another_function($job)
{
    $infoB = $job->workload();
    // do the stuff ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...