Любой способ получить доступ к администрации Gearman?
Я хочу, чтобы иметь возможность запросить сервер ретранслятора, чтобы определить, сколько экземпляров рабочего я запускаю (в основном я хочу убедиться, что RunTaskA
доступен, и RunTaskB
доступен, если нет рабочих, обрабатывающих эти задачи, я хочу иметь возможность отправить оповещение.
Есть ли способ сделать это?
Также: Mad реквизиты, если вы знаете PHP-способ запроса сервера ретранслятора.
Изменить. Я знаю о расширении механизма передачи PHP, которое доступно изначально, но я не ищу расширения для представления задачи. Мне нужно что-то, что позволяет мне запрашивать сервер ретранслятора и посмотреть, сколько работники выполняют определенную задачу.
Ответы
Ответ 1
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;
}
}
Ответ 2
Для быстрой проверки я использую этот bash однострочный:
# (echo status ; sleep 0.1) | netcat 127.0.0.1 4730
Это открывает соединение с экземпляром ретранслятора, работающим на локальном хосте, и отправляет запрос статуса. Он содержит имя и количество заданий в этом экземпляре. Затем информацию можно обработать с помощью grep/awk/wc и т.д. Для сообщения и предупреждения.
Я также делаю то же самое с "рабочим" запросом, который показывает всех подключенных работников.
# (echo workers ; sleep 0.1) | netcat 127.0.0.1 4730
Сон заключается в том, чтобы открыть соединение достаточно долго для ответа.
Полный список административных команд и то, что означает средство вывода, http://gearman.org/index.php?id=protocol Просто найдите "Административный протокол"
Ответ 3
Чтобы расширить ответ d5ve, поскольку netcat будет сидеть и ждать в сокете, вы можете добавить параметр -w с максимальным количеством секунд для запуска. Поэтому, если вы запрашиваете localhost:
# (echo status ; sleep 0.1) | netcat 127.0.0.1 4730 -w 1
... иначе вы никогда не вернетесь в командную строку.
Ответ 4
Насколько я знаю, в gearman нет такого расширения, ответственный за управление и мониторинг script, вы можете попробовать один из них для этой цели -
Supervisord - это приложение python для запуска приложения в фоновом режиме и мониторинга.
ИЛИ вы можете использовать brian moon менеджер передач
Ответ 5
Я думаю, вам нужно это
http://github.com/liorbk/php
Ответ 6
У Gearman есть расширение php. Вы еще изучали это?
Ссылка на PHP
Ответ 7
Наткнувшись на него сегодня, он не тестировал его сам, но выглядит многообещающим.
https://github.com/yugene/Gearman-Monitor
Ответ 8
В 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, чтобы избежать исключений, выполняющих вышеуказанный код.
Кроме того, проверьте следующие клиенты-клиенты, которые упрощают администрирование ретранслятора в целом.
Ответ 9
Если все остальное не удается, вы можете использовать инструмент gearadmin
, найденный в пакете gearman-tools
в Ubuntu, вызывая exec()
, чтобы выполнить его в новом процессе. Вот ссылка на его выходной формат.
Это предполагает, что PHP и Gearman работают на одном сервере.