2005-06-21

PHPによるサーバ側XSLTで陥りやすい落とし穴。

本サイトは数年前より、XSLTプロセッサ・Sablotronを利用したサーバ側XSLT変換による資源提供をPHPを介して行っている訳なのですが、それに際して私が普段から気を付けていることを参考程度に記します。

PHPは、設定ファイル(php.ini)に max_execution_time という値を定義・設定できます。

注釈

PHPマニュアルによると、max_execution_time という値とは、シェル環境では、PHPを際限なく使用できるようにするために、最大実行時間の制限は無しに設定されています。Web用アプリケーションは数秒単位で実行されるよう作られていますが、シェルアプリケーションの実行時間は、これよりかなり長くなる傾向があります。 [引用: PHPマニュアル: 第 23章PHPをコマンドラインから使用する より]

尚、この値の初期値は、30秒です。

PHPの最大実行時間の制限がある場合には、最大実行時間の制限時間内で処理を完了できるスクリプトを記述することを心掛けなくてはなりません。複雑で時間を要するような処理であるならば、それが原因で Fatal error: Maximum execution time of 30 seconds exceeded in (以下省略) というエラーを招く恐れがあるのです。

PHPによるサーバ側XSLTでよく陥りやすい落とし穴としては、ファイルサイズが大きかったり木構造の複雑なXMLを複雑なテンプレート群を持つXSLファイルにて変換する様な場合に、最大実行時間の制限が不十分だと、お陀仏Fatal error・・・。ということに相成りかねないという訳なのです。

つまり、PHPによる処理(ここで言うXSLT変換処理に限らず)を行う場合には、max_execution_time に充分な値を設定しておく必要があります。最も単純な解決方法は、自身がサーバを管理している管理者であれば「最大実行時間の制限をしない」で set_time_limit で実行時間の最大値をスクリプト毎に制限するという手段もありますが、これには色々な危険性が孕んでいるのでご注意下さい。また、貴方がPHPを利用可能なレンタルサーバを利用している一ユーザであるならば、スクリプトのソースコードを簡略化(より速い処理の記述)したり、XSLファイルの記述を見直す(XSLTプロセッサのパフォーマンスを落すノード処理を行わない)必要があります。

・・・という訳で、本サイトのサイト構成(サイトマップ)は、現在のテンプレ記述では処理時間をオーバーしてしまうので利用できなくなってしまいました。(爆)処理が軽減するように修正を施しました。