2018/08/13)以前にJavaScript文字列のエスケープ関数を紹介しました。試しにPhalconのZephirで書いてみました。利用した環境は以下の通りです。create-project)scaffoldmigrationwebtoolsZephirのインストールPHPをビルドする環境が整っているLinuxで、composerからZephirをインストールするのは簡単です。PHPのモジュールがビルドできる環境を作っていない方は、まずPHPをソースコードからビルドできるようにしてから試して下さい。phalconコマンドでプロジェクトを作成します。phalcon/zephirを実行するだけです。バージョン番号の入力を求められますが、最新版で構わないので”*”を入力すると最新版が”./vendor/bin/zephir”にインストールされます。utilsとしてテスト用のモジュールを初期化します。作成されるディレクトリは以下のような構造になっています。後はutils/utils/以下のディレクトリにクラスを定義したzepファイルを作成し、utilsディレクトリに移動した後、ビルドコマンドを実行するだけです。serverこれで(Phalconプロジェクトルート)/utils/ext以下にPHPのCモジュールが作成されます。実際にロードするべき.soファイルは(Phalconプロジェクトルート)/utils/ext/modulesに配置されています。ビルドしたモジュールの使い方ZephirでビルドしたモジュールはPhalconモジュールがロードされていれば、普通のモジュールのように利用できます。utilsutilsビルドしたutilsモジュールがロードされている事が確認できます。元のPHPコードは以下のコードです。$encoded;}Zephir版は以下のコードです。これは(Phalconプロジェクトルート)/utils/utils/MyEscape.zepとして配置されています。ファイル名とクラス名は一致している必要があります。一致しない場合はエラーになります。encoded;}}ZephirはコードをPhalcon用のCモジュールに変換するのでPHPとは多少異なった仕様になっていますが、PHPの関数などは直接呼び出している事が分かります。boolなどと宣言する必要があります。変数に代入する場合、letが必要です。ifがサポートされていないのでこのような書き方になっています。ifサポートが提案されているので、そのうちサポートされると思います。forループがwhileループに変わっているのはZephirのforはイテレーション専用になっていて、カウンター変数を使ったループができない為です。forはwhileで書き換えられるので特に大きな問題にはならないでしょう。効率的なビットシフトを使用したPHPコードを元のコードにしなかった理由は、Zephirはメモリ保護のため文字列型の変数を配列としてオフセットでアクセスできないようになっているからです。substrを利用しているので効率的とは言えませんし、他にも色々最適化できる部分もありますが比較しやすいようにできるだけ元のPHPコード同じにするため、あまり変更していません。細かい違いが色々ありますが、PHPプログラマなら比較的簡単にZephirでプログラミングする事が可能だと思います。Zephirの詳しい仕様はマニュアルを参照してください。ベンチマークソースコードからあまり速くならない事が予想できます。このコードには複雑なロジックがなくPHP関数を呼び出す部分以外がネイティブコードに変換されるだけだからです。mbstring関数や文字列関数など処理時間が多い部分はそのままであることが原因です。phpコマンドの-dオプションで直接モジュールをロードし、約1000文字の文字列を1000回エスケープした結果は以下の通りです。エスケープ部分をmicrotime関数で経過時間を測っています。この為、バイトコードキャッシュの有無はベンチマークには影響ありません。3.68315911293031割弱高速化されている事が分かります。複雑なロジックなどZephirモジュール化するとより良い結果を期待できます。このコードはZephirの利用による高速化の実験にはあまり適切とは言えないので参考程度の結果だと思って下さい。時間があったのでもう少し効率的なコードも書いてみました。128から255をエスケープしていないので反則と言えますが参考までに。encoded;}}同じベンチマークをした結果は以下の通りです。if”が無いこと、安全性の為とはいえ文字列を文字(char)として取り扱えない制限はC言語の文字列のように扱えないのでかなり厳しい感じです。少なくとも私にとってはCでモジュールを書いたほうが簡単で速い&早いです。Cが書ける方は少し複雑な文字列操作をするなら普通のCモジュールを書いたほうが良いかも知れません。Cモジュールを書こうとするとモジュールの書き方やハッシュなどのAPIの使い方を習得しなければなりません。Zephirの場合、これらの知識が必要ないので適材適所で使うと良いと思います。今すぐできる、Webサイトへの2要素認証導入そもそもエスケープとは何なのか?JSONPは危険なので禁止PHP文字列のエスケープPHPのHTMLエスケープ紹介エレクトロニック・サービス・イニシアチブのWebシステムのコンサルタントのブログです。PHPの開発、PHP4.x/5.xレガシーPHPセキュリティパッチサービスなどを行っています。ブログのサブタイトルを「書かない日記」としているのは、ブログを始めた時にあまり書かないつもりで始めたのでこのサブタイトルになっています。yohgaki@ohgaki.net私が記述したブログ中のコードは記載が無い場合はMITライセンスです。その他のコードは参考リンクなどのライセンス情報を参照ください。