Я совершенно новый в RabbitMQ. Я работаю с библиотекой php-amqplib с codeigniter и все еще интересуюсь некоторыми знаниями, которых мне не хватает.
- Почему используется
$channel->wait()
? - Почему он всегда находится внутри бесконечной петли?
- Как я могу обойти бесконечный цикл while.
Как в случае, когда один пользователь моего проекта хочет транслировать новую кампанию на 100 тыс. Потенциальных клиентов, второй пользователь получает действие, если у него есть 100 писем, которые нужно отправить, второй должен ждать 100 тыс. Писем, чтобы получить первый, затем последний пользователь получает свою очередь.
Мне нужно решение для Параллельных потребителей, который работает плавно, не затрагивая другие
Вот мой фрагмент кода:
public function campaign2(){
$this->load->library('mylibrary');
for($i=1;$i<=5;$i++) {
$url = "http://localhost/myproject/rabbit/waiting";
$param = array('index' => $i);
$this->waiting($i);
}
}
public function waiting($i)
{
ini_set('memory_limit','400M');
ini_set('max_execution_time', 0);
ini_set('display_errors', 1);
${'conn_'.$i} = connectRabbit();
${'channel_'.$i} = ${'conn_'.$i}->channel();
${'channel_'.$i}->exchange_declare('ha-local-campaign-'.$i.'-exchange', 'fanout', false, true, false);
$q = populateQueueName('campaign-'.$i);
${'channel_'.$i}->queue_declare($q, false, true, false, false);
${'channel_'.$i}->queue_bind($q, 'ha-local-campaign-'.$i.'-exchange', 'priority.'.$i);
$consumer_tag = 'campaign_consumer' ;
function process_message($msg) {
echo 'Mail Sent';
$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
}
function shutdown($channel, $conn){
echo '['.date('H:i:s').'] Campaign consumer - Shutdown!!';
}
${'channel_'.$i}->basic_consume($q, $consumer_tag, false, false, true, false,'process_message');
while(1) {
${'channel_'.$i}->wait();
}
register_shutdown_function('shutdown', ${'channel_'.$i}, ${'conn_'.$i});
}
Если кто-то любезно наставит меня через этот процесс я буду благодарен.
Совет по кодированию: PHP не имеет понятия вложенных функций, поэтому ваши функции 'process_message' и' shutdown' являются просто обычными глобальными функциями, а не частью этого метода или класса; если вы дважды вызовете метод 'ожидания', вы получите сообщение об ошибке, потому что вы будете объявлять их дважды с тем же именем. Вероятно, вы хотите [анонимные функции] (http://php.net/manual/en/functions.anonymous.php) или вызвать методы [используя синтаксис 'array ($ this, 'methodName)) (http://php.net/manual/en/language.types.callable.php). – IMSoP
Кроме того, переменные переменные ('$ {'conn _'. $ I} = connectRabbit();') используют массив ('$ connections = array(); ... $ connections [$ i] = connectRabbit (); '). Я обещаю, с ним работать будет намного легче. – IMSoP