1

私は、さまざまなWebホストを使用して、かなり非技術的なユーザーによって展開される多くの異なるクライアント/サイトに送信されるPHPスクリプトにある種のキャッシュを実装しようとしています。ユーザーの非技術的な性質のため、ファイルのアクセス許可を微調整するようにユーザーに依頼することは避けたいと思います。キャッシングはセッション間で行う必要があるため、セッション変数の使用は不要です。これをASPでコーディングする場合は、アプリケーション変数を使用しますが、PHPには存在しません(私の知る限り)

誰かがこれを達成する方法について何か提案がありますか?

これが私が考えたいくつかの可能性です、これらについてのコメントは役に立つでしょう:

  • システム一時フォルダー内のファイルを介したキャッシュ-sys_get_temp_dir()(またはPHP4のホームロールされた同様の関数)を使用して、そのようなフォルダーを見つけることができます。ここでの欠点は、openbase_dir制限を使用しているホストではおそらく機能しないことです。
  • 私が見たいくつかのWebサイトでは、PHPをだましてすべてのユーザーセッションを同じセッション状態で共有させ、それによってセッション変数をセッション変数のように動作させることに言及しました。もちろん、今はその投稿を見つけることができません...これはとにかく怖いようです。(この質問をもう一度見つけたら、この投稿へのリンクで更新します)
  • AmazonのSimpleStorageServiceのようなサードパーティのデータストアを使用する-やり過ぎのようです
  • 私が制御するサーバーにデータをキャッシュし、ヒットするたびにクライアントにそこから新しいデータをダウンロードさせます。

繰り返しになりますが、これらのアイデアや新しいアイデアについてのコメントをいただければ幸いです。

更新: session_id()を使用して共有セッション状態を使用しようとしましたが、機能しません。各セッションは独自の「GlobalCache」を維持していますが、その理由は何ですか?:

// This code doesn't work, but the similar code in my answer does!

function test() {
    if (!$_SESSION['session_count']) $_SESSION['session_count'] = 0;
    $_SESSION['session_count']++;


    $count = get_cache( 'count' );

    print "pre application count: $count<br>";

    if ( !$count )
        $count = 0;

    $count++;

    print "session_id: " . session_id() . "<br>";
    print "post application count: $count<br>";
    print "session_count: " . $_SESSION['session_count'] . "<br>";

    set_cache('count', $count);
}


function set_cache( $name, $value ) {
    $old_session = session_id();
    print "old_session (set): $old_session<br>";

    session_id("GlobalCache");
    print "new_session (set): " . session_id() .  "<br>";

    $_SESSION[$name] = $value;
    session_id( $old_session );
}

function get_cache( $name ) {
    $old_session = session_id();
    print "old_session (get): $old_session<br>";

    session_id("GlobalCache");
    print "new_session (get): " . session_id() .  "<br>";

    $value = $_SESSION[$name];
    session_id( $old_session );
    return $value;
}

session_start();
test();

更新: memcachedの使用を提案する人もいますが、これは実際には一部の人にとっては優れたソリューションですが、エンドサーバー環境を制御できないため、オプションではありません。アイデアは、人々が箱から出してすぐに機能する共有ホスティングアカウントにFTPで接続できるスクリプトを用意することです。

更新:誰かがスクリプトを使用して独自のキャッシュフォルダーを作成することを提案しましたが、既に書き込みアクセス許可が設定されているフォルダー内にそのようなフォルダーを作成する必要はありませんか?

更新、解決策が見つかりました:グローバルセッションスクリプトの問題を理解し、その影響に対する独自の回答を投稿しました。みんな助けてくれてありがとう。

4

6 に答える 6

2

さて、共有/グローバルセッション状態を使用してASPスタイルのアプリケーション変数をエミュレートすることでこれを行う方法を理解しました。関連するアップデートでの私の機能しないコードからの2つの重要な変更:

  1. セッション状態を切り替えるには、現在のセッションを終了し、新しいセッションに切り替えてから開始する必要があります。このプロセスをswitch_session()にカプセル化しました

  2. セッションIDを切り替えるため、セッションCookieがすぐに送信されないように、ob_start()/ ob_end_flush()を使用してページの出力をバッファリングする必要があります。

完全に機能するコードが続きます(クリーンアップも!)。これは、IEとFirefoxウィンドウにページをロードし、それぞれを数回リロードしてカウンターの上昇を監視することで簡単にテストできます。

<?php
function test() {

    // Do a regular session count
    print "session_id: " . session_id() . "<br>";
    if (!$_SESSION['session_count']) $_SESSION['session_count'] = 0;
    $_SESSION['session_count']++;
    print "session count: " . $_SESSION['session_count'] . "<br>";


    // Do an application count
    $count = get_cache( 'count' );
    if ( !$count ) $count = 0;
    $count++;
    print "application count: $count<br>";
    set_cache('count', $count);
}


function set_cache( $name, $value ) {
    $old_session = switch_session("GlobalCache");
    $_SESSION[$name] = $value;
    switch_session( $old_session );
}

function get_cache( $name ) {
    $old_session = switch_session("GlobalCache");
    $value = $_SESSION[$name];
    switch_session( $old_session );
    return $value;
}

function switch_session( $session_id ) {

    // switch the session and return the original
    $old_id = session_id();

    session_write_close();
    session_id($session_id);
    session_start();
    return $old_id;
}

ob_start();
session_start();
test();
ob_end_flush();
?>

于 2009-01-23T01:58:19.330 に答える
1

アプリケーションのディレクトリで独自のキャッシュ ディレクトリを使用します。これにより、さまざまなサーバーや PHP の設定に苦労する必要がなくなり、最高の移植性が得られます。

于 2009-01-22T19:23:22.017 に答える
1

固定のセッション キーでセッションを使用できます。

http://de.php.net/manual/en/function.session-id.php :

session_id([id]) はid、現在のセッションのセッションを取得または設定するために使用されます。id を指定すると、現在のセッション ID が置き換えられます。そのためには、session_start() の前に session_id() を呼び出す必要があります。

于 2009-01-22T19:18:42.867 に答える
0

高負荷が予想されていたため、単純なデータベースクエリ結果をキャッシュする方法として、作成者が更新した関数を使用しました。また、タイムスタンプを保存して、キャッシュされた値を取得するだけでなく、ページがデータベースの結果を更新する頻度を定義できるようにしました。

このキャッシュ関数のパフォーマンスは、リクエストごとにデータベースを直接処理するよりもはるかに劣っていたと言えます。私は実際にサーバーを殺しました。データベースのクエリに戻ると、サーバーはフルスピードになり、かなり大きな負荷にも気づきませんでした。

于 2010-01-22T13:25:53.473 に答える
0

php の memcached を確認してください。これは非常にうまく機能します。

http://www.php.net/memcache

于 2009-01-22T20:42:11.840 に答える
0

私は「私が管理するサーバーにデータをキャッシュし、クライアントがヒットごとにそこから新しいデータをダウンロードするようにする」に投票します。

他のすべての道は、特定の狂気につながります。

于 2009-01-22T19:10:31.090 に答える