【スレッドの使い分け】PHPからコマンドを実行する方法【現役エンジニアが解説】

PROGRAM

今回は、PHPからコマンドを実行する方法について、同一スレッドと別スレッドで実行する場合に分け、簡単に解説していきます。

PHPから同一スレッドでコマンドを実行する方法

PHPからコマンドを実行する場合は、exec関数を使います。

以下のコードはプラットフォームがLinuxの場合のサンプルコードです。

exec('cd /tmp ; cp hoge.txt hoge/');

このように複数の命令を順次で実行する場合には「;(セミコロン)」で区切ります。

一方で、プラットフォームがWindowsの場合で同じ命令をしようとすると以下のコードになります。

exec('cd \tmp && copy hoge.txt hoge\');

「/(スラッシュ)」が「\(バックスラッシュ)」に変わり、「;(セミコロン)」が「&(アンパサンド)」2つに変わります。

これらLinuxとWindowsの場合のいずれのコードも、PHPと同一スレッドでコマンドを実行するサンプルコードとなります。

PHPから別スレッドでコマンドを実行する方法

一方で、PHPと別スレッドでコマンドを実行したい場合もあると思います。

先程と同じコマンドの命令を別スレッドで実行するLinuxのサンプルコードは以下のとおりです。

exec('nohup sh -c "cd /tmp ; cp hoge.txt hoge/" > /dev/null &');

exec関数を使うところは同じですが、nohup sh -cの後のダブルクォートの中に先程の命令を入れます。

一方で、同じ内容のコマンドをWindowsで実行する場合には、exec関数を使わず、以下のコードになります。

$fp = popen('start "" cmd /c "cd \tmp && copy hoge.txt hoge\"', 'r');
pclose($fp);

PHPのpopen関数を使って、start “” cmd /cの後のダブルクォートの中に先程の命令を入れ、最後にpclose関数を使います。

スレッドの使い分け

プログラミングを学習したての頃は同一スレッドと別スレッドの使い分けが上手くできないと思います。

基本的には、長い処理でも待てる場合には同一スレッドを、待てない場合には別スレッドで処理をすれば良いと思います。

別スレッドを使うケースでは、例えば、長い処理の受付だけを先に済ませたい場合や並列で迅速に処理をしたい場合等が考えられます。

もちろん現在のPHPから別のPHPを別スレッドで呼んで実行するということも可能ですので、スレッドを使いこなせるようになれば、ほとんどなんでもできるようになります。

別スレッドで実行のことを開発者の間では、バックグラウンドで実行と表現することもあり、サーバ側の開発では頻出のため、呼び名と方法は必ず覚えておくようにしましょう。