ということで今回は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の危険性 - 徳丸浩の日記
2012/01/11
【PHP】PHPのexec関数
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿