ホームページ > バックエンド開発 > PHPチュートリアル > キャッシングテクノロジーを使用するにはどうすればよいですか?

キャッシングテクノロジーを使用するにはどうすればよいですか?

WBOY
リリース: 2016-06-20 12:43:41
オリジナル
1067 人が閲覧しました

アドバイスをお願いします。たとえば、私のindex.phpページは次のとおりです。
include("IncDB.php");
session_start (); >$result=mysql_query ("SELECT * FROM userlinks where id='a02' and userid='".$_SESSION['id']."' order by datetime desc limit 1",$link); = mysql_fetch_row($result );
echo "$row[1]";
echo "$row[2]"; $link);
?>

ユーザーがログインするたびに、データをデータベースから読み取って表示する必要があるため、キャッシュ技術などの方法はありますか。情報に変更がない場合に、毎回データベースにクエリを実行することなく、特定のページを取得して表示することができますか?皆さん、ありがとうございました。




ディスカッションへの返信(解決策) 私自身キャッシュ技術が使用できるとオンラインで読みましたが、その方法がまだわかりません。アドバイスをお願いします。ありがとう!
はい、キャッシュを使用できます

しかし、キャッシュ戦略は何ですか?

どこにキャッシュするか

データが変更されたことを知る方法

これらについて考えたことはありますか? ?

分かりません、お兄さん、考えたこともありません。上記のページの内容はユーザーによって変わるため、Webサイトにキャッシュを置くことは不可能だと思いますが、バックアップとしてユーザーごとにキャッシュを構築する必要がありますか?データが変更された場合、バックグラウンドで確認できますが、Web ページがアクティブに更新されると最新の情報が表示されますか?

私が必要としているのは、ユーザーがこのページを開くたびにデータベースからデータを抽出する必要がない方法を見つけることです。ページがより多くのデータを抽出するため、実際には時間がかかります。

その方法を教えてもらえますか?ありがとう!


ただし、このページが変更される場合は 2 つの状況が考えられます。1 つはバックグラウンド管理中に調整が行われ、内容が変更されるのは数か月に 1 回だけであり、もう 1 つは無視できます。ユーザーが EDIT.php を渡すこと。ページがユーザーリンク内のデータを変更すると、コンテンツが変更されます。
さらに、EDIT.php などの特定のページをクライアントにキャッシュできますか?ユーザーがそれを開くたびに、非常に遅いことがわかりました。
はっきり言ったか分かりません、マスター。

SQL クエリの結果を保存し、キャッシュ


ファイル キャッシュに保存できます。

皆様、ありがとうございました。申し訳ありませんが、私はこのコードを長い間読んでも意味が理解できませんでした。教えていただけますか。また、6 階のコードは、SQL クエリの結果をキャッシュに保存する 5 階で説明したものと同じですか?

クエリされたデータをローカルに保存し、毎回ローカルから読み取ることができれば、私が述べた機能を実現できると思います。

<?php include("IncDB.php"); session_start () ;$cache_file = dirname(__FILE__).'/cache.file';$expire = 60;$cache_data = json_decode(file_get_contents($cache_file), true);if(!$cache_data || time()-$cache_data['expire']>$expire){    $result=mysql_query("SELECT * FROM userlinks where id='a02' and userid=‘".$_SESSION['id']."’ order by datetime desc limit 1",$link);    $row = mysql_fetch_row($result);    $cache_data = json_encode(array('data'=>$row,'expire'=>time()));}else{    $row = $cache_data['data'];}echo "$row[1]"; echo"<br>"; echo "$row[2]";mysql_close($link); ?> 
ログイン後にコピー
おそらく、コードではキャッシュの更新時間を規定しており、その時間内であればキャッシュが読み取られ、それ以外の場合はデータベースから読み取られるようです。これが事実である場合、それは間違いです。ユーザーは edit.php ページを通じて特定のコンテンツをいつでも何度も変更しますが、数か月間は一度も変更しない可能性があるためです。したがって、キャッシュに更新時刻を指定した場合は動作しません。編集ページでキャッシュを更新するコードを追加する必要がありますか。インデックス ページはローカル キャッシュを直接読み取るだけで済みますか?ローカルで利用できない場合は、データベースを読み取りますか?

ちなみに、私が投稿したコードは間違っています。抽出されたデータは複数行であり、制限はありません 1。すみません。

memcache キャッシュを使用することをお勧めします (SQL クエリの結果をサーバーのメモリに置きます)。ユーザーが edit.php 内のデータを更新する場合は、memcache 内のキャッシュをクリアしてから、index に移動します。 php キャッシュをクエリするとき、if (memcache キャッシュが存在しない) {SQL ステートメントを使用してデータを更新}。

ごめんなさい、お兄さん、memcache の使い方がわかりません。インターネット上でこれを使用することについて話しているのを見ました。編集ページにステートメントを追加することでしょうか?それとも何か別のものでしょうか?何も分かりません。申し訳ありませんが、それがどのようなコードであり、どこに書かれているか教えていただけますか?私の無知を許してください。

index.php:

edit.php:


include("IncDB.php"); session_start () ;//使用memcache对象$memcache = new Memcache;$memcache->connect('memcache主机地址', 11211); //memcache默认端口号是11211if(!$memcache->get('results')){	$result = mysql_query("SELECT * FROM userlinks where id='a02' and userid=‘".$_SESSION['id']."’ order by datetime desc", $link);	$row = mysql_fetch_row($result);	echo "$row[1]"; 	echo"<br>"; 	echo "$row[2]";	mysql_close($link); 	$memcache->set('results', $row);}
ログイン後にコピー

数ヶ月変更しないことも可能なので、静的ページを直接生成して使用するだけで、なぜキャッシュを使用するのでしょうか?

//在edit.php里,用户更新了数据,则清除memcache缓存。//用户更新数据代码.....$memcache = new Memcache;$memcache->connect('memcache主机地址', 11211); //memcache默认端口号是11211$memcache->delete('results', 0); //0表示该元素立即删除
ログイン後にコピー
偉大な神々よ、ありがとう。戻って試してみます。ありがとう!

xuzuning の話に戻りますが、これは背景の変更であり、数か月に 1 回しか発生しませんが、ユーザーはより頻繁に変更する可能性があります。ご心配いただきありがとうございます。

misakaqunianx.さんに質問しましたが、分かりません。 1. 教えていただいた方法に従って、10 個のデータを抽出しました。これらの 10 個のデータをキャッシュした後、後でユーザーがそれらの 1 つ (たとえば 5 番目の部分) を変更した場合、そのデータは $ を通じて正確に更新されます。編集ページのmemcache?
2. インデックス ページで、ローカル キャッシュからデータを抽出するという文はどれですか?理解できません。
3. ユーザーが 2 つのローカル ユーザー名を持っている場合、影響はありませんか?
申し訳ありませんが、それは弱すぎる質問です。

偉大なる神々様、ありがとうございます!

ミサカクニアンクスさんに質問しましたが、わかりません。 1. 教えていただいた方法に従って、10 個のデータを抽出しました。これらの 10 個のデータをキャッシュした後、後でユーザーがそれらの 1 つ (たとえば 5 番目の部分) を変更した場合、そのデータは $ を通じて正確に更新されます。編集ページのmemcache?
2. インデックス ページで、ローカル キャッシュからデータを抽出するという文はどれですか?理解できません。
3. ユーザーが 2 つのローカル ユーザー名を持っている場合、影響はありませんか?
申し訳ありませんが、それは弱すぎる質問です。


ユーザーがデータを変更する限り、memcache キャッシュはクリアされます。これにより、変更内容に関係なく、SQL がデータベースの再クエリに使用されます。
$memcache->get('results') はメモリからキャッシュを取り出すことです (memcache はファイル キャッシュではなく、サーバー メモリにキャッシュされます)
memcache を使用したい場合は、次のものが必要ですmemcache 拡張機能を有効にするには、Baidu にアクセスするだけです。

スペースにアップロードすれば、あなたが指摘したコードを追加する必要はありませんね。拡張機能を再度有効にしましょう。サービス プロバイダーが自動的に有効にしているはずです。ありがとうございます。

スペースにアップロードすれば、あなたが指摘したコードを追加する必要はありませんね。拡張機能を再度有効にしましょう。サービス プロバイダーが自動的に有効にしているはずです。ありがとうございます。


通常の状況では、サービス プロバイダーはオンになっています。

ありがとうございます、帰ったら試してみます、ありがとう。

追加しても機能しないようです。ページに何も表示されません。まだいくつか質問があります:
1. 私の理解によれば、ロジックは、まずキャッシュにデータがあるかどうかを判断し、存在する場合はキャッシュからデータを抽出します。データベースから、ECHO、そして $memcache ->set('results', $row); しかし、コードには if else はなく、if のみがあります。
2. $result = mysql_query... や $result1 = mysql_query... など、ページからデータを複数回抽出する必要がある場合、データを抽出するたびにこれらのコードを追加する必要がありますか?それとも、一度設定するだけでその後 get('results')、get('results1')、get('results2') する必要があるページですか?
3. $memcache = new Memcache;
$memcache->connect('memcache host address', 11211); //memcache のデフォルトのポート番号は 11211 です。
この文を追加します。 IncDB.php(データベースの設定にリンクするファイルです)と統一して呼べるでしょうか?
アドバイスありがとうございます。

教えてもらえますか?ありがとう。

これ。 。 。 。 。 。 。

マスターの皆様、お時間のあるときに私に注目してください...

追加した後、ページに何も表示されないようです。まだいくつか質問があります:
1. 私の理解によれば、ロジックは、まずキャッシュにデータがあるかどうかを判断し、存在する場合はキャッシュからデータを抽出します。データベースから、ECHO、そして $memcache ->set('results', $row); しかし、コードには if else はなく、if のみがあります。
2. $result = mysql_query... や $result1 = mysql_query... など、ページ内でデータを複数回抽出する必要がある場合、データを抽出するたびにこれらのコードを追加する必要がありますか?それとも、一度設定するだけでその後 get('results')、get('results1')、get('results2') する必要があるページですか?
3. $memcache = new Memcache;
$memcache->connect('memcache host address', 11211); //memcache のデフォルトのポート番号は 11211 です。
この文を追加します。 IncDB.php(データベースの設定にリンクするファイルです)と統一して呼べるでしょうか?
アドバイスありがとうございます。


1. else{ $row = $memcache->get('results'); }
2. データを抽出するたびに、これらのコードを追加する必要があります。まずはキャッシュ。
3. Memcache はキャッシュ拡張機能であり、データベース構成に含める必要はありません。

哥 啊,是在代码的最后,加上else{ $row = $memcache->get('results'); }就可以了?系统配置是什么?我的就是这个页面,如果不把那些代码($memcache = new Memcache;
$memcache->connect('memcache主机地址', 11211);)放在一个文件里调用,如IncDB.php,我每次都得再写啊。我没有专门的系统配置页面。

使用 memcache 需要安装 memcached 服务器和与 php 版本对应的 php_memcache 扩展

如果是全局使用,那么
$memcache = new Memcache;
$memcache->connect('memcache主机地址', 11211);
只需写一次,当然可以写在嵌入文件中
但你并不能保证不会在函数里使用

其实你的核心问题还是我一开始就提出的:你如何知道内容发生的变化
如果你不解决这个问题,什么其他技术手段的是枉然的

哥 啊,是在代码的最后,加上else{ $row = $memcache->get('results'); }就可以了?系统配置是什么?我的就是这个页面,如果不把那些代码($memcache = new Memcache;
$memcache->connect('memcache主机地址', 11211);)放在一个文件里调用,如IncDB.php,我每次都得再写啊。我没有专门的系统配置页面。


既然没有配置文件,那就放到IncDB.php里就好了。
<?phpinclude("IncDB.php"); session_start () ;//使用memcache对象$memcache = new Memcache;$memcache->connect('memcache主机地址', 11211); //memcache默认端口号是11211if(($row = $memcache->get('results')) == false){		//缓存里没有得到results,则去数据库查询	$result = mysql_query("SELECT * FROM userlinks where id='a02' and userid=‘".$_SESSION['id']."’ order by datetime desc", $link);	$row = mysql_fetch_row($result);	mysql_close($link); 	$memcache->set('results', $row); //查询数据库之后再放入缓存}echo "$row[1]"; echo"<br>"; echo "$row[2]";?>
ログイン後にコピー

使用 memcache 需要安装 memcached 服务器和与 php 版本对应的 php_memcache 扩展

如果是全局使用,那么
$memcache = new Memcache;
$memcache->connect('memcache主机地址', 11211);
只需写一次,当然可以写在嵌入文件中
但你并不能保证不会在函数里使用

其实你的核心问题还是我一开始就提出的:你如何知道内容发生的变化
如果你不解决这个问题,什么其他技术手段的是枉然的


是用户在EDIT页面,修改数据后,该内容才会发生变化。也就是说,我可以写在IncDB.php文件里调用就可以了?谢谢!

谢谢两位大神。。。我试试。

memcached 的内容是保存在内存中的,因此系统重启后,缓存的内容都会消失。
所以仅在修改的时候写缓存是不够的

那有办法么?我的初衷就是想提高网页响应速度,memcached能够实现么?

另外,如果我有1万个用户,那么在服务器上就得要存1万套数据?不知是否理解正确。我觉得能存在客户端最好,但不知怎么把一条条数据存在客户端并读取。

要做缓存,肯定要考虑更新数据的情况,比如你说的用户有可能修改资料。 你在程序里,就在用户修改资料后,把相应的缓存删掉就行了。

谢谢楼上的提示。
我崩溃了,就是不行,也没有报错。我是这么写的

include("IncDB.php");
session_start () ;
$memcache = new Memcache;
$memcache->connect('localhost',11211) or die("链接失败!");
if(($row = $memcache->get('results')) == false){
 $result = mysql_query("SELECT * FROM userlinks where id='a02' and userid='".$_SESSION['id']."' order by datetime desc ", $link);
    $row = mysql_fetch_row($result);
 echo "$row[1]"; 
echo"
"; 
echo "$row[2]";
    $memcache->set('results', $row); 
 mysql_close($link);}
else{ $row = $memcache->get('results'); 
echo "$row[1]"; 
echo"
"; 
echo "$row[2]";}

?> 

ヒントをありがとう。
私は失敗しましたが、エラーは報告されませんでした。これは私が書いたものです

include("IncDB.php");
$memcache = new Memcache-> ;connect('localhost',11211) または die("リンクに失敗しました!");
if(($row = $memcache->get('results')) == false){
$result = mysql_query("SELECT * FROM userlinks where id='a02' and userid='".$_SESSION['id']."' order by datetime desc ", $link); );
echo "$row[1]";
echo"$row[2]"; , $row);
mysql_close($link);}
else{ $row = $memcache->get('results');
echo "$row[1]"; echo "
";
echo "$row[2]";}

?>

トラブルシューティングのために、プログラム内のさまざまな場所にある可能性のあるエラー変数を出力します。面倒な手続き。

帰ってくるのがそんなに遅いのですか?ありがたい。私はどうやって書くのかと弱々しく尋ねました。水の量は聞かないでください~~~

帰りがそんなに遅いのですか?ありがたい。私はどうやって書くのかと弱々しく尋ねました。どれくらい濡れているかは聞かないでください~~~
var_dump() を使って出力してください。 。 。つまり、この memcache キャッシュに関する情報は自分で見つけたり、他の人のブログを読んで学んだりすることができます。 。 。

この質問に答えられることはありません。その中に記載されているいくつかの重要な内容を学習し、学習中に理解できない点に遭遇したときに再度質問する方が効率的です。次回はこれらの質問をしてみます。

memcache

ファイルキャッシュ

実際に数日間調べて投稿しましたが、まだ理解できませんでした。私の基礎が足りなかったり、理解力が低かったりする可能性があります。 IQは家ではとにかくわかりません。

このように書くと印刷エラーになりますか?

include("IncDB.php");

session_start () ;
$memcache = new Memcache
$memcache->connect('localhost; ',11211) または die("リンクに失敗しました!");
if(($row = $memcache->get('results')) == false){
$result = mysql_query("SELECT * id='a02' および userid='".$_SESSION['id']."' のユーザーリンクから日時の記述で並べ替えます ", $link);
$row = mysql_fetch_row($result);
var_dump($row)
echo "$row[1]";
echo "$row[2]"; 'results', $row);
mysql_close($link);}
else{ $row = $memcache->get('results');
echo "$row[1]";
echo "
";
echo "$row[2]"
var_dump($row)}

?>プログラムをデバッグして、より多くのポイント
を出力するときは、プログラムの実行結果を提供する必要がありますよね?

xuzuning そうですね、私の現在の雇用主はスペースにページをアップロードできないため、デバッグの結果はまだわかりません。また、余分な印刷ポイントを含むコードは正しいですか?
あと、おっしゃる戦略は確かに問題があると思いますし、データをクライアントに保存できれば一番良いのではないかとも思います。私の各ページは非常にシンプルで小さいですが、コンテンツは表示のためにデータベースから抽出されます。通常、各ユーザー ページに表示されるコンテンツは、ユーザーが変更したときにすぐに変更されることを除いて、あまり変更されません (おそらく数回)。毎月少しずつ変わります)。データベースからデータを取得するたびに時間がかかるため、各ユーザーのデータをクライアントにキャッシュし、変更時にキャッシュを更新できればと考えました。それが達成できるかどうかはわかりません。さらに、これらのページはローカルでテストしたときは非常に高速でしたが、スペースがアップロードされると遅すぎて使用できませんでした。

PhpNewnew の話に戻りますが、実は私も 1 週間以上キャッシュについていろいろ勉強しているのですが、よくわかりません。他人に迷惑ばかりかけるのが良くないことも分かっています。心配しないでください、まだ習っていなくても間に合います。ご心配いただきありがとうございます。



memcache は使用できません。このキャッシュ技術は使用できません。ここにいます。

サーバー ファイルにキャッシュして時間を指定するのが最善です。その後、ユーザーが変更を行うたびに、時間も記録されます。時間が正しくない場合は、再度キャッシュします。

これがコンセプトです。 。

実際、現在の問題は、開くのが遅いことです。これは、当面はキャッシュを必要としません。データテーブルにインデックスを追加すると、非常に速く開きます。

この投稿を見ました http://www.2cto.com/kf/201407/319353.html
データはクライアント側で保存および読み取りできることは上で述べられているようです。それが可能かどうかは分かりません。

まずはコンセプトを明確にしてください!ローカルは相対的な概念です:
ブラウザが php ウェブサイトにアクセスするとき、ブラウザが存在するマシンはローカルです
php がデータベース サーバーにアクセスするとき、php が存在するマシンはローカルです
あなたが提供した接続はありません クライアントへのデータのキャッシュについては言及されていません (もちろん、データベースと比較すると、PHP もクライアントです)

ページをクライアントのブラウザ バッファにキャッシュしたい場合は、次のようにします。クライアントが再度アクセスしたときにキャッシュする必要があるだけです。304 ヘッダーを送信するだけです。
もちろん、データが変更されたかどうかを知る必要があります。したがって、問題は原点に戻ります。 内容の変更をどのようにして知ることができますか
この問題が解決されて初めて、技術的手段を使用することが可能になります

ユーザーがコンテンツを変更すると、コンテンツが変更されます。牛にピアノを弾いているような気持ちはわかりますが、私は本当に落ち込んでいて、どうすることもできません。申し訳ありません
角度を変えると、私の本来の要件は、データを取得するために毎回データベースにアクセスする必要がなく、応答速度を向上させることです。何か提案はありますか?ありがとう、神様。

1. まず、memcache の簡単な例を作成します。これに慣れたら、自分のコードに適用できます。

2. 一つ言及しておきたいのは、memcache には有効期限があるということです。有効期限を設定すると、そこに保存されるデータがどんどん大きくなるのを心配する必要はありません。

3. 一般的な考え方:
a. データが更新されるたびに、memcached にアクセスして確認し、存在しない場合は何も実行しません。 。
b. データにアクセスするたびに、まず memcahced にアクセスして確認し、存在する場合は直接使用し、データベースから取得して memcached に保存します。

4. Memcached には小さな欠点があり、データ型は単一であり、データはハードディスクに書き込まれません。このようなニーズがある場合は、redis を検討することをお勧めします。 Redis にはマスター/スレーブ バックアップもあります。
redis の使用方法については、ポイント 1 ~ 3 を参照して、memcached を redis に変更してください。

まだ覚えてないので諦めました!皆さん、ありがとうございました。 。 。 。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート