Любой способ получить доступ к администрации Gearman?
Вопрос
Я хочу иметь возможность запросить сервер Gearman, чтобы определить, сколько экземпляров работника у меня работает (в основном я хочу убедиться, что это RunTaskA
доступен и RunTaskB
доступен, если нет рабочих, выполняющих эти задачи, я хочу иметь возможность отправлять предупреждение.
Есть какой-либо способ сделать это?
Также: безумный реквизит, если вы знаете PHP способ запросить сервер Gearman.
Редактировать: Я знаю о расширении PHP Gearman, которое доступно ищу, но я не ищу расширение задачи, мне нужно что -то, что позволяет мне запросить сервер Gearman и посмотреть, сколько работников выполняют определенную задачу.
Решение
class Waps_Gearman_Server {
/**
* @var string
*/
protected $host = "127.0.0.1";
/**
* @var int
*/
protected $port = 4730;
/**
* @param string $host
* @param int $port
*/
public function __construct($host=null,$port=null){
if( !is_null($host) ){
$this->host = $host;
}
if( !is_null($port) ){
$this->port = $port;
}
}
/**
* @return array | null
*/
public function getStatus(){
$status = null;
$handle = fsockopen($this->host,$this->port,$errorNumber,$errorString,30);
if($handle!=null){
fwrite($handle,"status\n");
while (!feof($handle)) {
$line = fgets($handle, 4096);
if( $line==".\n"){
break;
}
if( preg_match("~^(.*)[ \t](\d+)[ \t](\d+)[ \t](\d+)~",$line,$matches) ){
$function = $matches[1];
$status['operations'][$function] = array(
'function' => $function,
'total' => $matches[2],
'running' => $matches[3],
'connectedWorkers' => $matches[4],
);
}
}
fwrite($handle,"workers\n");
while (!feof($handle)) {
$line = fgets($handle, 4096);
if( $line==".\n"){
break;
}
// FD IP-ADDRESS CLIENT-ID : FUNCTION
if( preg_match("~^(\d+)[ \t](.*?)[ \t](.*?) : ?(.*)~",$line,$matches) ){
$fd = $matches[1];
$status['connections'][$fd] = array(
'fd' => $fd,
'ip' => $matches[2],
'id' => $matches[3],
'function' => $matches[4],
);
}
}
fclose($handle);
}
return $status;
}
}
Другие советы
Для быстрой проверки я использую этот Bash One Liner:
# (echo status ; sleep 0.1) | netcat 127.0.0.1 4730
Это открывает соединение с экземпляром Gearman, работающим на LocalHost, и отправляет запрос «статус». Это содержит имя и количество заданий в этом случае. Затем информация может быть обработана с помощью GREP/AWK/WC и т. Д. Для отчетности и оповещения.
Я также делаю то же самое с запросом «работников», который показывает всех подключенных работников.
# (echo workers ; sleep 0.1) | netcat 127.0.0.1 4730
Сон должен держать соединение открытым достаточно долго для ответа.
Полный список административных команд и то, что означает вывод http://gearman.org/index.php?id=protocol Просто найдите «Административный протокол»
Чтобы расширить ответ D5Ve, поскольку NetCat будет сидеть и ждать гнезда, вы можете добавить параметр -W с максимальным количеством секунд для запуска. Так что, если вы запросите Localhost:
# (echo status ; sleep 0.1) | netcat 127.0.0.1 4730 -w 1
... в противном случае вы никогда не вернетесь к командной строке.
Насколько я знаю, нет такого расширения в Gearman, управление и мониторинг сценария работника - ваша ответственность, вы можете попробовать один из них для этой цели -
Supersisord - это приложение Python для запуска приложения в фоновом режиме и их мониторинга.
Или вы можете использовать Брайан Мун Gearman Manager
Я думаю, тебе это нужноhttp://github.com/liorbk/php
Gearman имеет расширение PHP. Анкет Вы уже изучили это?
Наткнулся на это сегодня, не проверял это сам, но это выглядит многообещающе.
В Python вы можете сделать следующее:
import gearman
admin_client = gearman.GearmanAdminClient(['127.0.0.1:4730',])
status = admin_client.get_status()
for w in status:
if w["task"] == "YOUR_TASK_NAME":
print(w)
Примечание: Вы должны установить пакет с именем «Gearman», используя PIP или Easy_Install, чтобы избежать любых исключений, выполняющих приведенный выше код.
Кроме того, проверьте следующих клиентов -администраторов, которые в целом упрощают администрирование Gearman.
Когда все остальное терпит неудачу, вы можете использовать gearadmin
инструмент, найденный в gearman-tools
Пакет в Ubuntu, позвонив exec()
выполнить его в новом процессе. Вот Ссылка на свой выходной формат.
Это предполагает, что PHP и Gearman работают на том же сервере.