【PHP】バックグラウンド(非同期)で処理を実行する

PHPで重い処理を行う場合、バックグラウンドでの処理依頼だけして、すぐレスポンスを返す方法のメモ。

基本PHPでは非同期処理をサポートしていないので、外部プログラムとして実行させる

exec('実行したいプログラム > /dev/null &')

参考:PHP中級、2外部プログラム実行

これを応用してPHPの処理自体を非同期で行うには

exec('wget --spider http://localhost/hoge.php > /dev/null &')

exec('php /var/www/html/hoge.php > /dev/null &')

こんな感じで外部プログラムでPHPを実行する。

ちなみにexecを実行するためにはsafe_modeがoffでないと駄目。

wgetについてはここを参考に。

コメント

  1. ものすごい役に立ちました!
    ありがとうございます!

    返信削除
  2. http://blog.bz2.jp/archives/2008/05/singleexecution.html

    人様の所のモノですが、お役に立てば。

    返信削除
  3. コメントありがとうございます。
    教えて頂いたサイトのやり方(cron)でも、できそうですね。

    非同期で実行する場合は
    「前の処理が終わっているか」
    を判断する必要があって、私の場合はデータベースにフラグを持って処理中かどうか判断しています。
    予期しないエラー(停電とか)でフラグが残ったままの場合は、「キャンセル」ボタンを画面に設けて対応しました。

    プロセスで判断した方が予期せずロックしたまんまとか発生しなくて良さそうですね。

    返信削除
  4. たしかに非同期ですねw
    でも、exec()やsystem()でコマンド叩く時点でどうなんだろって思ってしまうのですが。。。
    perlだとこのへん活発で、AnyEventCoroとか最近注目されていますね。
    私も普段のwebコンテンツの作成はPHPを使用してますけど、この手の処理は割りきってPHPを捨ててperlなり他の言語を使用した方がいいと思います。

    返信削除
  5. > PHPで重い処理を行う場合、バックグラウンドでの処理依頼だけして、

    であれば、ジョブ・キュー使ったほうがいいですね。
    AWSのSQSgearmanQ4MTheSchwartzとかいろいろありますよ。

    返信削除

コメントを投稿

このブログの人気の投稿

オンサイトサポートとは(=出張サポート)

スタートアップで起動するアプリを停止する方法

既存のディレクトリ(フォルダ)にgit cloneして上書きしたい