【PHP】exec 重い処理をバックグラウンドで実行

閲覧者に負担をかけないために

PHPで重い処理を行う際にバックグラウンドで実行したい場合があります。
例えばAPIの取得で大容量の通信が発生する時などです。

そのまま処理が進むと閲覧者のパケットが大変な事になります。
またアクセスから表示までの時間も長くなり離脱の原因にもなってしまいます。

そこで exec を用いて閲覧者に負担を書けないようにバックグラウンドで処理を行います。

サンプル

サンプルではバックグラウンドでテキストファイルを作成してみます。
この処理自体は大したものではありませんが、
バックグラウンドで動いていることが理解しやすいかと思います。

index.php

<?php

  $cmd = 'nohup php exec.php > /dev/null &';
  exec($cmd);

exec.php

<?php

  $file = 'test.txt';
  $text = 'バックグラウンド処理成功';
  file_put_contents( $file, $text );

index.phpにアクセスすると同階層に test.txt が作成されます。

変数を渡す

外部ファイルに変数を渡したい場合は下記のようにします。
配列は渡せないので implode を使用して一旦テキストにするなど工夫が必要です。

index.php

<?php

  $val1 = '値1';
  $val2 = '値2';
  $val3 = '値3';
 
  $cmd = 'nohup php exec.php ' . $val1 .' '. $val2 .' '. $val3 .' > /dev/null &';
  exec($cmd);

exec.php

<?php

  $val1 = $argv[1];
  $val2 = $argv[2];
  $val3 = $argv[3];

  $file = 'test.txt';
  $text = val1 . $val2 . $val3;
  file_put_contents( $file, $text );

まとめ

通常はファイルを生成するPHPをcronに登録しておけば、
一定時間ごとにファイルを作り直してくれます。

しかし閲覧時のページの情報をJSで取得してPHPに渡す必要があり、
どうしてもアクセス時にファイル生成プログラムを動かしたくて
このような方法をとってみました。

Writer

KO

誕生日に会社のみんなから『世界文学全集』をプレゼントしてもらった読書好きフロントエンド・エンジニアです。WordPressとMovableTypeが得意ですが、本当の特技は薪割りです。

Contact

ご提案依頼、ご相談、お見積もりなど
お気軽にお問合わせください。

03-6403-3259

平日 10:00~19:00

「Web制作について」とお伝え頂ければ
担当者に取次させていただきます。

Mailform

contact@trym.jp
でも受け付けております。