سلسلة محاضرات ASP (9) تحديد نطاق الكائن
الكاتب:Eve Cole
وقت التحديث:2009-05-30 19:59:07
يحدد نطاق الكائن البرامج النصية التي يمكنها استخدام الكائن. بشكل افتراضي، عند إنشاء مثيل كائن، يكون للكائن نطاق صفحة. يمكن لأي أمر برنامج نصي داخل نفس صفحة ASP استخدام الكائن ضمن نطاق الصفحة؛ ويتم تحرير الكائن عند إرسال صفحة ASP مرة أخرى إلى العميل. بالنسبة لمعظم الكائنات، النطاق الموصى به هو نطاق الصفحة. يمكنك تغيير نطاق الكائن بحيث يمكن استخدامه بواسطة البرامج النصية على الصفحات الأخرى. يشرح هذا الموضوع كيفية استخدام الكائنات ضمن نطاق الصفحة وكيفية تغيير نطاق الكائن.
استخدام كائنات نطاق الصفحة الكائنات التي تم إنشاؤها باستخدام Server.CreateObject على صفحة ASP موجودة طوال عمر الصفحة. يمكن الوصول إلى الكائن من خلال أي أوامر برنامج نصي للصفحة ويتم تحريره عندما ينتهي ASP من معالجة الصفحة. لذلك، يحتوي الكائن على نطاق الصفحة أو مدة بقائها.
عند البرمجة باستخدام Visual Basic أو VBScript، احرص على عدم تحرير الكائن حتى ينتهي ASP من معالجة الصفحة. على سبيل المثال، غالبًا ما يتم استخدام العبارة التالية لتحرير كائن عن طريق تعيين قيمة لا شيء لمتغير الكائن:
اضبط myObj = لا شيء
إذا قمت بتضمين هذا البيان في صفحة ASP، فإن أي محاولة لاستخدام myObj ستؤدي إلى إرجاع رمز خطأ متوقع. ولكن داخليًا، لا يزال ASP يحتفظ بمرجع إلى الكائن حتى بعد إصداره. عندما لا تتمكن من استخدام كائن في برنامج نصي، لا يتم تحرير موارد الكائن حتى ينتهي ASP من معالجة الصفحة. وبالمثل، إذا قمت بتحرير الكائن عن طريق إنشاء مثيل كائن آخر وتعيينه لمتغير كائن تم استخدامه بالفعل، يحتفظ ASP بمرجع إلى مثيل الكائن الأصلي. بالنسبة لمعظم البرامج النصية، قد لا يتسبب إنشاء كائنات متعددة في حدوث مشكلات، ولكن إذا كانت الكائنات تستخدم موارد مشتركة، مثل اتصالات قاعدة البيانات، فقد تنشأ مشكلات.
نظرًا لأن الكائنات لها نطاق صفحة، فلا تعتمد على تحرير الكائنات يدويًا. على سبيل المثال، تقوم الحلقة التالية بإنشاء كائنات اتصال 1001، والتي ستكون قادرة على فتح معظم الاتصالات حتى مع خادم SQL كبير:
<%
لأني = 0 إلى 1000
تعيين Conn = Server.CreateObject("ADODB.Connection")
Conn.فتح "سلسلة الاتصال"
التالي
%>
بشكل عام، يجب أن تحاول تجنب إنشاء كائنات داخل الحلقة. إذا كان لا مفر منه، فيجب عليك تحرير الموارد التي يستخدمها الكائن يدويًا. إذا تم إنشاء كائن الاتصال مرة واحدة فقط، وتم فتح وإغلاق الاتصال الفعلي بمورد البيانات في كل حلقة، فسيعمل المثال أعلاه بشكل طبيعي:
<%
تعيين Conn = Server.CreateObject("ADODB.Connection")
لأني = 0 إلى 1000
Conn.فتح "سلسلة الاتصال"
كون.إغلاق
التالي
%>
إعطاء نطاق جلسة الكائنات في التطبيق، يتم إنشاء كائن نطاق الجلسة لكل جلسة جديدة ويتم تحريره بعد انتهاء الجلسة. ولذلك، يوجد كائن واحد لكل جلسة عمل نشطة. يتم استخدام نطاق الجلسة للكائنات التي يتم استدعاؤها من نصوص برمجية متعددة، ولكنها تؤثر فقط على جلسة مستخدم واحدة. يمكنك إعطاء نطاق جلسة الكائن فقط عند الحاجة. إذا كنت بحاجة إلى استخدام نطاق الجلسة، فيجب عليك فهم نموذج الترابط للمكون الذي يوفر الكائن، لأنه يؤثر على الأداء وبيئة الأمان الخاصة بالكائن. لمزيد من المعلومات، راجع "معلومات متقدمة: مشكلات الأداء" في هذا الموضوع.
لإعطاء نطاق جلسة عمل الكائن، قم بتخزين الكائن في الكائن المضمن لجلسة ASP. يمكنك إما استخدام العلامة <OBJECT> في الملف Global.asa أو استخدام أسلوب Server.CreateObject على صفحة ASP لإنشاء جلسة- كائن النطاق.
في الملف Global.asa، يمكنك استخدام العلامة ;OBJECT> التي تعمل على توسيع سمة RUNAT (يجب تعيينها إلى Sever) وسمة SCOPE (يجب تعيينها إلى جلسة العمل). يقوم المثال التالي بإنشاء مثيل على نطاق الجلسة لكائن Ad Rotator:
<OBJECT RUNAT=نطاق الخادم=معرف الجلسة=MyAd PROGID="MSWC.Adrotator">
</الكائن>
بمجرد تخزين كائن في كائن الجلسة، يمكنك الوصول إلى الكائن من أي صفحة في التطبيق. تستخدم العبارة التالية مثيل الكائن الذي تم إنشاؤه بواسطة العلامة <OBJECT> في المثال السابق:
<%= MyAd.GetAdvertisement("addata.txt") %>
على صفحة ASP، يمكنك أيضًا استخدام الأسلوب Server.CreateObject لتخزين الكائنات في كائن جلسة العمل المضمن. يقوم المثال التالي بتخزين مثيل لكائن Ad Rotator في كائن Session.
<% تعيين الجلسة("MyAd") = Server.CreateObject("MSWC.Adrotator") %>
لعرض إعلان، يجب عليك أولاً الحصول على مثيل لكائن Ad Rotator المخزن في كائن الجلسة، ثم استدعاء أسلوب لعرض الكائن:
<% تعيين MyAd = Session("MyAd") %>
<%= MyAd.GetAdvertisement("addata.txt") %>
لا يقوم ASP بإنشاء مثيل لكائن تم تعريفه بواسطة علامة <OBJECT> حتى تتم الإشارة إليه بواسطة أمر برنامج نصي في ملف .asp. يقوم الأسلوب Server.CreateObject مباشرة بإنشاء مثيل للكائن. ولذلك، فمن الأفضل استخدام العلامة <OBJECT> بدلاً من خاصية Server.CreateObject للكائنات ذات نطاق جلسة العمل.
إعطاء نطاق تطبيق الكائن
كائن نطاق التطبيق هو مثيل واحد للكائن الذي يتم إنشاؤه عند بدء تشغيل التطبيق. تتم مشاركة هذا الكائن بواسطة كافة طلبات العميل. فقط في حالات نادرة تحتاج إلى إعطاء نطاق تطبيق الكائن. قد تتطلب بعض الكائنات المساعدة، مثل العدادات وما إلى ذلك، نطاق التطبيق. لكن بشكل عام، يمكنك استخدام البدائل المقترحة في القسم التالي. بالإضافة إلى ذلك، يؤثر نموذج الترابط على الأداء وبيئة سلامة الكائنات (راجع "معلومات متقدمة: مشكلات الأداء" في هذا الموضوع).
لإعطاء نطاق تطبيق كائن وتخزينه في الكائن المضمن في تطبيق ASP، يمكنك إما استخدام العلامة <OBJECT> في الملف Global.asa أو إنشاء نطاق التطبيق باستخدام الأسلوب Server.CreateObject على مثيل كائن صفحة ASP .
في الملف Global.asa، يمكنك استخدام العلامة ;OBJECT> التي تعمل على توسيع سمة RUNAT (يجب تعيينها إلى Sever) وسمة SCOPE (يجب تعيينها إلى جلسة العمل). في صفحات ASP، يمكنك استخدام Server.CreateObject لتخزين مثيلات الكائن في الكائن المضمن في التطبيق. للحصول على مثال باستخدام العلامة <OBJECT> وServer.CreateObject، راجع القسم السابق، "منح نطاق الجلسة لكائن."
بدائل الجلسة ونطاق التطبيق قم بإعطاء جلسة كائن أو نطاق تطبيق فقط عند الحاجة. لأن هذه الكائنات تبقى حتى تنتهي الجلسة أو التطبيق. فهي تستهلك موارد مثل الذاكرة أو اتصالات قاعدة البيانات التي قد تكون أكثر فائدة بطرق أخرى. بالإضافة إلى ذلك، يؤثر نموذج ترابط المكون على أداء الكائنات التي تقوم بإنشائها منه، خاصة تلك التي لها نطاق جلسة أو تطبيق.
في كثير من الحالات، يكون الأسلوب الأفضل من إنشاء كائنات على نطاق التطبيق أو الجلسة هو استخدام متغيرات على نطاق الجلسة أو التطبيق لتمرير المعلومات إلى الكائنات التي تم إنشاؤها على مستوى الصفحة. على سبيل المثال، لا تمنح جلسة عمل كائن اتصال ADO أو نطاق التطبيق لأن الاتصال الذي ينشئه سيظل مفتوحًا لفترة طويلة من الوقت بينما لم يعد البرنامج النصي يستخدم مشاركة اتصال ODBC. ومع ذلك، يمكنك تخزين سلسلة اتصال ODBC في كائن الجلسة أو التطبيق المضمن والحصول على السلسلة من مثيل كائن الاتصال الذي تم إنشاؤه على صفحة الويب. بهذه الطريقة، يمكنك تخزين المعلومات المستخدمة بشكل متكرر في مساحة اسم الجلسة أو التطبيق، ولكن يمكنك إنشاء كائنات بهذه المعلومات فقط عند الحاجة.
كائنات JScript المعرفة من قبل المستخدم يمكنك إنشاء كائنات JScript الخاصة بك عن طريق تعريف المُنشئ الذي يقوم بإنشاء وتهيئة خصائص وأساليب الكائن الجديد. عندما يستدعي البرنامج النصي المنشئ باستخدام العامل الجديد، يتم إنشاء مثيل للكائن. يدعم البرنامج النصي ASP الكائنات المعرفة من قبل المستخدم، والتي تعمل بشكل صحيح عندما يكون لها نطاق صفحة. ومع ذلك، إذا تم منح كائن JScript محدد من قبل المستخدم تطبيقًا أو نطاق جلسة عمل، فقد يؤثر ذلك على وظيفة الكائن. على وجه الخصوص، إذا كان الكائن له نطاق جلسة أو تطبيق، فيمكن للبرامج النصية من الصفحات الأخرى الحصول على خصائص الكائن ولكن لا يمكنها استدعاء أساليبه.
معلومات متقدمة: مشكلات الأداء قد يؤثر طراز مؤشر الترابط الخاص بالمكون على أداء موقع الويب بشكل عام، يوصى باستخدام الكائنات التي تم وضع علامة عليها كلاهما في كافة البرامج النصية لـ ASP، خاصة في كائنات الجلسة والتطبيق. تم إهمال الكائنات ذات الخيوط المفردة.
نظرًا لأنك قد لا تتحكم دائمًا في نموذج الترابط للكائنات التي تستخدمها، فيمكن أن تساعدك الإرشادات التالية في تحقيق الأداء الأمثل:
كائن نطاق الصفحة. الكائنات التي تم وضع علامة "كلاهما" أو "شقة" ستمنحك أفضل أداء.
كائن نطاق التطبيق بشكل عام، يجب تجنب وضع الكائنات في كائن التطبيق. إذا كنت بحاجة إلى استخدام كائنات نطاق التطبيق، فستحصل على أفضل أداء من كائن يحمل علامات كلاهما مدمجًا مع FreeThreadedMarshaler. يمكنك إما استخدام العلامة <OBJECT> أو استخدام الأسلوب Server.CreateObject لتخزين الكائنات ذات العلامات المفردة أو المجانية أو كلاهما في كائن التطبيق. يجب عليك استخدام العلامة <OBJECT> مع الكائنات المترابطة.
كائن نطاق الجلسة. الكائنات التي تم وضع علامة "كلاهما" ستمنحك أفضل أداء. سيؤدي استخدام كائنات مترابطة مفردة أو مترابطة إلى قيام خادم الويب بتأمين الجلسة على مؤشر ترابط واحد. لا تقوم الكائنات ذات الخيوط الحرة بتأمين الجلسة، ولكنها لا تعمل بالسرعة. في كائن الجلسة، يمكنك استخدام العلامة <OBJECT> أو الأسلوب Server.CreateObject لتخزين الكائنات.
إذا قمت بتثبيت وثائق SDK، فستحصل على معلومات مفصلة حول نموذج الترابط وأداء المكون الذي يتضمنه. (وثائق SDK غير متوفرة على نظام التشغيل Windows 95 والإصدارات الأحدث.)