Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通知用户作业已使用RabbitMQ和WebSocket完成的最佳方式_Php_Python_Yii2_Rabbitmq - Fatal编程技术网

Php 通知用户作业已使用RabbitMQ和WebSocket完成的最佳方式

Php 通知用户作业已使用RabbitMQ和WebSocket完成的最佳方式,php,python,yii2,rabbitmq,Php,Python,Yii2,Rabbitmq,我使用Yii2和Yii2队列扩展将RabbitMQ中的作业推送到某个队列中。 这些作业正在将xls | csv文件导入数据库。在作业结束时,我将消息发送到另一个队列-通过python pika侦听,并通过websocket发送到客户端 php,一段发送新消息的作业代码 if (!empty($imported)) { $connection = new AMQPStreamConnection($queue->host, $queue->port, $que

我使用Yii2和Yii2队列扩展将RabbitMQ中的作业推送到某个队列中。 这些作业正在将xls | csv文件导入数据库。在作业结束时,我将消息发送到另一个队列-通过python pika侦听,并通过websocket发送到客户端

php,一段发送新消息的作业代码

if (!empty($imported)) {

            $connection = new AMQPStreamConnection($queue->host, $queue->port, $queue->user, $queue->password);
            $channel = $connection->channel();

            $channel->queue_declare('import_queue', true, true, false, false);

            $message = 'Catalog, imported items: ' . count($imported);
            $message = new AMQPMessage($message, [
                'content_type' => 'text/plain',
                'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT
            ]);

            $channel->basic_publish(
                $message, '', 'import_queue'
            );

            $channel->close();
            $connection->close();
        }
python代码。

credentials = pika.PlainCredentials('admin', 'password')
parameters = pika.ConnectionParameters('localhost',
                                       5672,
                                       '/',
                                       credentials)

amqp_conn = pika.BlockingConnection(parameters)
amqp_ch = amqp_conn.channel()

def threaded_rmq():
    amqp_ch.queue_declare(queue="import_queue", durable=True)
    amqp_ch.basic_consume(callback, queue="import_queue", no_ack=True)
    amqp_ch.start_consuming()


def callback(ch, method, properties, body):
    data = {'type': 'imported_catalog_items', 'message': body}
    json_data = json.dumps(data)
    for client in clients:
        client.sendMessage(u'' + json_data)

def disconnect_to_rabbitmq():
    amqp_ch.stop_consuming()
    amqp_conn.close()
问题: 我不知道最后一项工作什么时候完成。 当用户发送文件时,我阻塞html表单并应用加载程序图标。 我将会话变量设置为阻止此操作。我想在执行所有作业时取消阻止表单(删除加载程序),并通知用户“导入作业已完成”


最好的方法是什么?谢谢。

如果您阻止用户界面,使用后台作业有什么意义。对我来说,这就是使用背景工作的全部目的。我已经更新了我的问题。我想解锁表单,当所有作业都将被执行时,这更有意义,我们使用Rabbit,但我们有一个显示的进度条。为此,我们只使用数据库和AJAX,但我们必须使用DB跟踪其他内容(用于对作业进行计费),因此在您的案例中可能没有意义。这意味着我知道一个很好的技巧,使用SplFileObject计算CSV中的行数,我们使用它来获得总行数。然后我们每N行增加一个计数器来计算进度百分比。@ArtisticPhoenix是的,使用进度条和AJAX调用这是一个好主意,我们的项目中有几个模块是这样工作的。当csv或xls文件不太大或者我们不想使数据处理变得复杂(保存到DB、从文件上载图像、更多关系逻辑等)时,我们使用这种情况。我们决定使用后台作业来导入目录项-超过5000项,并且每个项都需要上载图像,将许多字段保存到数据库。我不知道如何在作业完成后从Rabbit那里获取消息。如果你阻止UI,使用后台作业有什么意义。对我来说,这就是使用背景工作的全部目的。我已经更新了我的问题。我想解锁表单,当所有作业都将被执行时,这更有意义,我们使用Rabbit,但我们有一个显示的进度条。为此,我们只使用数据库和AJAX,但我们必须使用DB跟踪其他内容(用于对作业进行计费),因此在您的案例中可能没有意义。这意味着我知道一个很好的技巧,使用SplFileObject计算CSV中的行数,我们使用它来获得总行数。然后我们每N行增加一个计数器来计算进度百分比。@ArtisticPhoenix是的,使用进度条和AJAX调用这是一个好主意,我们的项目中有几个模块是这样工作的。当csv或xls文件不太大或者我们不想使数据处理变得复杂(保存到DB、从文件上载图像、更多关系逻辑等)时,我们使用这种情况。我们决定使用后台作业来导入目录项-超过5000项,并且每个项都需要上载图像,将许多字段保存到数据库。我不知道如何才能在工作完成后从兔子那里得到信息。