Symfoware

Symfowareについての考察blog

RabbitMQに画像データをキューとして登録する

RabbitMQにMessagePackのバイナリデータをキュートして登録してみました。
RabbitMQにMessagePackのデータをキューとして登録する

ということは、画像データもキューに入れられるのでは?

PHPでアップロードされた写真データをそのままキューに登録。
画像サーバーへの保存やサムネイルなどの作成を、後ろに構えているPythonで処理。

という使い方ができるかも。


PHPのサンプル



ファイルをアップロードし、phpでその画像データをRabbitMQに登録します

ファイル選択用のhtml

・pic.html


  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>画像のアップロード</title>
  6. </head>
  7. <body>
  8. <form action="send.php" method="post" enctype="multipart/form-data">
  9. ファイル:<br />
  10. <input type="file" name="upfile" size="30" /><br />
  11. <br />
  12. <input type="submit" value="アップロード" />
  13. </form>
  14. </body>
  15. </html>




アップロードされたファイルをRabbitMQに登録するphp

・send.php


  1. <?php
  2. require_once __DIR__ . '/vendor/autoload.php';
  3. use PhpAmqpLib\Connection\AMQPConnection;
  4. use PhpAmqpLib\Message\AMQPMessage;
  5. if (!is_uploaded_file($_FILES["upfile"]["tmp_name"])) {
  6.     echo "ファイルが選択されていません。";
  7.     return;
  8. }
  9. # アップロードされた画像データをロード
  10. $image = file_get_contents($_FILES["upfile"]["tmp_name"]);
  11. # RabbitMQに接続
  12. $connection = new AMQPConnection('192.168.1.12', 5672, 'symfo', 'P@ssw0rd');
  13. $channel = $connection->channel();
  14. # キューに永続化モードで接続
  15. $channel->queue_declare('image', false, true, false, false);
  16. $properties = array('content_type' => 'text/plain', 'delivery_mode' => 2);
  17. # データ登録実行
  18. $msg = new AMQPMessage($image, $properties);
  19. $channel->basic_publish($msg, '', 'image');
  20. echo " [x] Sent image data<br>";
  21. $channel->close();
  22. $connection->close();






登録する画像はそれなりに大きなデータで試してみたかったので、
11MBの画像ファイルを用意しました。

phpのデフォルト設定だと、このサイズのアップロードは行えないので、
設定を変更します。


# vi /etc/php5/apache2/php.ini




upload_max_filesize,post_max_sizeを適当に変更。


upload_max_filesize = 20M
post_max_size=30M




設定を読み直します。


# /etc/init.d/apache2 restart



phpinfoを表示して、変更されていることを確認します。

472_01.png



ファイル選択画面。

472_02.png


登録できたようです。

472_03.png


キューにも登録出来ました。

472_04.png





Pythonで取り出し



Pythonで登録された画像を復元してみます。

・recv.py


  1. # -*- coding:utf-8 -*-
  2. import pika
  3. # ユーザー名とパスワード
  4. credentials= pika.PlainCredentials('symfo', 'P@ssw0rd')
  5. # 接続パラメーター作成
  6. connect_param = pika.ConnectionParameters(
  7.                     host='192.168.1.12',
  8.                     credentials=credentials)
  9. # コネクション作成
  10. connection = pika.BlockingConnection(connect_param)
  11. channel = connection.channel()
  12. # helloキューに接続
  13. channel.queue_declare(queue='image',durable=True)
  14. print ' [*] Waiting for messages. To exit press CTRL+C'
  15. # コールバックメソッドを指定
  16. def callback(ch, method, properties, body):
  17.     f = open('test.jpg', 'wb')
  18.     f.write(body)
  19.     f.close()
  20.     
  21.     print 'image get'
  22. # コールバックを登録して待ち受け
  23. channel.basic_consume(callback,
  24.                      queue='image',
  25.                      no_ack=True)
  26. channel.start_consuming()





実行してみると、ちゃんとtest.jpgに11Mの画像が復元出来ました。
ちょっと感動です。
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/09/07(日) 19:03:57|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<RabbitMQ MsgPackを使用して、画像のタイトルと実データをキューに登録する | ホーム | RabbitMQにMessagePackのデータをキューとして登録する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1492-5d917db3
この記事にトラックバックする(FC2ブログユーザー)