2010-05-12 2 views
1

я пытался на двух разных серверах, чтобы получить beanstalkd и работает, и сделать пару тестов (локально на MacOSX составлен из источника, и на сервере CentOS установлен с ням)Невозможно заказать работу с beanstalkd

I может получить сервер работает либо с

sudo beanstalkd -d -p 11300 

или

sudo beanstalkd -p 11300 & 

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

telnet localhost 11300 

я следующее, чтобы имитировать тест PHP скрипт:

use foo 
USING foo 
put 0 0 120 5 
hello 
INSERTED 1 
reserve-with-timeout 0 
TIMED_OUT 

Если я просто запустить

reserve 

Он застрял на неопределенный срок.

PHP код

/** 
    * BeanStalk 0.10 - Example code 
    * 
    * This is a quick example to get you started using the client. 
    */ 

    require(dirname(__FILE__).'/../src/BeanStalk.class.php'); 

    /** 
    * Connect to the beanstalkd server(s) 
    * 
    * Option array: 
    * 
    *  array(
    *   'servers'    => array('ip:port'[, 'ip:port'[, ...]]), 
    *   'select'    => 'random wait', 
    *   'connection_timeout' => 0.5, 
    *   'peek_usleep'   => 2500, 
    *   'connection_retries' => 3, 
    *   'auto_unyaml'   => true 
    *  ); 
    * 
    * select -> this tells the client what type of blocking to use when selecting from 
    * different servers. There are currently four choices: 
    * 
    * random wait:  pick a random server from the list and wait for a job 
    * 
    * sequential wait: pick the next server in the list and wait for a job 
    * 
    * random peek:  in a loop, pick a random server and peek-ready(), looking for a job 
    *      until a server is found that has something available. 
    * 
    * sequential peek: in a loop, pick the next server and peek-ready() ... etc. 
    * 
    * the *peek modes have a companion setting, peek_usleep, which tells the client how long 
    * to usleep() for between peeks to servers. 
    * 
    * auto_unyaml -> if true, this causes the client to assume the presence of the syck yaml 
    * parser, and attempts to 'unyamlize' yaml output for you before returning it. 
    */ 
echo "opening\n"; 
    $beanstalk = BeanStalk::open(array(
     'servers'  => array('127.0.0.1:11300'), 
     'select'  => 'random peek' 
    )); 

echo "switching tube\n"; 

    // As in the protocol doc. 
    $beanstalk->use_tube('foo'); 

echo "putting job\n"; 

    // As in the protocol doc. 
    $beanstalk->put(0, 0, 120, 'say hello world');  // Add a job to the queue with highest priority, 
                 // no delay, 120 seconds TTR, with the contents 
                 // 'say hello world'. 

                 // NOTE: the put() method here supports a final optional 
                 // argument, a tube name. If supplied, the server will 
                 // first switch to that tube, write the job, then switch 
                 // back to the old tube again. 

echo "trying to reserve\n"; 

    // As in the protocol doc. 
    $job = $beanstalk->reserve();      // Assuming there was nothing in the queue before 
                 // we started, this will give us our 'hello world' 
                 // job back. 

echo "about to output\n";  

    // This is a BeanQueueJob object. 
    echo $job->get();         // Output: 'say hello world' 

    Beanstalk::delete($job);       // Delete the job. 

и просто замирает на "пытается зарезервировать". Оригинальный код от:

http://sourceforge.net/projects/beanstalk/

Любые идеи? Заранее спасибо.

+0

Вы можете добавить PHP код, который имеет проблемы? Также версия демона ('beanstalkd -v'). Вам не нужно запускать его всегда как демон - он будет счастливо размещаться на переднем плане в окне терминала. –

+0

Версия, если 1.4.4, добавили PHP-код выше. Спасибо за подсказку, которая не работает как -d, такая же проблема, но экономит время, убивая бесконечный цикл. –

+0

Быстрое замечание, что я могу зарезервировать, когда не использую новую трубку, хотя команда list-tubes перечисляет «foo» при использовании вышеуказанных команд telnet. Так может быть что-то в конфигурации или настройке, останавливая отдельные трубки от работы. –

ответ

7

Чтобы использовать трубки, отличные от стандартных, похоже, вам нужно добавить «часы» для этой трубки. Например:

use foo 
USING foo 
put 0 0 120 5 
hello 
INSERTED 1 
reserve-with-timeout 5 
TIMED_OUT 
list-tubes 
OK 20 
--- 
- default 
- foo 

watch foo 
WATCHING 2 
reserve-with-timeout 5 
RESERVED 1 5 
hello 

Это не слишком ясно, на документации, которая, кажется, подразумевает, что «использование» команда автоматически имеет запас команд с помощью трубки - так же, как поместить автоматически использует эту трубу.

Надеюсь, что это поможет другим новичкам beanstalkd!

+0

Возможно, вы захотите взглянуть на [beanstalkc tutorial] (http://github.com/earl/beanstalkc/blob/master/TUTORIAL) (особенно [строка 138ff] (http://github.com/earl/beanstalkc/блоб/ведущий/Учебник # L138)). Несмотря на то, что учебник был написан для клиентской библиотеки Python, он охватывает большинство аспектов beanstalkd и может быть полезен для пользователей других языков и библиотек. – earl

+0

Brilliant, спасибо за ссылку earl - легко перевести это на другие языки/библиотеки в качестве вступительного слова. –

+1

с использованием ключевого слова для ввода данных в трубку, ключевое слово для поиска - для извлечения. ответ хороший, проблема, которую автор проблемы пишет в трубу, которую он не наблюдал – asdmin

-1

Он предназначен для блокировки в резерве - он ждет работы. В другом терминале положите работу в трубу - ваша резервная команда вернется с новой работой.

+0

Во-первых, ОП использует резерв-с-тайм-аут; это не должно блокироваться. Во-вторых, они сначала выполняют работу на трубе, а затем резервируют работу, поэтому работа должна быть доступна сразу, если все остальное хорошо (и на трубке нет других наблюдателей). –

3

https://raw.github.com/kr/beanstalkd/master/doc/protocol.txt

Этот документ является более ясным.

Команда «use» предназначена для производителей. Последующие команды put помещают задания в тубу, указанную этой командой. Если команда использования не была выполнена, задания будут помещены в трубку с именем «по умолчанию».

Команда «смотреть» добавляет названную трубку в список просмотра для текущего соединения . Команда резервирования возьмет работу из любой из трубок в списке наблюдений . Для каждого нового соединения список часов изначально состоит из одной трубки с названием «по умолчанию».

так и в потребительских вам не нужно называть «использовать», но называть «смотреть»