26

ASPNET では、アプリケーション ストアとキャッシュ ストアが好きになりました。彼らは素晴らしいです。初心者の場合は、データ ロジック オブジェクトをそれらに投入するだけで済みます。データベースにクエリを実行する必要があるのは、わずかなデータに対して 1 回だけです。

最高の ASPNET 機能の 1 つである IMO.

それ以来、私は Linux 用の Windows を捨てたので、webdev 用に PHP、Python、Ruby を使いました。PHP を最もよく使用するのは、すべて PHP を使用していくつかのオープン ソース プロジェクトを開発しているためです。

言うまでもなく、データ オブジェクトのキャッシングに関して PHP が提供する機能について説明しました。これまでに私は遊んだことがあります:

  1. ファイルへのシリアル化 (かなり遅い/高価なプロセス)
  2. データを JSON/XML/plaintext/etc としてファイルに書き込みます (読み取り操作の場合はさらに遅くなります)
  3. 純粋な PHP としてファイルにデータを書き込む (読み取りは最速ですが、書き込み操作は非常に複雑です)

アプリはあらゆる種類のシナリオでインストールされるため、サードパーティのアプリ (memcached など) に依存しないソリューションを探していることを強調しておく必要があります。安価な共有ホスティング アカウント)。

私が今やっていることに戻りますが、ファイルを安全に保持していますか? 運用サーバーのセキュリティでは、ファイル書き込みは常に無効になっていますが、書き込みができない場合にPHPRule 1キャッシュできる方法がまったくわかりません。セキュリティを強化するためのヒントやコツはありますか?

私が忘れている別のファイルに保存する方法はありますか?

「制限された」環境でキャッシュするより良い方法はありますか?

4

8 に答える 8

18

シリアル化は非常に安全で、一般的に使用されています。ただし、別の方法があります。それは、メモリにキャッシュすることです。memcachedAPCをチェックしてください。どちらも無料で、パフォーマンスが高いです。PHPのさまざまなキャッシュ手法に関するこの記事も興味深いかもしれません。

于 2008-09-24T13:00:03.470 に答える
7

Re: 私が忘れている別のファイルに保存する方法はありますか?

有用性は限られていますが、特に強力なデータベース クエリがある場合は、シリアル化されたオブジェクトをインデックス付きデータベース テーブルに書き戻すことができます。データベース クエリのオーバーヘッドは依然としてありますが、強力なクエリとは対照的に単純な選択になります。

Re: ファイルへの永続化は安全ですか? 安価な共有ホスティング アカウント)

悲しいことに、安価な共有ホスティングは安全ではありません。あなたのサーバーにアクセスできる 100 人、500 人、または 1000 人の他の人をどの程度信頼していますか? 歴史的な理由と (皮肉なことに) セキュリティ上の理由から、共有ホスティング環境では PHP/Apache が非特権ユーザーとして実行されています (PHP は Apache モジュールとして実行されています)。ここでのセキュリティの合理性は、Apache プロセスに直面している世界が危険にさらされた場合、悪用者は重要なシステム ファイルを操作できない非特権アカウントにしかアクセスできないということです。

悪い点は、PHP を使用してファイルに書き込むときはいつでも、そのファイルの所有者が特権のない同じ Apache ユーザーであることです。これは、システム上のすべてのユーザーに当てはまります。つまり、すべてのユーザーがファイルへの読み取りおよび書き込みアクセス権を持っています。上記のシナリオの理論上のハッカーも、ファイルにアクセスできます。

また、PHP には、ディレクトリとファイルに 777 のディレクトリ権限を与えて、権限のない apache ユーザーがファイルを書き出せるようにし、ディレクトリまたはファイルをその状態のままにしておくという、永続的な悪い習慣があります。これにより、システム上の誰でも読み取り/書き込みアクセスが可能になります。

最後に、あいまいさがあなたを救うと思うかもしれません。「私の秘密のキャッシュ ファイルがどこにあるかを彼らが知る方法はありません」が、あなたは間違っているでしょう。共有ホスティングは同じグループにユーザーを設定し、ほとんどのデフォルトのファイル マスクは、作成したファイルに対する読み取り権限をグループ ユーザーに付与します。共有ホスティング アカウントに SSH で接続し、ディレクトリを上に移動すると、通常はシステム上の他のユーザー ファイルの参照を開始できます。これは、書き込み可能なファイルを盗聴するために使用できます。

解決策はきれいではありません。一部のホストは、PHP を CGI として実行できる CGI Wrapper を提供します。ここでの利点は、PHP がスクリプトの所有者として実行されることです。つまり、権限のないユーザーではなく、あなたとして実行されます。問題回避!新しい問題!従来の CGI は 2 月の糖蜜のように遅いです。

FastCGI がありますが、FastCGI は扱いにくく、常に調整が必要です。多くの共有ホストはそれを提供していません。対応するものを見つけた場合、APC が有効になっている可能性があり、memcached のメカニズムを提供できる可能性さえあります。

于 2008-09-24T13:37:05.377 に答える
4

私も同様の問題を抱えていたので、PHPで書かれたメモリキャッシュという解決策を書きました。ソケットをサポートするために必要なのはPHPビルドのみです。それ以外は、これは純粋なphpソリューションであり、共有ホスティングで問題なく実行されるはずです。

http://code.google.com/p/php-object-cache/

于 2009-07-01T07:12:57.827 に答える
3

書くことができなければならない場合、私がいつもしていることは、PHP コードを持っている場所に書いていないことを確認することです。通常、私のディレクトリ構造は次のようになります (プロジェクトによって異なりますが、これが一般的な考え方です)。

project/
  app/
  html/
    index.php
    data/
  cache/

appWeb サーバーから書き込み可能ではありません (どちらも index.php ではないことが望ましい)。 cache書き込み可能で、解析されたテンプレートやオブジェクトなどのキャッシュに使用されます。data必要に応じて、おそらく書き込み可能です。つまり、ユーザーがデータをアップロードすると、データに入ります。

Web サーバーが参照され、便利な方法を使用して、プロジェクト内のすべてのページで実行するスクリプトとしてproject/html設定されます。index.phpApache で mod_rewrite を使用するか、コンテンツ ネゴシエーション (私の好みですが、しばしば不可能です)、またはその他の好きな方法を使用できます。

実際のコードはすべてapp、Web サーバーから直接アクセスできない にありますが、PHP パスに追加する必要があります。

これは、いくつかのプロジェクトで非常にうまく機能しています。たとえば、ウィキメディアにこの構造の修正版を使用させることさえできました。

ああ...そして、serialize()/unserialize() を使用してキャッシングを行いますが、PHP コードの生成には一定の魅力があります。私が知っているすべてのテンプレート エンジンは、実行する PHP コードを生成し、ポストパースを非常に高速にします。

于 2008-09-24T13:24:22.553 に答える
1

データベース クエリ キャッシュ (つまり、MySQL) にアクセスできる場合は、オブジェクトをシリアル化し、DB に格納することができます。データベースはクエリ結果をメモリに保持するので、かなり高速です。

于 2008-09-24T13:14:13.343 に答える
1

オブジェクトをキャッシュしようとしている理由を詳しく説明しません。遅いデータベース クエリを高速化したり、高価なオブジェクトのインスタンス化を回避したり、複雑なページの繰り返し生成を回避したり、アプリケーションの状態を維持したり、長い冬の場合にオブジェクトを強制的に格納したりしていますか?

ほとんどの低コストの共有ホスティングのひどい制限を考えると、最善の解決策は、何を達成しようとしているかによって異なります。バレル共有ホスティングの底に行くということは、最高のツールを使用しないことを受け入れる必要があることを意味します. 数値を数値化するのは困難ですが、ホスティング コスト、サイトのパフォーマンス、および開発者の時間 (つまり、高速、安価、または簡単) の間にはトレードオフがあります。

于 2008-12-05T04:16:19.520 に答える
0

一部のホスティング場所では、APCがコンパイルされている場合があります。これにより、オブジェクトをメモリに保存できます。

于 2008-09-24T13:02:37.350 に答える
0

理論的には、オブジェクトをセッションに保存することは可能です。これにより、ファイル書き込みが無効になっている問題を回避できる場合があります。さらに、セッションを mysql メモリ バックアップ テーブルに保存して、クエリを高速化することもできます。

于 2008-09-24T12:55:01.783 に答える