1. ما هو التخزين المؤقت لـ ASP/لماذا يجب تخزينه مؤقتًا؟ عندما يتم إنشاء موقع الويب الخاص بك في البداية باستخدام تقنية ASP، قد تشعر بالراحة التي توفرها تقنية صفحات الويب الديناميكية لـ ASP، بالإضافة إلى حرية التعديل والتحكم المجاني في http. ومع ذلك، مع زيادة عدد الزيارات، ستجد بالتأكيد أن سرعة الوصول إلى موقعك أصبحت أبطأ وأبطأ، ويتم إعادة تشغيل IIS بشكل متكرر أكثر فأكثر. بعد ذلك، يجب أن ترغب في تحسين asp، مثل استبدال قاعدة البيانات بأداء أفضل، وإنشاء الفهارس، وكتابة الإجراءات المخزنة، وما إلى ذلك. لا تتطلب بعض هذه التدابير زيادة ضغط التكلفة، بينما يتطلب البعض الآخر ضغطًا كبيرًا على التكلفة (مثل الوصول التجميعي إلى SQL)، ولا يكون التأثير مؤكدًا بالضرورة.
في مواجهة ضغط الوصول إلى الويب، أعتقد أن الطريقة الأكثر اقتصادا هي استخدام تقنية تحسين ذاكرة التخزين المؤقت لتخفيف ضغط خدمة الويب.
غالبًا ما تعني زيادة حركة المرور على الويب نموًا سريعًا في الطلب على الموارد التالية:
1. تتطلب الزيادة في حركة مرور بطاقة الشبكة المزيد من وحدة المعالجة المركزية (CPU) لمعالجة حركة مرور الشبكة وخيوط الإدخال / الإخراج للشبكة.
2. الحاجة إلى فتح/إغلاق اتصالات قاعدة البيانات بشكل متكرر (في حالة استخدام تقنية قاعدة البيانات - عادةً ما يستخدم ASP قواعد البيانات كمخزن للبيانات)، وعدد الأشياء التي تستهلك الموارد بشكل خطير، والتوقف التام الناجم عن المعاملات المتنافسة على الموارد سيؤدي إلى زيادة I/الشبكة يا أو استهلاك وحدة المعالجة المركزية.
3. إذا تم استخدام الجلسة، فسوف يستهلك IIS المزيد من الذاكرة من أجل الحفاظ على الحالة، وقد يتسبب استهلاك الذاكرة في عدم كفاية الذاكرة الفعلية، مما يتسبب في التبادلات المتكررة بين الذاكرة الفعلية والذاكرة المساعدة، مما يتسبب في إيقاف تنفيذ التعليمات البرمجية مؤقتًا وحظر استجابة الويب. .
4. بسبب عدم الاستجابة للوصول في الوقت المناسب، سيؤدي ذلك إلى فشل الوصول إلى صفحة الويب، مما يتسبب في تحديث المستخدمين، وبالتالي تفاقم الطلب على الموارد مثل وحدة المعالجة المركزية والذاكرة.
في الواقع، بالنظر إلى تطبيقات الويب الشائعة، يكون تنفيذ التعليمات البرمجية الديناميكية غير ضروري في كثير من الأحيان.
2. يمكن تلخيص تصنيف ذاكرة التخزين المؤقت لـ ASP دون إذن، ويمكن تقسيمها إلى فئتين:
1. يعتمد ما يسمى بالتخزين المؤقت للملفات على الحكم المنطقي بأن التنفيذ المحدد لـ ASP معين لن يتغير بشكل كبير خلال فترة زمنية، لذلك يتم تخزين المحتوى في شكل HTML ثابت، ثم يتم تخزينه تُستخدم تقنية إعادة توجيه الويب للسماح للعملاء بالوصول الشامل إلى الملفات الثابتة لتقليل الحاجة إلى وحدة المعالجة المركزية وموارد قاعدة البيانات وما إلى ذلك. هناك العديد من هذه التطبيقات، على سبيل المثال، تقوم العديد من المنتديات بإعادة إنشاء المنشور بالكامل إلى ملف ثابت عند الرد على منشور، ثم إعادة توجيهه، مثل منتدى donews.com. هناك أيضًا تأثير جانبي (فائدة) لكونه ثابتًا - حيث يمكن فهرسته بسهولة بواسطة محركات البحث مثل Google. وقد اعتمدت بعض ما يسمى بأنظمة النشر الإخباري هذه التقنية.
2. يعتمد ما يسمى بالتخزين المؤقت لأجزاء الملف أيضًا على الحكم المنطقي. لن يتغير جزء معين من البيانات (يتم الحصول عليه عادةً عن طريق الاستعلام عن قاعدة بيانات كبيرة السعة وتستهلك الموارد) خلال فترة زمنية معينة. يمكننا تخزين هذه البيانات على شكل ملفات، وعند الحاجة يمكن الحصول على البيانات من خلال قراءة الملفات لتجنب زيادة العبء على قاعدة البيانات. على سبيل المثال، نقوم عادةً بتخزين بعض البيانات بتنسيق XML، ثم نستخدمها هذه هي الطريقة التي يتم بها التعامل مع منتدى CSDN.
3. ذاكرة التخزين المؤقت للذاكرة الرئيسية بالإضافة إلى ذلك، يمكنك أيضًا التفكير في التخزين المؤقت في الذاكرة، وتخزين المحتوى الذي يتطلب الاستجابة في الوقت المناسب في الذاكرة، وبمجرد الحاجة إلى الوصول، سيتم نقله على الفور من التخزين السريع. إذا كان هناك عدد كبير جدًا من متطلبات الوصول مركزة على بضع صفحات صغيرة أو إذا كانت الذاكرة الرئيسية كبيرة بما يكفي، فأعتقد أن استخدام التخزين المؤقت للذاكرة الرئيسية يمكن بالتأكيد تحسين أداء الوصول إلى الويب بشكل كبير.
3. كيفية تنفيذ/استخدام ذاكرة التخزين المؤقت لتنفيذ ذاكرة التخزين المؤقت، عليك مراعاة المشكلات التالية:
1. ما هي الصفحات التي لن تتغير خلال فترة زمنية قصيرة؟
قم بتحليل موقعك الخاص، هناك العديد من هذه الصفحات. على سبيل المثال، عادةً ما يحتوي موقع الويب على أعمدة أخبار ومعلومات، وعادةً ما يتم نشر هذه الأعمدة بواسطة القائمين على الموقع في وقت معين من اليوم، ونادرًا ما يتم تغيير الصفحات بعد ذلك. إذن هذه الصفحات مناسبة للتخزين المؤقت للملفات الثابتة. في الواقع، هذا ما يفعله ما يسمى بنظام النشرات الإخبارية، لذا يمكنك أيضًا الرجوع إلى أفكار هذه الأنظمة لتحويل صفحات ASP الديناميكية الأصلية الخاصة بك.
2. يتم إنشاء تلك الصفحات بنفس المنطق لجميع الزوار (أي لا يتم تمييز الزوار).
بالإضافة إلى أعمدة مثل الأخبار والمعلومات حيث يرى جميع الزوار نفس الواجهة، يمكن بشكل عام تصميم التطبيقات المستهلكة للموارد مثل المنتديات لإنشاء منطق موحد (سيتم عرض نفس المنشور بنفس الطريقة من قبل ثلاثة أشخاص وثلاثة أشخاص). صفحات التطبيقات هذه، يمكننا أيضًا تحقيق ذلك باستخدام التخزين المؤقت الثابت. يمكنك أيضًا التفكير في تجزئة البيانات واستخدام تقنية البرمجة النصية لمعالجتها بما يتجاوز قدرات المعالجة الخاصة بالخادم، أي متصفح العميل.
3. تكاليف ومكاسب استخدام التخزين المؤقت.
الشيء الرئيسي هو "مساحة لوقت (الاستجابة)". استخدم تقنية التخزين المؤقت للمعالجة المسبقة للمحتوى المطلوب بشكل متكرر في المستقبل لتحسين استجابة خادم الويب، والأهم من ذلك، كسب استحسان الزوار.
والثمن هو أن الطلب على مساحة الويب يزداد، وفي الوقت نفسه، قد يتأثر تأثير الوصول.
لكنني أعتقد أن التخزين المؤقت المناسب له مزايا أكثر من عيوبه.
4. هذه الأماكن غير مناسبة للتخزين المؤقت لصفحات الاستعلام الديناميكية. يختلف محتوى الاستعلام لكل شخص، لذا فإن نتائج العرض مختلفة، لذلك من المستحيل تخزين نتائج الاستعلام مؤقتًا، لذلك يكون التخزين المؤقت أكثر تعقيدًا ومعدل استخدام ذاكرة التخزين المؤقت منخفض. التسبب في مشاكل إدارية والتكلفة مرتفعة (على افتراض أنك قمت بتخزين 1000 كلمة رئيسية للاستعلام، فإن إدارة المراسلات بين هذه الكلمات الرئيسية وذاكرة التخزين المؤقت أمر مزعج أيضًا).
4. تحليل المثال افترض أن التصميم الأصلي لمنتدى الاقتراحات هو كما يلي:
ضمن الدليل الجذر:
الصفحة الرئيسية default.asp، وعادةً ما يتم عرض النقاط البارزة والتوصيات وما إلى ذلك.
listBorad.asp يسرد هذا الملف أسماء ومقدمات كافة الأعمدة إذا كان يحمل المعلمة MainBID، فهذا يعني أنه سيتم إدراج الأعمدة الموجودة أسفل القسم.
listThread.asp إذا كان هذا الملف لا يحمل أي معلمات، فهذا يعني إدراج جميع المشاركات، وإذا كان يحمل MainBID، فهذا يعني إدراج جميع المشاركات في كتلة معينة. إذا تم حمل معرف فرعي، فهذا يعني إدراج المشاركات في أعمدة محددة. إذا تم تنفيذ معلمة الصفحة، فسيتم إدراج المواضيع في الصفحات.
يسرد ViewThread.asp محتوى المنشور. نفترض أن يتم عرض المنشور كتعليق، ويتم إدراج أي تعليقات في النهاية. معلمة المعرف هي المنشور الذي سيتم عرضه.
الرد.asp يستجيب لنشر معين ويحمل معرف المعلمة للرد على نشر معين ولن تتم مناقشة الباقي في الوقت الحالي.
مما سبق، يمكننا أن نرى أنه إذا تم كل شيء باستخدام ASP/PHP الأصلي، فإن تنفيذ كل ملف asp تقريبًا يتطلب عمليات قاعدة بيانات واستعلامات متكررة واستعلامات متعددة الجداول. يجب أن تعلم أن الاستعلام عن قاعدة البيانات سيؤدي في النهاية إلى انخفاض الأداء وسرعة الاستجابة، مما سيؤثر على تصفح الزوار البطيء ولا يؤدي إلى جودة الويب. والأهم من ذلك هو أنه بالنسبة لشخصين، A وB، إذا تمكنا من الوصول إلى ViewThread.asp وما شابه، وإذا كان المعرف هو نفسه، فسيشاهدان نفس المحتوى في كثير من الأحيان (رمز HTML الذي تتلقاه متصفحاتهما هو تقريبًا نفس المحتوى) نفسه)، ولكن بالنسبة لهذا "نفس المحتوى"، يحتاج الخادم إلى فتح اتصالات قاعدة البيانات والاستعلامات وقراءة السجلات وعرض وإغلاق السجلات واتصالات قاعدة البيانات. . . . إذا قام عدد أكبر من الأشخاص بالوصول إلى العمليات التالية التي تستهلك موارد الخادم، فستكون النتيجة النهائية هي أن هؤلاء الأشخاص يستهلكون موارد الخادم بشكل أكبر. في الواقع، يمكن تجنب هذه الجهود المتكررة من أجل "نفس المحتوى" عن طريق استخدام تقنية التخزين المؤقت للتحسين. على سبيل المثال:
بعد إرسال المحتوى في Response.asp، نستدعي على الفور الوظيفة الثابتة ونخزن محتوى المنشور بالكامل كملف html ثابت مثل viewThread_xxxx.htm في الظروف العادية، عند الوصول إلى viewThread.asp?ID=xxxx، يقوم النظام تلقائيًا بإعادة التوجيه إلى الملف الثابت المطابق viewThreadxxxx.htm. بهذه الطريقة، عندما لا يحتوي المنشور على أحدث إصدار، سيكون دائمًا محتوى ثابتًا مقدمًا للمشاهدين؛ بمجرد وجود إرسال جديد، سيتم تحديثه إلى الملف الثابت، وبهذه الطريقة، سيتم حفظ العديد من عمليات قاعدة البيانات وسيتم تحسين الاستجابة بشكل كبير.
يمكن أيضًا تنفيذ listBorad.asp بشكل ثابت. يمكننا تحليل المعلمات التي قد يحملها، وتعيين اسم ملف ذاكرة التخزين المؤقت إلى listBoard_xx.htm، وتحديث listBoard_xxx.htm عند إضافة أعمدة جديدة. يشبه listThread.asp، إلا أنه نظرًا لاحتوائه على المزيد من المعلمات، سيكون هناك الكثير من ملفات ذاكرة التخزين المؤقت. إذا كنت تريد تخزين listThread.asp مؤقتًا subBID=xxx&page=2، فإن الملف الثابت المقابل هو listThread_xxx_p2.htm. الشيء نفسه ينطبق على default.asp.
إذًا كيف يمكنك معرفة متى يتم التحديث؟ متى سيتم تحديثه؟
عند مناقشة listThread.asp؟ subBID=xxx&page=2، نقوم باستخراج المعرف الفرعي والصفحة عند تنفيذ listThread.asp، ثم نكتشف ما إذا كان listThread_xxx_p2.htm موجودًا، وإذا لم يكن موجودًا، فاستدعاء وظيفة التوليد الثابتة لإنشاء الملف، وأخيرًا إعادة التوجيه هنا ملفات ثابتة. لاحظ أن الغياب هنا يعني أن هناك محتوى جديد يحتاج إلى التحديث.
فكيف تتسبب في عدم وجود الملف؟ يمسح. عندما ننشر منشورًا جديدًا، أو نحذف منشورًا، أو ننقل منشورًا، يمكننا حذف جميع الملفات الثابتة مثل listThread_xxx_p2.htm. يخبرك هذا بموعد التخزين المؤقت.
الآن بقي سؤال واحد، كيفية إنشاء ملفات ثابتة؟
ونلاحظ أن "نفس المحتوى" الذي ذكرناه من قبل. يمكننا عمل نسخة من default.asp، وlistThread.asp، وما إلى ذلك قبل التحويل، باسم default_d.asp، وlistThread_2.asp، وفي نفس الدليل (من الناحية النظرية، listThtrad.asp?subID=123 هو نفسه LISTtHREAD_D.ASP (ستكون نتيجة الوصول لـ SUBID=123 هي نفس المحتوى)، لذلك في المنطق الذي يحتاج إلى إنشاء ملفات ثابتة، نستدعي النسخة قبل التحويل من خلال طلب الوصول إلى الويب، ونحصل على كود html، ونخزنه كملف ثابت. إن طلب الويب هذا يعادل في الواقع قيام الخادم نفسه بعرض HTML الذي سيتم إخراجه قبل أن يصل أي متصفح حقيقي إلى المحتوى الثابت، ثم يقوم بإرجاع هذه الرموز وتخزينها كملفات ثابتة باستخدام وظيفة تشغيل الملف. بهذه الطريقة، يتم إنشاء ملف ذاكرة التخزين المؤقت قبل العارض الحقيقي.
من الصعب أن يمس هذا الحل التصميم الأصلي، ولن يتسبب أبدًا في حدوث أخطاء مثل 404 بسبب التعديل. ثانيًا، ستساعد الملفات الثابتة أيضًا على فهرسة موقعك بسهولة بواسطة محركات البحث مثل Google. ولم لا؟
أخيرًا، تذكير، من خلال الوصول إلى الويب، في بيئة برمجة ASP، يستخدم العديد من الأشخاص مكون xmlHTTP للوصول، مما سيؤدي إلى العديد من المشكلات. سيقوم xmlhttp نفسه بتخزين الموارد المطلوبة مؤقتًا، مما يجعل المحتوى الذي نطلبه من خلال هذا المكون ليس الأحدث، مما يسبب ارتباكًا منطقيًا. لذلك، يجب عليك اختيار كائن http لخادم xml أو مكون winhttp لتنفيذ موارد طلب الويب.
يمكن أن يؤدي استخدام تقنية التخزين المؤقت في ASP إلى تحسين أداء موقع الويب الخاص بك بشكل كبير، وفي الواقع، فإن طرق التنفيذ هذه بسيطة جدًا، وسوف تشرح كيفية عمل التخزين المؤقت على الخادم وكيف يمكنك استخدام طريقة تسمى تقنية اتصال ADO.
قبل تقديم هذه التقنيات، دعونا نشرح بالضبط ما هي تقنية التخزين المؤقت لـ ASP.
إن ما يسمى بذاكرة التخزين المؤقت هو في الواقع فتح مساحة في الذاكرة لحفظ البيانات. باستخدام ذاكرة التخزين المؤقت، لا تحتاج إلى الوصول بشكل متكرر إلى البيانات التي تحفظها على القرص الصلب، يمكنك تجنب ذلك الضيق الناتج عن مشاهدة القرص الصلب المسكين ممتلئًا أشعر بالتعذيب من خلال قراءة البيانات. بمجرد تنفيذ استعلام ووضع نتائج الاستعلام في ذاكرة التخزين المؤقت، يمكنك الوصول بسرعة إلى البيانات بشكل متكرر. وإذا لم تقم بوضع البيانات في ذاكرة التخزين المؤقت، فعند تنفيذ الاستعلام مرة أخرى، سيقضي الخادم العملية في الحصول عليها وفرزها من قاعدة البيانات.
عندما يتم تخزين البيانات في ذاكرة التخزين المؤقت، فإن الوقت المستغرق في الاستعلام مرة أخرى هو بشكل أساسي وقت عرض البيانات.
بمعنى آخر، لا ينبغي لنا أن نضع البيانات التي تحتاج إلى التغيير بشكل متكرر في ذاكرة التخزين المؤقت للخادم، بل يجب أن نضع البيانات التي تتغير بشكل أقل ولكن يجب الوصول إليها بشكل متكرر في ذاكرة التخزين المؤقت.
سنناقش الآن كيفية استخدام ASP لتقنية التخزين المؤقت من جانب الخادم، ثم سنناقش كيفية استخدام ASP لتقنية التخزين المؤقت من جانب العميل.
عندما يكون لديك كمية كبيرة من البيانات (الثابتة، أي أقل تغييرًا) التي تحتاج إلى عرضها للعميل، يمكنك التفكير في استخدام تقنية التخزين المؤقت من جانب الخادم. هذه التقنية مناسبة بشكل خاص لمواقع الويب ذات الاتساق القوي في أسلوب العرض (هاها، ليس من السهل استخدامها لمواقع الويب غير السائدة.)
في الواقع، طريقة التنفيذ بسيطة للغاية، ما عليك سوى إلقاء نظرة على المثال البسيط أدناه لفهمه.
هذا برنامج مثال لعرض فئات الكتب
ملف DisplayBooks.ASP:
< %@ LANGUAGE=JavaS
البرنامج النصي٪>
<أتش تي أم أل>
<الجسم>
<طريقة النموذج=النشر>
تصنيف الكتاب؛ < %= getBooksListBox() % >
<ص>
<نوع الإدخال=إرسال>
<%
الدالة getBooksListBox()
{
BooksListBox = التطبيق("BooksListBox")
if (BooksListBox != null) return BooksListBox;
crlf = String.fromCharCode(13, 10)
BooksListBox = "<select name=Books>" + crlf;
SQL = "اختر * من الكتب أو اطلب حسب الاسم"؛
cnnBooks = Server.CreateObject("ADODB.Connection");
cnnBooks.Open("كتب"، "المسؤول"،"")؛
rstBooks = cnnBooks.Execute(SQL);
fldBookName = rstBooks("BookName");
بينما (!rstBooks.EOF){
BooksListBox = BooksListBox + ” < option>” +
fldBookName + "" + crlf;
rstBooks.MoveNext();
}
BooksListBox = BooksListBox + ""
Application("BooksListBox") = BooksListBox
إرجاع BooksListBox؛
}
%>
الأمر بسيط للغاية، في الواقع، يستخدم تقنية تطبيقية بسيطة للغاية، والفرق هو جملة واحدة فقط:
Application("BooksListBox") = BooksListBox
يمكنك التحقق من ذلك وستجد أن عدد الطلبات على الخادم سينخفض كثيرًا. هذا الوضع مناسب بشكل خاص لمحتوى موقع الويب الذي لا يتم تحديثه بشكل متكرر، على سبيل المثال، تقوم بتحديثه مرة واحدة فقط في اليوم (أو لفترة طويلة).
بعد ذلك، سنناقش تقنية التخزين المؤقت من جانب العميل، وتسمى هذه التقنية أيضًا تقنية اتصال ADO غير المتصلة (مستوى الترجمة منخفض جدًا، لماذا يبدو الأمر محرجًا للغاية). تُستخدم هذه التقنية بشكل أساسي لحفظ المعلومات الشخصية للمستخدمين، مثل كلمات مرور المستخدم وأسماء الرموز وما إلى ذلك. يستخدم بشكل أساسي بعض خصائص ADO. وفي الوقت نفسه، يجيب أيضًا على السؤال الذي ذكره بعض مستخدمي الإنترنت حول ما إذا كان يمكن استخدام كائنات ADO في Applocation. الشرح غير واضح، دع الكود يتكلم:
الملف GLOBAL.ASA:
< !–نوع بيانات التعريف=”TypeLib” FILE=”C:Program FilesCommon
ملفاتنظامadomsado15.dll”–>
< لغة البرنامج النصي=VBScript RUNAT=”الخادم” >
التطبيق الفرعي_OnStart
SQL = "اختر اسم المستخدم وكلمة المرور من معلومات المستخدم"
cnnUsers = "DSN = المستخدم"
تعيين rsUsers = Server.CreateObject("ADODB.Recordset")
'لاحظ أنه يتم استخدام الجملتين التاليتين لتنفيذ تقنية ADO التي تسمى قطع الاتصال المتاح.
rsCustomers.CursorLocation = adUseClient
rsCustomers.Open SQL، cnnAdvWorks، adOpenStatic، AdLockReadOnly
'افصل مجموعة السجلات عن قاعدة البيانات
rsCustomers.ActiveConnection = لا شيء
تعيين التطبيق("rsCustomers") = rsCustomers
نهاية الفرعية
FileUsers.ASP
<%
تتيح طريقة الاستنساخ لكل مستخدم أن يكون لديه مجموعة RecordsSet الخاصة به
قم بتعيين yourUsers = Application("rsUsers").Clone
تعيين اسم المستخدم = yourUsers("اسم المستخدم")
تعيين كلمة المرور = yourUsers("كلمة المرور")
افعل حتى yourUsers.EOF
%>
اسم المستخدم: < %= اسم المستخدم % > كلمة مرور المستخدم: < %= كلمة المرور % >
<%
yourUsers.MoveNext
حلقة
%>