SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

【Linux】引数いっぱい並べていいですか

問題

コマンド実行で、こういうのやってよいですか。

exec('nantoka_batch.php 1001 1002 1005 1006 1012 (引数がx万個続く...)');

flock-of-sheep-57690_640

答え

引数があまり多くなければ問題ないけど、長くなるときはあまりおススメではない。

コマンドの引数の長さは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');

関連するメモ

コメント