[PHP-users 7711] Re: PostgreSQLテーブルに画像を出し入れしたい。
Yasuo Ohgaki
php-users@php.gr.jp
Tue, 28 May 2002 22:19:57 +0900
大垣です。
AriAri wrote:
> こんばんはAriAriです。いつもお世話になります。
> Postgresqlに画像データ等がしまえることを最近知り、いろいろ調べましたところ過
> 去ログにインサートスクリプトがありました。
> $fp = fopen('php.gif','r');
> $image = fread($fp, filesize('php.gif'));
> $escaped = pg_escape_bytea($image);
> $sql = "INSERT INTO test(bin) VALUES ('".$escaped."');"
> 上記でphp.gif画像がしまえると思いますが、これをどの様にして、取り出したらよ
> いのでしょうか?
たぶん、このスクリプトは私がJPUGのMLに問題をレポートした時に
書いたものですね。
結論から言うとbyteaの利用はお勧めしません。
byteaを利用するにはselectした後、unescapeしなければなりま
せんがbyteaのunescape関数はPostgreSQL 7.3のlibpqから付
いてきます。それまで利用される事はお勧めしません。
# PostgreSQL 7.3がリリースされたら、pg_unescape_bytea()
# を追加します。
どうしても、という場合はPostgreSQLのマニュアルに書いてある
仕様通りにunescapeする関数を作る必要があります。
byteaを利用する場合、キャストしないとエラーが発生する場合が
あります。これはバイナリを文字列として取り扱い、不正なバイト
シークエンスがあると勘違いする為です。
> また、fopenしている画像のパスなんかも絶対パスで指定できるのでしょうか?
セーフモードを利用していなければ利用できるはずです。
>
> VineLinux2.1.5(apache1.3.23)+php 4.2.1+PostgreSQL 7.2
> 上記環境です。よろしくお願いいたします。
せっかくbytea型がサポートされているので利用したいところ
ですが、large objectに比べて何十倍も遅くなる場合があります。
たぶん、エスケープ/アンエスケープ処理とエンコーディングチェッ
クが有効になってしまっている為と思います。
# 本当のところは知りませんが、7.2のbyteaはとにかく遅い
# 様です。
large objectを利用するか場所(URI、パス)だけをPostgreSQL
に記録する方法をお勧めします。
ついでに、最近直したPostgreSQLモジュールの不具合も書いてお
きます。large object関数のpg_lo_read(), pg_lo_read_all()
はかなり遅くなるようにコーディングされていました。この前修正した
ので、pg_lo_read(), pg_lo_read_all()は速くなったと思います。
特に、Output Bufferを利用している場合、大きな差がでると思います。
気になる方は、PHP 4.3.0-devのPostgreSQLモジュールを使って
見てください。4.2.xで利用する場合、config.m4のみ4.2.0の
ファイルを利用するとビルドできるはずです。
--
Yasuo Ohgaki
__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo! http://bb.yahoo.co.jp/