2016-09-04 11 views
1

サードパーティのソースからユーザー固有のデータを取得してローカルテーブルにダンプするPHPスクリプトがあります。ユーザーがログインしているときにX分ごとに実行しますが、実行には約30秒かかりますが、これはユーザーには嫌です。私はこれを行う最善の方法は、成功したそれぞれのプルをタイムスタンプすることだと思って、最後のプルをチェックするすべてのページフッターにいくつかのコードを置き、X分以上前だったらバックグラウンドでPHPスクリプトを実行します。バックグラウンドプロセスを実行するPHPページ

プルスクリプトの実行時に必要なユーザー固有のグローバル変数とセッション変数がありますので、これを行うにはcronジョブを使用したくありません。

popen()はPHPスクリプトを実行することができますが、セッション内で訪問者として実行されるかどうかに関する情報は見つけられません。ユーザー固有のグローバル変数またはセッション変数)、または個別のセッションとして使用できます。

  1. popen()が問題を解決しますか?
  2. これは正しい方法ですか、ユーザーがログインしている間に間隔を置いてスクリプトを実行するより良い方法がありますか?

いつものように、何か助けやアドバイスをいただければ幸いです。

乾杯

アンディ

+0

個別のプロセスは、常に別のセッションです。スクリプトのセッションをロードする(コードに完全に依存し、セッションを管理する方法)か、情報をプロセスの引数としてJSON(またはシリアライズされた配列)を渡すほうが簡単でしょう。 –

+0

ユーザーがログインしている間にこのコードをX分ごとに実行する必要がある理由は何ですか?コードは何をしていますか? – Sherif

答えて

0

私はフロントエンドからスクリプトを呼び出し、結果を処理するためにJavascriptとAJAX要求を使用します。 それから、JavaScriptで間隔を設定し、各間隔ティックごとにAJAX-Requestを送信することができます。

+1

(ファイルを使用する)標準セッションハンドラを使用する場合、ajax呼び出しが完了するまで待たなければならないので、新しい要求を行うことはできません。 ajax呼び出しはセッションファイルをロックしているため、新しい要求はアクセスできず、ハングします。 – MarcHoH

+0

これは、同時にリクエストを行う場合にのみ適用されます。 –

2

多分、セッションデータをテーブルに入れることも考えられます。 こうすれば、バックグラウンドプロセスから簡単にアクセスできます。引数としてsession_id()またはuser idを渡すだけで、プロセスが現在処理しているユーザーを知ることができます。

2
  1. いいえ、PHPはまだそれはおそらく
  2. ないを終了することができます前に、解決策は、システム

の建築制約に適合しないので、popen()によって開始されたプロセスを待つ必要があるので、あなたのcronジョブを使用しない理由は実際には音ではありません。あなたはあまりにも速くその特定の道を探索することをあきらめて、四角いペグを円形の穴に収めようとするとコーナーに引っ張られるかもしれません。

実際の問題は、Webリクエストとcrontabから実行されているPHPとの間でプロセス間通信を行う方法を理解することです。これは、いくつかの方法で解決できますし、PHPのアーキテクチャ上の制約を克服しようとする方が簡単です。

たとえば、データベースまたはその他のストレージにセッションIDを格納し、Web要求とは無関係にcrontabで実行されているPHPスクリプトからセッションファイルにアクセスできます。

ユーザーがサーバーに行った最後の要求に基づいてログインしていると判断した場合、この情報をタイムスタンプとして一部のデータストアに格納し、ユーザーテーブルの現在のセッションIDとともに保存します。

cronジョブは、指定された範囲内でアクティブなタイムスタンプを持つレコードのデータベースまたは永続ストアを調べ、それらのセッションIDを取得して必要な処理を行います。

ここで、処理時間が30秒以上かかる場合、実際にどのように効果的にスケールアップするのかについての質問は、独立して解決することができます。 See this answer for more details on how to deal with distributed job managers/queues from PHP

関連する問題