[PHP-users 12695] Re: php-4.3.0の CLI モードHTTPヘッダに関して

Yasuo Ohgaki php-users@php.gr.jp
Tue, 21 Jan 2003 13:02:09 +0900


大垣です。

Youichi Iwakiri wrote:
> いわきりです。
> 
> Hideo NAKAMITSUさんの<20030120194209.52522083.nomo@bluecoara.net>から
> 
>>長くなってしまいましたが,CLIモードでHTTPヘッダを出力させる方法はあるのでしょうか?
>>というか同じようにお困りの方っていらっしゃらないのでしょうかね?.
> 
> 
> % ./configure --enable-cgi --enable-force-cgi-redirect
> 
> で作成したphpだと、HTTP Headerも出力されます。
> 
> % php -v の結果は
> PHP 4.3.0 (cgi), Copyright (c) 1997-2002 The PHP Group
> Zend Engine v1.3.0, Copyright (c) 1998-2002 Zend Technologies
> 
> となります。
> 
> 従来のcgi版がcli版になった訳ではなく、新たに追加されたもの
> として捉えた方が正しいです。
> 

大元は同じ名前のバイナリをビルドする事が間違いの始まりです...
まだ分かりませんが、ほとんどのLinux ディストリビューションは
alternativesでphpバイナリをCGIまたはCLIに切替えて使える
ようにパッケージする事になると思います。

# 少なくともMandrakeは既にalternativesで設定される
# 様になっています。/usr/bin/php-cliと/usr/bin/php-cgi
# としてCLI/CGIはインストールされ/usr/bin/phpは
# alternativesの設定でリンク先が変更されます。
# 私が書いたPHPのspecも同様に設定しました。他のディストリ
# ビュータも同じような設定にする事になると思います。

したがって、奇麗かつポータブルな非Web用スクリプトを書くのは
難しくなります。また、CLIバイナリパッケージをインストールし
たらWebが動作しなくなった、と言う事も起こると思いますし、
/usr/bin/phpがあってもCGIなので動作しない、と言った事が
起こります。

いわきりさんが指摘されている通り、CGIとCLIバイナリでは互換
性を損なう設定がされているので、違う物として取り扱わないと厄
介な事になります。CLIは

 - HTTPヘッダを出力できない (実はある条件を満たすと、ヘッダを
   出力してしまうバグがありますが、普通は気にしなくても良いでしょ
   う)
 - ディレクトリをカレントディレクトリに変更しない
 - php.iniの設定に関わらず、SAPIの自動フラッシュが常に有効
   (スクリプトから無効にできる)
   自動フラッシュが有効でもPHPバッファを使った場合、PHPバッファ
   自体の実装が壊れているのでPHPバッファはフラッシュできません。
   (正確にはネストレベルが1の時にはob_flushで出力する事もでき
    ますが、やはりPHPバッファの実装が壊れているので出力が壊れる
    場合があります。これはCGI/CLI/他のSAPI共通です。
    SAPIのバッファとはWebサーバーのバッファのことで、CLIの場合
    普通はttyのラインバッファになります、パイプ等の場合はファイ
    ルシステムバッファになります。特にフィルタ型のスクリプトでは、
    自動フラッシュは100害あって1利無しであり、注意が必要です。
    (PHPスクリプトからxsltを使って定期的にHTMLを生成するなど)
    PHPバッファとは別にPHPがバッファリングしているバッファの事
    です)
 - 読み込むphp.iniが異なる場合がある。もっともweb用のphp.ini
   はCLIで使うには不向きなので、別のphp.ini (php.ini-cli)を
   作るべきです。
 - CGIには-n(php.iniを読み込まない)オプションがない。
   "-c php.ini-does-not-exist"として同じ効果は得られますが、
   お世辞にも奇麗な方法とは言いがたい方法です。
 - php.iniの設定に関わらず、$argc, $argvは初期化される
 - php.iniの設定に関わらず、max_execution_timeは無限
 - php.iniの設定に関わらず、html_errorsが無効
 - STDIN, STDOUT, STDERR定数がある

記憶の中から書いているので他にも違いがあると思います。
おかしな仕様/設定もありますが、どうしようもありません。
これが本当に良いと考えている開発者もいるのです :(

--
Yasuo Ohgaki