[PHP-users 5424] Re: コマンドライン版実行時のオプションエラー

Youichi Iwakiri php-users@php.gr.jp
Fri, 15 Feb 2002 15:15:30 +0900


いわきりです

hayakawa@sam.hi-ho.ne.jp wrote:
>> PHP4のコマンドライン版を使用して、
>> 以下のようなエラーがでて原因が掴めなくて困っています。
>> (プログラムはcronで起動してます)

cronによる起動では無くそのスクリプトを直接実行する場合も
同じErrorが表示されるのでしょうか?

>> #!/usr/local/bin/php -q -d max_execution_time=0
>> <?php
>>     
>>     // ここに処理を書く
>>     
>> ?>
>> 
>> 
>> オプションが見つからないといわれてますが、
>> 記述が間違っているようには思えないのです。
>> この表記は#4162でいわきりさんが書かれているものと同じですし。

書いた本人ですが上記の指定で問題無いことを
FreeBSD 3.4-RELAESE上での
/bin/sh
/bin/csh
/usr/local/bin/tcsh
/usr/local/bin/bash
および
/usr/sbin/cron
で確認しています。

>> ちなみに -q オプションのみの場合にはエラーにはなりません。

こちらの問題はふじもとさんのメールによると単一オプションのみ指定可と
いうところでしょうか。

masaki-f@fides.dti.ne.jp wrote:

>> ふじもとです。
>> 一応原因だけ(対策無しです)。
>> foo.php:
>> #!/usr/local/bin/php -q -d max_execution_time=0
>> <?php
>> /* some codes */
>> ?>
>> 
>> というスクリプトを実行することは
>> % /usr/local/bin/php '-q -d max_execution_time=0' foo.php
>> と等価です(すくなくとも僕の知る限りのシェルでは。とはいってもそんなに知
>> りませんが)。

ありゃりゃ、私の知り得るところのshellの動作は
#!/hoge/program argument-lists ...

に関してはトランスペアレンシーに機能すると思っていました。
違う環境もあるのですね。出来ればそれらのshellを紹介して頂けると
ありがたいです。

手元にあるshell全てを確認したのですが
foo.php:
#!/usr/local/bin/php -q -d max_execution_time=0
<?php
/* some codes */
?>

を

% /usr/local/bin/php '-q -d max_execution_time=0' foo.php

と等価に評するものはありませんでした。
確かにくだんのErrorメッセージをだす原因であろうことは
直接
% /usr/local/bin/php '-q -d max_execution_time=0' foo.php
を入力することで確認できましたが

/php-source/sapi/cgi/getopt.cの要求する入力は
アーギュメント数,各アーギュメント値およびオプション解析リストだけです。
この仕様自体、Gnuのgetoptライブラリのショートオプション相当の物ですし
コマンドラインからの入力をセパレータ(空白文字または''で括られるもの)で
分割されて渡ってくることを期待するものなのでごく一般的な物だと思います。


>> そうするとPHPには -q -d max_execution_time=0 が一つの引数として渡ります
>> から、引数を解析する sapi/cgi/getopt.c の ap_php_getoptという関数が -q 
>> の後のスペースをオプションの次のオプションだと思って
>> 
>> Error in argument 1, char 3: option not found
>> 
>> だのなんだのと言っている訳です。というわけで現状では-dを使うは厳しいかも
>> です。バグレポートを出すと何方かが対策を考えてくださるかも知れません(バ
>> グと仕様の微妙な境界にある問題なので)。

% php '-q -i' > phpinfo

とやってみただけでもErrorになります。
-d を使うにかかわらず複数のオプションを同時に渡すことが出来ませんね。

php '-q -d max_execution_time=0' foo.php
  argc = 3
  argv[0] = php 
  argv[1] = -q -d max_execution_time=0
  argv[2] = foo.php

を
  argc = 5
  argv[0] = php 
  argv[1] = -q
  argv[2] = -d
  argv[3] = max_execution_time=0
  argv[4] = foo.php

にするコンバータを書くのは簡単なんですけど、何故か今回の件は
早川さん、藤本さんの環境が一般的な物と私には思いおよびません。

#p碚atchが欲しいというのであれば個人宛にメールをください。

利用人口数的にも多いと思われるLinux系の極一部のディストリビューション依存なのか
はたまたshell依存なのかcron依存なのか非常に気になります。

下記のプログラムがどの様な出力をするのか教えて頂けるとありがたいです。

> cat args.c
#include <stdio.h>

void main(int argc, char *argv[])
{
        while (argc--) {
                printf("argv : %d , %s\n", argc, argv[argc]);
        }
}

因みに渡しの環境では前述のshellおよびcronで
test.prog:
#!/home/iwakiri/args -a -b -c ddd

を作成し直接および間接(cron経由)実行の結果は共に
argv : 5 , ./test.prog
argv : 4 , ddd
argv : 3 , -c
argv : 2 , -b
argv : 1 , -a
argv : 0 , /home/iwakiri/args

となります。