バックエンド管理WebページからのPHPスクリプトの開始と停止

cakephp daemon lamp php service
バックエンド管理WebページからのPHPスクリプトの開始と停止

PHPスクリプトの開始と停止を可能にするWebページを作成しようとしています。 スクリプトはサイトのバックエンドの一部であり、スクリプトが存在する同じサーバー上のデータベースにアクセスし、データを読み取り、そのデータを処理し、データベースを更新する必要があります。 さらに、管理者が現在の状態(実行中または停止中)、さらにはスクリプトによって作成されたログへのリンクを表示できるようにするWebページが欲しいです。 私は、PHPのexec、passthru、および関連する機能について学習する道を歩み始めています。 これは正しい道ですか? これに適した他の方法はありますか? プラットフォームに依存しない方法でこれを行うことは可能ですか? 私はWindowsのLAMPP + CakePHPスタックで開発しているので、選択したすべてのWebホストに機能が存在することを望んでいます。

  0  0


ベストアンサー

私は最近の仕事でこれをしましたが、おそらくあなたにとってはやり過ぎです。 私はジョブプロセッサを実行し、基本的にデータベースに2つのテーブル、少なくとも2つのオブジェクト、少なくとも2つのコントローラーを設定しました。

最初の部分はジョブ処理ユニットであり、ジョブを開始または継続する要求を管理するジョブプロセッサコントローラで構成され、2つのアクティブ行モデルJobQueueおよびJobが付属しています。 キューを削除できますが、そのようなシステムでキューイングすることは常に実用的であるため、2,3,4個のジョブを一度に実行できると言えます。

キューはそれだけで、複数のジョブが接続されているスロットであり、現在実行中かどうかを判断するキューステータスがあります。

ジョブは、実行する必要がある内容を説明するジョブテーブルにマップする仮想オブジェクトです。 私の実装では、呼び出されたコントローラーとフィールド+データベースの型に実装する必要があるインターフェイスを作成しました。 ジョブはコントローラークラスをインスタンス化し(ジョブプロセッサーコントローラーではなく、実行する操作を管理する別のコントローラー)、その中のメソッドを呼び出してタスク処理を開始します。

さて、トリッキーになるために、タスクをメインサーバーにロードしたり、Apacheの処理キューをジャムさせたりしたくないので、その部分だけのためにシステムを専用サーバーで実行するように強制しました。 だから私は2つのサーバーを持っていて、私のQueueクラスは、IPアドレスを介して別のサーバーのページを呼び出して、そのサーバーで具体的にジョブを実行することを担当していました。 ジョブが完了すると、HTTPリクエストを使用してコールバックし、処理を再開して次のタスクを実行します。 タスクが残っていない場合は、通常どおりに終了します。

この方法で行う利点は、cronjobが必要ないことです(スクリプトが非常に安定しており、クラッシュしない限り)必要なときにトリガーされるため、手放すことができ、自分自身を呼び出すことができますfsockopenで戻って、次のジョブをトリガーする別のページビューをトリガーします。

作業単位

ジョブが非常に大きい場合は、セグメント化する必要があることを理解することが重要です。 私は「作業単位」の原則を使用して、ジョブが何度もしなければならない1つの部分を説明しました。 その後、キュープロセッサもタイムマネージャーになり、ジョブにX秒以上かかったかどうかを検出できるようになりました。残りのステップを後で延期し、コールバックして自分がいる場合は続行します。 そうすれば、「制限時間を設定する」必要がなく、30年代のスクリプトが実行されている間にサーバーを妨害する必要がありません。

これが助けになれば幸いです。

3


継続的に実行するスクリプトを実行するには、次のことを考慮する必要があります。

  • phpスクリプトは、ジョブによって* CLI(コマンドライン)*として起動する必要があります
    cronなどのスケジューラ。 Webサーバーの構成が、実行されたスクリプトのタイムアウトを定義したことを忘れないでください。

  • 1日24時間実行するには、無限ループを実装することを想像してください。 In
    その場合、ジョブを実行する必要があるかどうかにかかわらず、ループごとにファイルまたはデータベースを読み取るjobIsActiveのようなテストを作成できます。 ボタンをクリックすると、ジョブのステータス(更新ファイル、db …​)を変更するだけです。 両方のボタンで治療を停止またはアクティブにできますが、無限ループは停止しません。

  • 無限ループは最もエレガントなソリューションではありません。
    毎晩ジョブを実行するcronタブのエントリとボタンをクリックすると、手動で起動できます。

0


タイトルとURLをコピーしました