【Linux】引数いっぱい並べていいですか
問題
コマンド実行で、こういうのやってよいですか。
exec('nantoka_batch.php 1001 1002 1005 1006 1012 (引数がx万個続く...)');
答え
引数があまり多くなければ問題ないけど、長くなるときはあまりおススメではない。
コマンドの引数の長さはOSの設定で通常は上限があるので、長さによってはエラーで実行されない(getconf ARG_MAX などで確認できる)。
他にも、サーバーを触る人なら、こんな場合にも引数の長さ制限に引っかかったことがあるのでは。
$ rm /hoge/*
→ /hoge ディレクトリ内のファイルを全部消してください
→ *が展開されて、ファイル数によってはArgument list too long. など言われる
対応方法の例
ファイルに書いて
引数にファイル名を渡す
nantoka_batch.php はファイル名からファイルの中身を取得する
exec('/usr/local/bin/php nantoka_batch.php /xxx/xxx.csv');
ファイルに書いて
ファイルの内容を標準入力に渡す
nantoka_batch.php は標準入力を取得して処理をする
exec('/usr/local/bin/php nantoka_batch.php < /xxx/xxx.csv');
ファイルを作らないで済ますなら
内容を直接、標準入力に渡す
nantoka_batch.php は標準入力を取得して処理をする
$p = popen('/usr/local/bin/php nantoka_batch.php', 'w'); fwrite($p, 'x万個の番号リスト'); pclose($p);
さらにメモ
呼ばれる側のスクリプトの方では、引数は、以下から取得できる。
$argv
標準入力に渡されたデータは、受け取り側のスクリプトでは以下のようにして取得できる。
$stdin = file_get_contents('php://stdin');
コメント