[PHP-users 14984]Re: PHP4.3.2RC2のstream_set_write_buffer(set_file_buffer)が失敗する

Masaki Fujimoto fujimoto @ tunebiz.net
2003年 5月 1日 (木) 19:09:32 JST


ふじもとです。

<開発者な方向け>
この(4.3.2RC* or HEADで発生する)問題の根は、2003/03/18に Wezさんがfopen()関数で
ローカルファイルをopenするときに fopen() から open() を使用するように変更したこ
とによるものです。

これにより:

(1) ローカルファイルをオープンした場合従来のファイルポインタではなくファイルディ
    スクリプタ*のみ*がstreamオブジェクトに格納される
(2) すると当然従来行われていたユーザスペースでのIOバッファリングが行われなくなる
(3) 言うまでも無くsetvbuf()は機能しなくなっている(fdopenしても、読み書きは
    read()/write()なので意味ないし...)

という状況になっています、ということを小一時間ほど調べて気づきました。
</開発者な方向け>

で、上記のWezさんの変更が行われた後、当然set_file_bufferは動かなくなるので、いわ
きりさんがおっしゃっている

http://bugs.php.net/bug.php?id=23201

のバグ報告が上がって、現在はこの根本的問題(== 内部でfdしか持たなくなったら
setvbuf()は使えない)を保留して、とりあえずクラッシュだけは防ごう、というダメダメ
なfixが行われている、という状態です。

というわけで、とりあえずstreamのメンテナの方にどうするつもりかこれから問い合わせ
てみますが、PHP 4.3.2RC*ではローカルファイルへのユーザレベルIOバッファの機能は
*無い*ので、set_file_bufferはするだけ無駄ということになります。

この問題が、自前でバッファを実装するのか、仕様、ということでこのまま押し切るとい
う形で決着するのかはまだわかりませんが、とりあえずご報告まで。


Youichi Iwakiriさんの<200305010822.RAA28870 @ mail1.rim.or.jp>から
>いわきりです
>
>komura wrote in <20030430191133.640425d9.komura @ ma9.seikyou.ne.jp> :
>>一応、ソースを確認したところ、 main/streams.c の以下の部分で -1 を
>>返しているようなのですが、C 言語にはあまり詳しくないのでこれ以上は
>>分かりません。
>>
>>1629:       case PHP_STREAM_OPTION_WRITE_BUFFER:
>>1630:           if (data->file == NULL) {
>>1631:               return -1;
>>1632:           }
>
>gdbで追ってみましたが、data->fileがsetされるケースがあるのか
>疑問です。条件が
>data->fd == NULL
>であれば良さそうな気がしますが。
>コードをよく読んでないので何とも言えません。
>
>一応、上記条件checkは、bug#23201対策として4/15にcommitされています。
>
>http://bugs.php.net/bug.php?id=23201
>
>#対策としては返値を無視するしかない?
>
>-- 
>Youichi Iwakiri
>
>_______________________________________________
>PHP-users mailing list
>PHP-users @ php.gr.jp
>http://ns1.php.gr.jp/mailman/listinfo/php-users

-- 
Masaki Fujimoto
fujimoto @ tunebiz.net


PHP-users メーリングリストの案内