2011-12-09 10 views
3

スクリプトやセッションが終了すると、グローバルとスーパーグローバルは死ぬと思います。 PHPでセッション間変数を保存する最善の方法は何ですか?言い換えれば、私はすべてのセッションが変数にアクセスできるようにします。 (これは、サーバー上のリソースへのアクセスを同期させるためのブール値になります)。ファイルに値を格納する以外に解決策はありますか? ...メモリ内の変数を維持するとよいでしょうPHPのセッション間変数

EDIT:

私はこれを行うことができるようにしたい

while ($beingused) 
    sleep(5); 
$beingused = true; 
// Do something 

SOLUTION:

をあなたのお手伝いをさせていただきありがとうございます。私のソリューションはあなたの意見に基づいています。

memcache_pconnect('localhost'); 
while (memcache_get('inuse') == 'true') 
    usleep(10); 
memcache_set('inuse', 'true'); 
// Do something 
memcache_set('inuse', 'false'); 

UPDATE

私は実際には、すべての後に、ファイルの溶液で行く終わるんでした。ユーザがアプリケーションと対話するたびに、ユーザの入力に応じて変化するスクリプトが送られます。私は、多くの回答で示唆されているように、スクリプトファイルの存在がブール値として倍増する可能性があることに気付きました。

+1

どのような種類のリソースですか?このリソースはユーザー間で共有されているのですか、またはサイト訪問中に1人だけが使用していますか?千の言葉に見合った一例。 –

+0

さて、サーバー上で動作するアプリケーションです。各ユーザは、shell_exec()コマンドを使用して、アプリケーションの同じインスタンスと対話します。コマンドは非常に迅速に完了しますので、衝突はまれですが、私はそれを確認したいと思います。ブール値は、別のユーザーがアプリケーションを使用しているかどうかを示します。その場合、スクリプトは数ミリ秒待ってから再試行できます。 –

+1

それはまだかなり曖昧です。 *設定の設定*をお探しですか? *データベース*に半永久的なエントリ? A *セマフォ/ロック/トークン*?これはユーザー固有の設定、マシン固有の設定、またはグローバル設定ですか? – deceze

答えて

2

私は空のファイルを特定の名前(LinuxのPIDファイルなど)で使用します。コマンドを実行する前に、スクリプトはファイルが存在するかどうかをチェックし、存在しない場合はファイルを作成します。シェルスクリプトを実行した後、ファイルを削除します。しかし、ファイルシステムのキャッシュには注意してください。

もう一つの速いオプションはmemcacheやRedisのようなメモリ内のデータベースにフラグを格納することです。

+0

OPは特に「ファイルに値を格納するだけではなく」要求しました。 – Ben

+0

danielfaradayはブール変数を要求します。これがPIDファイルができることです。ファイルが存在する場合は=> TRUE、シェルスクリプトは実行中です。存在しない場合 - FALSE、スクリプトは実行されていません。ファイルに何かを書く必要はありません。 – Minras

+0

私はmemcacheが最も合理的な解決策のように聞こえると思います。他の人はちょっと私にちょっとハッキリしています(ファイルシステムとデータベースはランタイム変数を格納するものではありません)...情報をありがとう。私はmemcacheを調べます。 –

0

ブラウザ間で保存する場合:Cookieを使用します。それらにアクセスするには$_COOKIE[]set_cookie()を使用してください。

サーバーに保存する場合:データベースフィールドを使用します。 downvotesにもかかわらず

UPDATE

、そしてあなたの更新後に、あなただけのデータベースにブール値を設定し、それに応じてその値をチェックすることができそうです。確かにページには、データベース、つまりノード、ログ、または何かのエントリがあります。

+0

... downvotesの理由は? – Ben

+0

私はdownvoteをしませんでしたが、理由はクッキーが問題の解決策ではないということです。データベース(これは通常、リレーショナルデータベースを意味します)は問題を解決しますが、むしろ遅く、リソースを消費します。 – Minras

+0

@ミンスラ - ありがとう、それは意味をなさない。 – Ben

2

は、私はあなたがあなたの質問に応じて何をしたい「インメモリデータベースSQlite in-memory databaseのような、または作成したデータベース等MySQL Memory Storage engine

を使用して使用することだと思うしかし、私はわからない、それは使用する価値があります1つの変数だけを保存するためのメモリ内データベース。

は詳細をご覧ください:http://en.wikipedia.org/wiki/In-memory_database

EDIT:

OPの編集後は、それが特定のタスクを実行する前にロックを獲得することである彼が何を必要とするようです。 そして、私はこれらのphp semaphore関連の機能も使用できると思います。 PHPの原則の

http://www.php.net/manual/en/function.sem-get.php

http://www.php.net/manual/en/function.sem-acquire.php

http://www.php.net/manual/en/function.sem-get.php

+0

ええ、それはうまくいくでしょう - しかし、それは1つのブール値のために過剰なもののようです。うーん... –

+0

@danielfaradayセマフォについての更新を参照してください。しかし、まだダウン投票のための私の元の投稿には何も間違っていませんでした。また、メモリ内のデータベースについてのコメントもあります。 –

0

一つSHARE何もではありません。つまり、2つのPHP実行/プロセス/リクエスト処理の間で何も共有することはできません。共有されるものはすべてPHPの外部で共有する必要があります。

同じユーザーの場合は、セッションがあります。一般的な共有の場合、古典的なLAMPインストールではデータベースがあります。しかし、ファイルシステム(セマフォ、ロック)を使うこともできます。アプリケーションロックを設定するためにデータベースを使用することは古典的なことですが、書き込み操作が非常に遅い古典的なRelationnalデータベースを悪くするかもしれません。 RedisのようなNOSQLストレージエンジンには、非常に高速なロック操作がサポートされています。

+0

downvoting?何らかの理由? – regilero

+0

ありがとうございます - 私はメモリ内のデータベースソリューションを利用する予定です。それは最も意味をなさない... –

+0

あなたのおかげで感謝が、私はこれが-1に値しないと思うが – regilero

関連する問題