OpenPNE 2.12 カスタマイズ 2009-04-04 (土) 14:57:44
デフォルトのデータアップロードは300kbの制限であるが、メガピクセルのデジカメ画像などはつらいものがあるので、制限容量をアップする。
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/config.php
の200行目付近にある
// アップロード画像のファイルサイズ制限(KB) define('IMAGE_MAX_FILESIZE', 1024);
で、定数「IMAGE_MAX_FILESIZE」の値を指定します。 単位はキロバイト(KB)となっています。
例)10240と指定した場合、10240KB=10MBまでOKとなります。
WebサーバのPHP設定で、ブラウザーからWebサーバに対して転送できるデータ容量が指定されています。
phpinfo()関数 で、PHPの設定を確認します。
例)以下のようなPHPスクリプトを、phpinfo.phpのようなファイル名で保存して、ブラウザで表示させます。
<?php phpinfo(); ?>PHP
の設定項目(ディレクティブ)がズラズラ表示されるので、以下の3項目をチェックします。
Directive | Local Value | Master Value | |
memory_limit | 128M | 128M | スクリプトが確保できる最大メモリをバイト数で指定します |
post_max_size | 8M | 8M | POSTデータに許可される最大サイズを設定します。 |
upload_max_filesize | 2M | 2M | アップロードされるファイルの最大サイズ |
(参考)PHP の設定を行うための php.ini ディレクティブ http://jp.php.net/manual/ja/ini.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.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_limit | 128M |
post_max_size | 12M |
upload_max_filesize | 10M |
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)へデータを転送して保存します。
このとき、データベース側の設定によって、転送できるデータのサイズ上限が決められています。
この上限よりも大きなサイズのデータをデータベースに送りつけると、データベース側で受取を拒否します。
=データの保存に失敗
=添付ファイルのアップロードに失敗
max_allowed_packet
Webサーバ(クライアント)とデータベース(サーバ)間で送信できる最大値は、 データベースで使用可能なメモリ量と、 通信バッファのサイズ(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サーバが処理を中断する時間をチェックする必要があるかもしれません。
アップロードできる添付ファイルの容量は、
ファイルのアップロードに失敗する場合はチェックしてみましょう。