| 投稿者 | 投稿 | 
		
			|  | #1 2010 年 2 月 15 日(月) 19:49 | 
		
			| 会員 登録者: 2 2010 返信数: 5 | はじめまして。osamuと申します。PHPでsystem関数を利用してシェルコマンドを実行した際に自動的に出力される文字列をコントロールするにはどうしたらよいでしょうか?
 例えば、シェルのzipコマンドなど非常に便利なのですが、
 <?
 system("zip -r test.zip test");
 ?>
 というものを実行すると特にvar_dumpしているわけでもないのに実行結果がブラウザーに「updating: test/ (stored 0%) updating: test/readme.txt (deflated 34%) updating: test/files/ (stored 0%) updating: test/form.html (deflated 37%) updating: test/upload.php (deflated 54%)」という風に出力されてしまいます。
 system関数の戻り値も他の関数と違うようでして成功時と失敗時の区別がなかなかできません。
 やりたいこと、知りたいことは、
 ・自動的に出力される文字列を制御したい(表示されないようにする、や、変数に入れて河口する。)ということと、
 ・system関数の戻り値
 です。
 詳しい方がらしたらご教授ねがいます。
 | 
		
			|  | #2 2010 年 2 月 15 日(月) 19:50 | 
		
			| 会員 登録者: 2 2010 返信数: 5 | 追伸::PHPの環境は、
 OS Ubuntu9.10
 PHP5
 Webサーバー Apache2.x
 です。よろしくお願いします。
 | 
		
			|  | #3 2010 年 2 月 16 日(火) 8:55 | 
		
			| 管理者 登録者: 10 2005 返信数: 38 | http://php.net/systemをくまなく見てみましたか? 多分ヒントがあると思いますが | 
		
			|  | #4 2010 年 2 月 16 日(火) 9:42 | 
		
			| 会員 登録者: 8 2009 返信数: 103 | おはようございます。
 > ・system関数の戻り値
 マニュアルをみるとsystem関数の戻り値は最後の行を返すとあります。
 ELFさんが提示されたリンク先を参照。
 
 > ・自動的に出力される文字列を制御したい(略
 system関数でするならリダイレクトを使います。
 変数に入れて加工するのならいったんファイルに出力するか
 バッククォートを使うかですね。
 
 > 成功時と失敗時の区別
 $ret2の処理が成功時と失敗時の区別に該当します。
 
 
 
 <?php
 
 header("Content-Type: text/plain; charset=utf-8");
 
 $result1 = system("/bin/date '+%Y-%m-%d %H:%M:%S' > /dev/null", $ret1);
 
 
 $log_file = "log.txt";
 $result2 = system("/bin/date '+%Y-%m-%d %H:%M:%S' > $log_file", $ret2);
 echo "result2: " . "\n";
 if($ret2 == 0) {
 $log_txt = file_get_contents($log_file);
 echo $log_txt  . "\n";
 }
 else {
 echo "failure" . "\n";
 }
 
 
 $result3 = `/bin/date "+%Y-%m-%d %H:%M:%S"`;
 echo "result3: " . "\n";
 echo $result3;
 
 ?>
 | 
		
			|  | #5 2010 年 2 月 18 日(木) 9:26 | 
		
			| 会員 登録者: 2 2010 返信数: 5 | >nullaさんありがとうござます。
 /dev/null", $ret1がありました!あまりシェルを使う機会が少ないのですっかり忘れていましたありがとうござます。
 その後もいろいろ調べた結果、shell_exec()だと出力が簡単に取り出せるようです。テストしてみたら自動的にシェルから出力されるということがなくなりました。
 
 >ELFさん
 ヒントがわからなかったのでここで質問をしております。
 | 
		
			|  | #6 2010 年 3 月 1 日(月) 3:32 | 
		
			| 管理者 登録者: 10 2005 返信数: 38 | 「参考」欄のexec()がおそらくsystem()より適していると考えていました. 「参考」にある関連関数について調べたのかなということでした. |