OpenPNE 2.12 カスタマイズ 2009-04-04 (土) 14:57:44


OpenPNE 2.12 カスタマイズ upload容量編

デフォルトのデータアップロードは300kbの制限であるが、メガピクセルのデジカメ画像などはつらいものがあるので、制限容量をアップする。

http://bestpc.s153.xrea.com/pukiwiki/pukiwiki.php?%C5%BA%C9%D5%A5%D5%A5%A1%A5%A4%A5%EB%A4%CE%CD%C6%CE%CC

OpenPNE2.0で、画像などのファイルを添付する場合に、ファイルサイズの上限がどこで決まるか?調査しました。

添付ファイルの処理の流れ †

OpenPNE2.0では、日記やコミュ二ティ掲示板でメッセージに画像ファイルを添付することができます。

アップロードされた画像ファイルは、

ファイル形式(拡張子)とファイルサイズをチェックしてOKであれば、 BASE64方式でエンコード(データの変換)して、 データベース(MySQL)に保存します。

/openpne/webapp/lib/db/write/image.php

の db_image_insert_c_image関数内で、BASE64方式エンコード実行

base64_encode()を使うとデータサイズは、4/3倍になります。(33%増し)

例)75KBの画像ファイルなら、100KBの文字列に変換されます。

変換後のデータを、MySQLのc_imageテーブルにあるLONGBLOB型カラムに保存します。

OpenPNEの設定

OpenPNEの設定ファイルで、添付ファイルのサイズ上限を指定します。

/openpne/config.php

の200行目付近にある

// アップロード画像のファイルサイズ制限(KB)
define('IMAGE_MAX_FILESIZE', 1024);

で、定数「IMAGE_MAX_FILESIZE」の値を指定します。 単位はキロバイト(KB)となっています。

例)10240と指定した場合、10240KB=10MBまでOKとなります。

PHPの設定

WebサーバのPHP設定で、ブラウザーからWebサーバに対して転送できるデータ容量が指定されています。

phpinfo()関数 で、PHPの設定を確認します。

例)以下のようなPHPスクリプトを、phpinfo.phpのようなファイル名で保存して、ブラウザで表示させます。

<?php
phpinfo();
?>PHP

の設定項目(ディレクティブ)がズラズラ表示されるので、以下の3項目をチェックします。

DirectiveLocal ValueMaster Value
memory_limit128M128Mスクリプトが確保できる最大メモリをバイト数で指定します
post_max_size8M8MPOSTデータに許可される最大サイズを設定します。
upload_max_filesize2M2Mアップロードされるファイルの最大サイズ

(参考)PHP の設定を行うための php.ini ディレクティブ http://jp.php.net/manual/ja/ini.php

PHPの設定ファイルの位置を確認

ns# /usr/local/bin/php -i | grep -i configuration
Configuration File (php.ini) Path => /usr/local/etc
Loaded Configuration File => /usr/local/etc/php.ini
Configuration
ns#

PHPの設定ファイルを作る

デフォルト以外の部分をphp.iniとして記述する

# touch /usr/local/etc/php.ini
# vi /usr/local/etc/php.ini
[PHP]

; Maximum size of POST data that PHP will accept.
post_max_size = 12M
; Maximum allowed size for uploaded files.
upload_max_filesize = 10M

として、設置。

# apachectl restart

して、設定を反映する。phpinfo.php で確認

memory_limit128M
post_max_size12M
upload_max_filesize10M

memory_limit ≧ post_max_size ≧ upload_max_filesize という大小関係で設定されています。

WebサーバのPHP設定で、upload_max_filesize のサイズより大きなファイルは、OpenPNEからアップロードできません。 upload_max_filesize で指定してあるサイズより、小さなサイズを上記のOpenPNEの設定で指定する必要があります。 OpenPNEで容量の大きなファイルを添付したい場合は、PHPの設定を変更(php.iniファイルを書換え)して、upload_max_filesize を大きな値にすればOKです。

※レンタル共用サーバを使っている場合、レンタル会社のセキュリティポリシーによって、PHP設定を変更できないこともあるかと思われます。

データベースの設定

アップロードされた添付ファイルは、データベースに保存する前に、OpenPNEによってBASE64方式でエンコードされます。

(データベースに保存するときのデータサイズは、元の添付ファイルの4/3倍になっている点に注意してください。)

そして、Webサーバ(OpenPNE)から、データベースサーバ(MySQL)へデータを転送して保存します。

このとき、データベース側の設定によって、転送できるデータのサイズ上限が決められています。

この上限よりも大きなサイズのデータをデータベースに送りつけると、データベース側で受取を拒否します。

=データの保存に失敗

=添付ファイルのアップロードに失敗

MySQLのメッセージバッファサイズ

max_allowed_packet

Webサーバ(クライアント)とデータベース(サーバ)間で送信できる最大値は、 データベースで使用可能なメモリ量と、 通信バッファのサイズ(max_allowed_packet)で決まります。

max_allowed_packetの確認

MySQLの設定変数のうち、max_allowed_packetを設定 /usr/local/etc/my.conf

max_allowed_packet = 16M

ns# /usr/local/etc/rc.d/mysql-server restart
Stopping mysql.
Waiting for PIDS: 964.
Starting mysql.

ns# mysql --help  を実行して、設定を確認する。

(参考)

BLOB型について

http://dev.mysql.com/doc/refman/4.1/ja/blob.html

サーバパラメータについて

http://dev.mysql.com/doc/refman/4.1/ja/server-parameters.html

SHOW VARIABLESについて

http://dev.mysql.com/doc/refman/4.1/ja/show-variables.html

その他の要素

インターネットの回線が遅いと、ファイルのアップロード処理に時間がかかり、処理の途中でWebサーバがデータ受付を中断することもあるかもしれません。

ファイルのアップロードに失敗する場合は、インターネットの回線速度や、Webサーバが処理を中断する時間をチェックする必要があるかもしれません。

まとめ

アップロードできる添付ファイルの容量は、

ファイルのアップロードに失敗する場合はチェックしてみましょう。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS