2011-07-14 29 views
9

PHPの静的変数はどれくらいの間持続しますか?つまり、「PHPの実行」はどれくらい持続しますか?コマンドラインプログラムでは、定義された開始と終了がありますが、Webで/ AJAXではこれを定義する方法がわかりません。PHP静的変数はどれくらいの期間持続しますか?

ここでは、PHPスクリプトを開始した3つの方法を紹介しました。私の実際のアプリケーションでは、ヘッダ()

を通じてより多くのPHPを呼び出す

  1. ユーザー(Requesing PHPページ)
  2. Javacript呼び出すPHP(AJAX)
  3. PHP私はjavascriptのは、PHPを呼び出す必要がありスクリプトはAJAXを介して、スクリプトはheader()を使用してサイトをリロードします。これは2つの異なるランと考えられる。それぞれには関連しない独自の静的変数があります。

答えて

15

PHP変数はインタプリタを介して実行されているスクリプトの存続期間中存続します。ウェブリクエストの場合、これはリクエストを処理する生涯です。 3つのケースはすべてサーバーに対するすべての要求であり、同じように処理されます。静的変数は、要求を処理した後にスクリプトが終了するまで存続します。

要求以上のPHP(およびその変数)の寿命:

  1. 要求がユーザーによってか、AJAX、カールPHPを介して、または、サーバーに送信されているものは、持っている - あなた
  2. 関連PHPをスクリプトが実行され、Webサーバー上のモジュール、CGIワーカープロセス、またはその他のオプションで実行されます。
  3. スクリプトが実行され、要求に対する応答が作成されて送信されます。
  4. (オプション)スクリプトは実行を継続します最終的な終了まで何らかの他のジョブを実行し、その時点ですべての変数dそれと一緒に。
+0

私のAjaxコールはfile1.phpを呼び出し、file2.phpを含み、ヘッダを送信するojbectをインストールします。これは2回の実行と見なされます。ファイル1にはFile2だけが含まれているので、これは1回実行されますが、私はheader()を呼び出してページをリロードします。これは2回目の実行で、header()コールですか? run1から呼び出されます –

+0

あなたのajax呼び出しは、file2.phpの内容を含むfile1.phpを実行する要求を生成します。これは、実行#1の終了時に終了するヘッダーを送信します。実行1によって送信された再ロードヘッダーは、(再ロードされたページの)新しい要求を生成し、実行2を開始します。もしrun#2がもう一度file1.phpに対する別の要求であれば、それはrun1と同じfile1.phpの実行ではありません! – shelhamer

+0

は、PHPでファイルを含める*別のWeb要求と同じではありません*。変数は 'include'と' require'呼び出しの間に存続しますが、データベース、クッキー、セッションなどの別のデータ共有メソッドを使用しない限り、 'curl'呼び出しでは渡されません。 – zzzzBov

1

3つはすべて同じです。

それぞれの場合、ユーザーのブラウザはURLのhttp要求を出しています。ランタイムは、サーバーが要求を受信して​​からフルフィルされるまでの時間です。

2

コマンドラインには、開始と終了が定義されています。

サーバー上で実行されているPHPに違いはありません。ウェブリクエストがスクリプトになされると、スクリプトはスクリプトの終わりまで、またはクラッシュするかタイムアウトするまで(そしておそらく他の同様の問題)実行されます。

AJAXはサーバー側を実行しません。 AJAXはもう1つはクライアント側のサーバーリソースへの非同期呼び出しです。認証、検証、入力チェックなどのすべての最初の要求に対して行われたすべての処理は、それ以降のすべての要求に対して実行する必要があります。 AJAXの応答の違いは、PHPスクリプトが、のコンテンツのみを返す可能性が高いことです。

プログラムが「持続する」という唯一の時間は、継続するように指示されている場合です。 PHPは待機するように指示することができ、Webソケット経由でアクションを実行できますが、それはあなたの質問の範囲外であるようです。

1

PHPスタティック(手続き的に「グローバル」と見なすことができます)は、いずれのケースでも存続しません。

それぞれに新しいHTTP要求が実行され、Php変数の状態が失われます。

2

"PHP実行"は、常に実行の開始からスクリプトの終了までです。したがって、ajaxでPHPスクリプトを呼び出したり、PHPがheader()を介して別のPHPを呼び出すと、各呼び出しは1回実行されます。以前にインスタンス化された静的変数は、永続状態を持たず、再定義されます。

静的変数のいずれか...これらの要求を通じて永続的なデータ状態を保持するには、セッション、Cookie、データベース、またはキャッシュに保存する必要があります。

1

サーバーの設定によって異なります。通常、リクエストをすると、PHPインタプリタが読み込まれ、スクリプトが解析され、サーバが結果を吐き出し、インタプリタが破棄されます。これは、ユーザーのブラウズやAJAXからのものであるかどうかにかかわらず、リクエストごとに発生します。つまり、「静的」変数はインタプリタが破棄されるまで有効です。インタプリタが破棄されるまでは、すべての要求が終了します。 (HTTPはステートレスです)

「PHPがヘッダ()でより多くのPHPを呼び出す」とはどういう意味ですか?あなたはリダイレクトを指していますか?その場合、それは新しい要求です。 「PHPがインクルード経由でPHPをより多く呼び出す」という意味だった場合、通常は新しいリクエストではありません(第三者からのPHPスクリプトが含まれているというのは危険です。インクルードを使用すると、PHPは元のスクリプトと同じコンテキストでファイルをロードして実行するだけです。

1

PHPスクリプトは、終了するか、スクリプトの最後に到達するか、失敗すると停止します。

関連する問題