2012/01/11

【PHP】PHPのexec関数

ということで今回はexecコマンドについてのメモです。

まず、同期をとっての実行方法です。
exec('コマンド');
コマンドにはシステムコマンド(ls)とかファイルパスだったりを指定できます。 第二引数に変数を指定することにより、コマンドの結果を取得できます。 この際取得できる結果は1行ごとに配列になります。 例えば結果が
dr-xr-xr-x    2 root  wheel      512 Jan  1  2009 proc
drwxr-xr-x    2 root  wheel     2560 Sep 24  2010 rescue
drwxr-x---    5 root  wheel      512 Aug  2  2010 root
だとすると
array(
    0 => 'dr-xr-xr-x    2 root  wheel      512 Jan  1  2009 proc',
    1 => 'drwxr-xr-x    2 root  wheel     2560 Sep 24  2010 rescue',
    2 => 'drwxr-x---    5 root  wheel      512 Aug  2  2010 root',
);
このように結果が返却されます。 次に、非同期で実行する場合
exec('コマンド > dev/null &');
上記の様に記述することで非同期でコマンドを実行することができます。 コマンドの結果をdev/nullにリダイレクトしています。 また dev/null とは、Unixシステム上での スペシャルファイルで、常に空であるファイルです。 最後に &をつけバックグラウンドで実行するようにします。 これでバックグラウンドでPHPを実行したりシェルスクリプトを実行したりできます。 また、コマンドを使用する際は「escapeshellcmd関数」でエスケープします。 終わり 【追記】:2012-03-06 exec関数使用時にescapeshellcmd関数を使うだけでは どうも不十分なようです。 escapeshellcmd関数では、シングルクォート・ダブルクォートともに対になっていないと エスケープされないため意図しない動作が起こる可能性があります。 ですので、引数などはescapeshellarg関数を使用して引数ごとに エスケープを行った方がパラメータの意図しない追加などを防ぐのに有効です。 こちらのブログの記事で詳しく説明されています。 参考: PHPのescapeshellcmdの危険性 - 徳丸浩の日記

0 件のコメント:

コメントを投稿