[PHP-dev 215] Re: [PATCH] multibyte patch for PHP 4.1.0

Masaki Fujimoto php-dev@php.gr.jp
Mon, 14 Jan 2002 18:04:35 +0900


ふじもとです。

On Mon, 14 Jan 2002 14:17:20 +0900
Youichi Iwakiri <yiwakiri@st.rim.or.jp> wrote:

> いわきりです

おせわになります。

> まだ、PHP-4.1.0対応のZend Optimizerが出ていないのでなんとも言えませんが、
> zend_extensionとして提供されてきたZend Optimizerなので、
> zend_compile.cとzend_execute.cにあるcompile(), execute()を
> フッキングして独自パーサ(最適化パーサ)を通して中間コードを
> 生成しそれを実行可能なexecutorに渡す動作だと思います。

なるほど、そういう動作ですか。だとすると結構厳しいですね。

> 藤本さんのpatchですとZend Optimizerに寄って置きかえられる前の
> compile()関数が呼び出すlanguage_scannerの箇所に手を加えるので
> 置きかえられた時点で機能しなくなると考えてます。

正直なところZend Engineのスキャナがスキップされるとなると半ばお手上げと
いう気分です。Optimizerはclosed sourceですしね(それが悪いということでは
ありません。念のため)。

> どうしたらZend製品と相性良く出来るか考えたんですけど
> 結構大変に成りそうです。
> 
> 1. compile(), execute()内にあるFile I/Oを外部に出す。
> 2. compile()に渡す前処理としてファイルを読みこみEUC,もしくはUTF-8に
>    変換する
> 3. compile()は通ると思います。
> 4. execute()の中でrequire_once, require, include_once, includeが
>    出てきた場合もexecute()が独自にI/O処理をせず'2.'の変換用の関数を
>    呼び、変換されたものをcompile()に渡す。
> 
> これだとなんとかなるかもしれませんが、
> 現実解としてはZend製品とは同時に使わない(使えない)とするしかないかも :(

確かにちょっと大変そうですね:)

ただ、このアプローチですと文字エンコーディングをEUCに「変換」することは
できますがShift_JIS(とかBIG5等)を「通す」ことができないと思います。うー
ん。混乱してきました:D

というわけで今前回のパッチの改善版を作リ始めたのですが、(Optimizerのこと
はとりあえず保留して)以下の様にしようかと思っています。

- configure対応(--enable-zend-multibyte)

- mbstring.script_encoding参照機能("auto" もしくはエンコーディング名) ->
  省略時は"auto"?

- encodingディレクティブ(前回と同様の仕様。ただし、script_encodingの値よ
  りこちらを優先)

- --enable-zend-multibyte, --enable-mbstring, --enable-mbstr-enc-trans 
  の3つが共に指定されている場合は、mbstringモジュールの関数を使用してス
  クリプトのエンコーディングをmbstring.internal_encodingに変換する機能

こんな感じの機能を実装してみる予定です。パッチのままで終わらないようにが
んばりたいところです。

# ドキュメントの和訳を始めたら止まらなくなってしまって、余り時間が取れま
# せんでした。この連休中には出来そうもありません。すみません。 
# > あさかわさん

--
藤本 真樹

アストラザスタジオ
fujimoto@studio.co.jp
fujimoto@php.net