Symfoware

Symfowareについての考察blog

beanstalkdにMessagePackのバイナリデータをキュートして登録する

RabbitMQでMessagePackを使用し、バイナリデータをキューに登録してみました。
RabbitMQ MsgPackを使用して、画像のタイトルと実データをキューに登録する

同様のことがbeanstalkdで実現できるか試してみます。


おさらい



beanstalkdについて調べた時のメモはこちら。

メッセージキュー管理「beanstalkd」をDebian 7にapt-getでインストールする
beanstalkdのweb管理画面「phpBeanstalkdAdmin」をインストールする
phpからbeanstalkdに「beanstalk」でジョブを投入、取得する
pythonから「beanstalkc」でbeanstalkdにジョブを投入、取得する


beanstalkdのジョブに登録できる最大サイズはデフォルトで64kbです。
こちらを参考に、アップロードする画像サイズより大きなジョブが
登録できるようにしておきます。

beanstalkd jobサイズの変更方法(JOB_TOO_BIGエラー対策)


また、phpのpost上限に引っかかる可能性もあります。
こちらも大きめの値を指定しておきます。

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

/etc/php5/apache2/php.iniを変更した環境で動かしています。


upload_max_filesize = 20M
post_max_size=30M








phpで画像+付帯情報の登録



画像データそのものとアップロード時の付帯情報を
MessagePackでバイナリデータにして登録します。

アップロード画面の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>





情報をキューに登録するphp

・send.php


  1. <?php
  2. require_once('Client.php');
  3. use Beanstalk\Client;
  4. if (!is_uploaded_file($_FILES["upfile"]["tmp_name"])) {
  5.     echo "ファイルが選択されていません。";
  6.     return;
  7. }
  8. # ファイルの付帯情報取得
  9. $name = $_FILES['upfile']['name']; #ファイル名
  10. $mime_type = $_FILES['upfile']['type']; # mime
  11. $size = $_FILES['upfile']['size']; # ファイルサイズ
  12. # アップロードされた画像データをメモリにロード
  13. $image = file_get_contents($_FILES["upfile"]["tmp_name"]);
  14. # データの準備
  15. $data = array(
  16.             'name' => $name,
  17.             'mime_type' => $mime_type,
  18.             'size' => $size,
  19.             'image' => $image
  20.             );
  21. # シリアライズ実行
  22. $binary = msgpack_serialize($data);
  23. // beanstalkdに接続
  24. $beanstalk = new Client(array('host'=>'192.168.1.11', 'port' => 11300));
  25. $beanstalk->connect();
  26. // tube名を指定
  27. $beanstalk->useTube('image');
  28. // データを登録
  29. $beanstalk->put(
  30.     1, // Jobの優先度
  31.     0, // 即時実行するか
  32.     0, // Jobの実行時間(分)
  33.     $binary // Jobのデータ
  34. );
  35. // 切断
  36. $beanstalk->disconnect();
  37. echo $name . 'を登録しました。';






※実行しても反応がない場合はこちらを参考。
jobの最大サイズ指定を疑ってみる。

beanstalkd jobサイズの変更方法(JOB_TOO_BIGエラー対策)


そっけないですが登録画面です。

473_01.png

473_02.png



受信側のPython



受信側のPythonプログラムはこんな感じになりました。


  1. # -*- coding:utf-8 -*-
  2. import beanstalkc
  3. import msgpack
  4. # 接続
  5. beanstalk = beanstalkc.Connection(host='192.168.1.11', port=11300)
  6. # 監視するチューブを指定
  7. beanstalk.watch('image')
  8. while True:
  9.     # ジョブを取得
  10.     job = beanstalk.reserve()
  11.     # データを復元
  12.     ret = msgpack.unpackb(job.body)
  13.     print ret['name']
  14.     print ret['mime_type']
  15.     print ret['size']
  16.     # 画像データ復元
  17.     f = open(ret['name'], 'wb')
  18.     f.write(ret['image'])
  19.     f.close()
  20.     # ジョブを削除
  21.     job.delete()
  22. # 切断
  23. beanstalk.close()





実行すると、見事画像データと付帯情報が取得出来ました。


$ python recv.py
photo-sample_a7R_01.jpg
image/jpeg
17694728

関連記事

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

  1. 2014/09/07(日) 22:08:34|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<W: GPG エラー 公開鍵を利用できないため、以下の署名は検証できませんでしたの対応方法 | ホーム | beanstalkd jobサイズの変更方法(JOB_TOO_BIGエラー対策)>>

コメント

コメントの投稿


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

トラックバック

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