Nucleus(JP)フォーラムNucleus(JP)フォーラムNucleusCMS日本語版ユーザーのためのサポートフォーラムです。疑問が生じたらまずは記事検索をご利用ください。登録ログインログインしていません。NP_MediaUtilsMocchiです。NP_MediaUtilsを公開します。ファイル表示/管理/処理系プラグインのベータテストにご協力下さいでベータテストを行っていたものです。画像だけではなくファイル一般を扱うことができます。このプラグインは、以下のメディアファイル管理プラグインのためのライブラリとして機能します。詳細はWikiの記事に書いておきますが、これは主にプラグイン開発者向けの情報となります。CMSのバージョン3.40以上、PHPのバージョン5以上が推奨環境となります。Libraryのバインディングを利用しています。サーバ環境によっては機能に制限が出るかもしれません。NP_MediaUtilsこれは主に開発者向けの情報となるかと思います。XXXX」が発生することがあります。これは、リサンプリングに必要なメモリ消費量に対して、サーバからPHPに割り当てられているメモリ量が少ないために発生します。通常、PHPのGDバインディングで画像をリサンプリングするには、以下の2つのデータ用にサーバ上でメモリを確保する必要があります。リサンプリング画像の雛形となるGDフォーマットデータ1.で確保したGDフォーマットのデータからリサンプリング後のピクセルを算出して2.の雛形に流し込むことで、リサンプリングを行っています。画像が大きすぎる場合は、1.の途中でメモリを使い切ることになります。エラーの原因はこれです。"(任意の数値)M");」を記述することで、そのスクリプトの実行セッション限定で、PHPへの割り当てメモリ量を増やす方法です。ググってみた限り、たいていは128Mや256Mが設定されているようです。"16M"以下に設定ディレクティブに関する簡単な説明を示します。integerスクリプトが確保できる最大メモリをバイト数で指定します。書かれていないスクリプトがサーバーのメモリを食いつぶすことを防止するのに役立ちます。指定しなければなりません。前のバージョンで使う際にも必要となります。integerを使用する際、その値はバイト単位で測られます。記載された短縮表記を使用することも可能です。以下を参照すると、PHP_INI_ALLはどこででも設定できることを意味するようです。ini_setを制限するような設定はなさそうなので、たぶんどんなサーバでも有効かと思います。php.netなお、PHP5.3以降は128MBが標準となるようなので、このエラーにお目にかかることはまずなくなるかと思います。今回の対策さて、今回はこの対策は使っていません。エラーの直接的な回避方法をMediumオブジェクトのリサンプリングメソッド「getResamplerBinary」に実装してみました。これは、リサンプリングにおいて消費しそうなメモリーの量を前もって計算することで、サーバにおいてPHPに割り当てられているメモリサイズでリサンプリング可能かどうか判定し、超過しそうな場合は処理を中止するというものです。あまりにも大きな画像ファイルはリサンプリングされないようになっています。FALSE;}なお、この計算式はきゃしゃさんとkatsumiさんの協力のもとで求めました。サーバ環境においては、PHPとは別なプロセスで起動したGDライブラリに処理を投げるようになっているものがあります(Debian系のPHPパッケージがこんな感じ)。この場合はPHPがメモリ管理を行わないため、どんなサイズの画像もリサンプリング出来る能力があります。この場合も、先述のメモリ超過判定によって処理が中止されます。これは、GDライブラリが別プロセスかどうかを判定する方法を、私が知らないためです。そのため、このようなサーバ環境の場合は、サーバの能力をフルに発揮できないこととなります。メモリーの予想使用量は、PHPのソースコードからgdに関するものを参照して求めました。メモリブロックなどの計算に不慣れなので、現在は実メモリ消費量を計算式に反映しました。将来的には別プロセスなGDライブラリに処理を投げるのが主流となるだろうと思いますので、ひょっとしたら近い将来、この判定式は必要なくなるかもしれません。いうか、そうなったらいいなぁ程度なんですけどね。それなりに妥当な計算式となっているかと思います。先述のメモリ超過エラーが発生した場合は、報告してくださると助かります。計算式の見直しをします。NP_MediaUtilsまた、リサンプリングをバッチ処理するにあたり、スクリプト実行時間の問題もありました。リサンプリングは結構重い処理なので、それなりに時間がかかります。スクリプトの実行時間制限が来てもバッチ処理が終わらない可能性があります。これに関しては、リサンプリング処理を実行する度に、スクリプトの実行時間をリセットするようにしてあります。199行目set_time_limit(ini_get('max_execution_time'));関数「set_time_limit」はセーフモードでは使うことができませんので、セーフモードを有効にしたPHPで動作している場合、NP_Thumbnailのリサンプリングのバッチ処理の途中で実行時間超過エラーが発生する可能性があります。php.netなお、セーフモードはPHP5.3.0で非推奨に、次期バージョンであるPHP6では削除されます。NP_MediaUtilsPHP側の実行時間制限は上記で設定できますが、今度はウェブブラウザ側のHTTP接続時間制限を考慮する必要があります。Explorerに関しては、以下のドキュメントが参考になります。エラー「接続がタイムアウトしました」がいつサーバー応答しません。8Safariは60秒のようです。developer.apple.comFirefoxではそのような設定は見つかりませんでした。Alive設定を変更するようなものが多く見つかりました。個人的には、ブラウザのリクエストタイムアウトとHTTP通信におけるKeep-Alive設定は別なものじゃないのかなと思ったりしてます。Explorerに関しては以下。support.microsoft.comおそらくFirefoxでは、Keep-aliveを短めにして、一回のコネクションとkeep-aliveの持続時間を同じように扱っているのかと。昔と比べると1つのウェブページが要求するHTTP通信が非常に多くなったので、こういう実装になっているのかなぁと思いました。(となると、リクエストタイムアウトはIEなどブラウザベンダーの独自拡張になる?)各社こんな感じなので、ブラウザのタイムアウト防止のために、実行時間が長くなることが予想されるPHPスクリプトは、スクリプト側で関数「flush」や関数「ob_flush」を実装して、適当にブラウザ向けにパケット送出してあげる必要ありかなと、今書いてて思いました。NP_Thumbnailの次期バージョン(ver.4.0.0かな?)で実装することにします。Microsoftは情報がちゃんと整理されていていいなぁ。(RC2)ではウェブログIDをブラウザに保存するため、InitSkinParse、PostAuthentication、PreSendContentTypeの各イベントでクッキーを設定していました。昨日風呂に入りながら考えていたら、これはおかしいことに気づきました。php.netクッキーの設定タイミングは、HTTPヘッダー以外の出力がなされる前です。ウェブサーバからブラウザに送信されるHTTPヘッダーの中でクッキーが送信されます。そのため、PreSendContentTypeイベントで送信しておくだけで十分でした。時期バージョンであるver.1.0.0はこのように変更します。この変更によって、システム全体から見たスクリプトの役割が変化することはありません。多少効率がよくなるくらいです。NP_MediaUtilsこれは、画像処理にちょっとこだわりたい方向けの情報ですJPEGやTIFFには、カラーマネジメントのためのプロファイルが埋め込まれることがあります。カメラやスキャナなどでは、ハードウェアが取得できる色の幅が、装置によって決まっています。この色の幅は「色空間(カラースペース)」と呼ばれます。デジタルカメラやスキャナの中には、取得したデータに、色空間に関する情報、すなわちカラーマネジメントのためのプロファイルを埋め込むものがあります。このプロファイルは、インターナショナル・カラー・コンソーシアムという標準化団体が規格を出していて、この規格に沿ったものは頭文字を取ってICCプロファイルと呼ばれたりします。映像を取得する側もそうですが、映像を映し出すディスプレイや、映像を印刷するプリンタもこのプロファイルを持っています。プリンタは、光学的な3要素(赤・緑・青、RGB)を塗料の4要素(シアン・マゼンダ・イエロー、キーカラー=ブラック)に変換する必要から、このプロファイルを個別に持っています。プリンタドライバがこのプロファイルをシステムにインストールするようになってます。NP_MediaUtilsで利用しているPHPのGDライブラリ・バインディングは、PHPで標準的に使うことが出来る画像処理系です。画像からカラープロファイルを取り出す、画像にカラープロファイルを埋め込むといった操作ができません。php.netそのため、MediumオブジェクトのgetResampledBinary関数でリサンプリングした画像は、元の画像のプロファイルを維持できませんし、隣接ピクセル間からリサンプリング後のピクセル値を算出する際に、カラープロファイルを考慮した計算ができません。この性質は、NP_MediaUtilsに画像処理を依存しているNP_ImageLimitSizeに影響します。このプラグインは、アップロードされた画像をリサンプリングして保存しますが、前述のとおり、カラープロファイルやExif情報をカットします。そのため、リサンプリング後のデータを表示する場合、ブラウザがカラー・マネジメント・プロファイルに対応していても、色空間は標準的に使われているもの、おそらくsRGBが適用されてシステムの表示系に回されるかと思います。JPEGにはExif情報を含むものもありますが、PHPの処理系では、このExif情報を読み取ることは出来るものの、再設定することが出来ないようでした。そのため、リサンプリング後の画像にもExif情報を埋め込むというのは、PHPの標準的な設定では不可能です。php.net色空間の正確な再現やExif情報の埋め込みを望む方は、NP_ImageLimitSizeは使わずに、リサンプリングなどの処理をちゃんとしたデスクトップアプリケーションで行い、アップロードすることをおすすめします。PHPの画像処理系には、GDライブラリバインディングの他に、ImageMagickライブラリ・バインディングやGmagickライブラリ・バインディング、Cairoライブラリ・バインディングが使えます。どれも強力な処理系ですが、PHPの標準的な設定では利用できません。そのため、このプラグインでの実装は見送っています。NP_MediaUtilsMediumクラスのコンストラクタで、プロパティ$medium->mimeにファイルのMIME型を設定するように作ってあります。MIME型の検出は以下のプロセスで実装してあります。全てのファイルでgetimagesizeを実行。画像ファイルならそのMIME型(image/pngなど)が入り、画像でなければ「application/octet-stream」が設定されます。PHP5.3.0以降であればPHPのlibmagicライブラリ・バインディングであるFileinfo関数を標準で利用することができます。この関数が利用可能で、$medium->mimeに「application/octet-stream」が設定されていたら、Fileinfo関数による検出をします。php.netこんな感じなので、PHPの古いバージョンでも、画像を処理する上では適切なMIME型を利用することができると思います。MIME型を使利用するとファイルタイプを一意に扱えるため、便利です。MIME型はRFCで定められているので、PHPだけではなく処理系一般で一意となります。Image)を扱うことが出来ません。BMPフォーマットは、現在はMicrosoft社が仕様を公開しています。元々はIBM社と共同で策定したフォーマットでしたが、OS/2とWindowsの2つのオペレーティングシステムで異なるフォーマットが使われだし、OS/2が下火になった今、Microsoft社のフォーマットが主流になっているといった感じです。msdn.microsoft.comGDライブラリで画像を扱う場合、一度、画像ファイルからGDフォーマットのデータを作ります(デコード)。そのデータに対して処理をした後、GDフォーマットから画像データに変換します(エンコード)。PNGやJPEG、GIFなどはこのデコード/エンコードのどちらも可能なのですが(gd_info関数でチェック可能)、BMPフォーマットの処理系は実装されていません。CMS」でPHPのBMPフォーマット画像処理系を書いたので、GPLライセンスのもと、NP_MediaUtilsのバージョン1.0.0にBMP画像処理系を含めようかなと考えています。今のところ、色深度が24ビットまでの非圧縮なものしか処理できず、また、デコードする処理系しか書いていないという体たらく。8ビットと16ビットはバグが報告されてます。書いたので、デバッグとメンテナンスがてら同梱してしまいたいなぁ、と。NP_MediaUtils皆さん、いつもお世話になっています。「NP_MediaUtils」についてご報告です。「NP_ImageLimitSize」を使いたくて、まずは「NP_MediaUtils」をインストールしようとしたのですが、インストールを実行したら、画面が真っ白になりました。リロードしても真っ白画面から戻らないので、いったんFTPクライアントでプラグインを削除してみました。すると、プラグインリストの最下部に以下のエラーが表示されました。読み込めませんでした。上で動作させるために必要な機能がプラグインでサポートされていません。(管理操作履歴に詳細があります。found)と出ていました。何度かやり直したのですが結果は同じでした。このような経過で、プラグインがインストールできない状況です。▼ZIPファイルを解凍してできたファイル=====NP_MediaUtils.php[mediautils]dir┣MediaUtils.php┗Medium.php=====▼環境は以下の通りです。NP_MediaUtilsdanさん不具合報告どうもありがとうございます。バグを作りこんでしまっているようなので、ちょっと確認してみますね。プラグインロードできないエラーをなくす方法をお伝えします。プラグインリストの画面でNP_MediaUtilsを削除していただければたぶん大丈夫です。NP_MediaUtilsMocchiさん、ありがとうございます。さんの発言:とりあえずはプラグインロードできないエラーをなくす方法をお伝えします。プラグインリストの画面でNP_MediaUtilsを削除していただければたぶん大丈夫です。その方法で、プラグイン管理画面は通常に戻りました。「プラグイン管理画面」自体が正常に表示されないので、プラグインをアンインストールしたくてもできないということは、今回初めて知りました。・プラグイン管理画面でアンインストールすると、こんな手順になるのですね。今後の参考にしたいと思います。NP_MediaUtilsNP_MediaUtilsでのエラー報告です。整形式になっていません。false;">戻る</a></p>-------------------------------------------------------------------------^と言うエラーが出ます。/nucleus/が追加されてしまうようです。PHP5をさらにプラグインインストールしても同じエラーが当然にでます。アンインストールすれば正常にもどります。ご確認いただければと報告させていただきました。整形式になっていません。CMSのデフォルトのメディア管理機能です。そのためこのエラーは、NP_MediaUtilsをインストールしている、いないに関わらず発生するように思います。今確かめた所、アンイストールした状態でエラーが出ていました。v3.62XREAサーバーを使用しております。エラーと言う現象です。