PHP & RabbitMQ и запуск удаленного контроллера, который будет загружать данные с помощью curl с другого веб-сервера - PullRequest
0 голосов
/ 02 октября 2018

У меня есть небольшая проблема.У меня есть контроллер и действие, написанное на phalcon, которое доступно по адресу http://localhost/download/data/(1-5000). Что он делает, он связывает с curl с веб-сайтом и записывает данные в базу данных.Поскольку объем информации велик, я запускаю цикл, который помещает все эти отдельные задания в администратор очередей RabbitMQ, давая в качестве параметра page_id.Я смог поместить все 5000 заданий в очередь и создал скрипт, который должен использовать эти задания, но по какой-то причине он не работает, потому что, если бы он работал, он бы создал записи в базе данных.Файл php Listener.php

<?php
require_once( __DIR__ . '/../vendor/autoload.php');
use PhpAmqpLib\Connection\AMQPStreamConnection;

ob_start();
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
if (!$connection) {
    die("no connection");
}
$channel = $connection->channel();
$channel->queue_declare('HelloTime', false, false, false, false);
echo " [*] Waiting for messages. To exit press CTRL+C\n";
$callback = function ($pg) {
     echo ' [x] Received ', $pg->body, "\n";
     $page = $pg->body;
     header('Location: http://localhost/download/data/'.$page.'');
};
$channel->basic_consume('HelloTime', '', false, true, false, false, $callback);
while (count($channel->callbacks)) {
    $channel->wait();
}
$this->fsockopen();
ob_end_flush();

, поэтому после создания очереди я запускаю в терминале bash php Listener.php, где я вижу, что он был выполнен и удален из очереди sudo rabbitmqctl list_queue показывает от 5000 до 0, но нет никакого следа выполнения на контроллере и действиях по некоторым причинам, которые я не понимаю.

Я использовал ob_start(); ob_end_flush(); для удаления ошибок, таких как cannot modify header information Текущая загрузка curl илогика входа в базу данных находится в Download controller, написанном на Phalcon

Почему обратный вызов не может выполнить действие на удаленном контроллере?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Моя реализация помещения очередей на rabbitMQ с помощью phalcon

 <php
    require_once(APP_PATH.'/vendor/autoload.php');
    use PhpAmqpLib\Connection\AMQPStreamConnection;
    use PhpAmqpLib\Message\AMQPMessage;
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    set_time_limit(0);
    Class DownloadController extends ControllerBase
    {
    public function execute($page)
        {
            $connection = new AMQPStreamConnection(
                'localhost',    #host - host name where the RabbitMQ server is runing
                5672,           #port - port number of the service, 5672 is the default
                'guest',        #user - username to connect to server
                'guest'         #password
            );
            /** @var $channel AMQPChannel */
            $channel = $connection->channel();
            $channel->queue_declare(
                'HelloTime',    #queue name - Queue names may be up to 255 bytes of UTF-8 characters
                false,          #passive - can use this to check whether an exchange exists without modifying the server state
                false,          #durable - make sure that RabbitMQ will never lose our queue if a crash occurs - the queue will survive a broker restart
                false,          #exclusive - used by only one connection and the queue will be deleted when that connection closes
                false           #autodelete - queue is deleted when last consumer unsubscribes
            );
            $pg = new AMQPMessage($page);
            $channel->basic_publish(
                $pg,           #message
                '',             #exchange
                'HelloTime'     #routing key
            );
            $channel->close();
            $connection->close();
        }
        public function dataAction() {
            $page=5000;
            while ($page>=1) {
                $this->execute($page);
                $page--;
            }
        }
    }
0 голосов
/ 02 октября 2018

проблема решена, я поставил еще один запрос get curl, который выполняет то, что нужно сделать

...