إنشاء صفحات html باستخدام PHP. ما هو الفرق بين ملف php وملف html؟ ما الذي تريد معرفته
كاميرون ليرد
PHP لا يدعم معالجة التدفقات. بغض النظر ، وخلافًا لرأي معظم مطوري PHP الذين تحدثت إليهم ، يمكن لتطبيقات PHP القيام بمهام متعددة. لنبدأ باكتشاف معنى "تعدد المهام" و "خيوط المعالجة" لبرمجة PHP.
تنوع التوازي
أولاً ، نضع جانباً القضايا التي تقع خارج الاتجاه السائد للموضوع الرئيسي. PHP لها علاقة معقدة مع تعدد المهام أو التزامن. في المستوى الأعلى ، تشارك PHP باستمرار في تعدد المهام - يتم استخدام تثبيتات PHP القياسية على الخادم (مثل وحدة Apache) بطريقة متعددة المهام. أي أن تطبيقات العميل المتعددة (متصفحات الويب) يمكنها طلب نفس صفحة PHP في نفس الوقت ، وسيعيدها خادم الويب إلى الجميع أكثر أو أقل في نفس الوقت.
لا تمنع إحدى صفحات الويب الإرسال من صفحة أخرى ، على الرغم من أنها يمكن أن تتداخل قليلاً مع بعضها البعض عند التعامل مع موارد محدودة مثل ذاكرة الخادم أو النطاق الترددي للشبكة. وبالتالي ، قد تسمح متطلبات النظام للتزامن بالحلول المستندة إلى PHP. فيما يتعلق بالتطبيق ، فإن PHP تحمل خادم الويب مسؤولية التزامن.
استحوذ التوازي من جانب العميل المسمى Ajax أيضًا على انتباه المطورين في السنوات القليلة الماضية. بينما أصبح معنى Ajax غامضًا إلى حد ما ، فإن أحد جوانب هذه التقنية هو أن المتصفح يمكنه إجراء عمليات حسابية في نفس الوقت ويظل حساسًا لإجراءات المستخدم مثل تحديد القائمة. إنها حقًا نوع من المهام المتعددة. يقوم Ajax بتشفير PHP ، ولكن بدون أي تدخل خاص في PHP ؛ تعمل إطارات Ajax للغات الأخرى بنفس الطريقة.
المثال الثالث للتزامن الذي يخدش سطح PHP فقط هو PHP / TK. PHP / TK هو امتداد PHP يوفر روابط واجهة مستخدم رسومية محمولة (GUI) إلى نواة PHP. يتيح لك PHP / TK إنشاء تطبيقات واجهة المستخدم الرسومية لسطح المكتب مكتوبة بلغة PHP. تحاكي جوانبها التي تحركها الأحداث شكلاً من أشكال التزامن الذي يسهل تعلمه وأقل عرضة للخطأ من العمل مع الخيوط. مرة أخرى ، "يتم توريث" التزامن من تقنية تكميلية بدلاً من وظائف PHP الأساسية.
كانت هناك عدة تجارب لإضافة دعم مؤشر الترابط إلى PHP نفسها. على حد علمي ، لم ينجح أي منها. ومع ذلك ، تُظهر أطر Ajax و PHP / TK المستندة إلى الأحداث أن الأحداث يمكن أن تعبر بشكل أفضل عن التزامن لـ PHP أكثر من الخيوط. PHP V5 يثبت ذلك.
يقدم PHP V5 Stream_select ()
في PHP القياسي V4 والإصدارات الأقدم ، يجب أن يتم تنفيذ جميع أعمال تطبيق PHP بالتتابع. إذا احتاج البرنامج إلى استرداد سعر عنصر ما من موقعين تجاريين ، على سبيل المثال ، فإنه يطلب السعر الأول ، وينتظر الرد ، ويطلب السعر الثاني ، وينتظر مرة أخرى.
ماذا لو تمكن البرنامج من أداء مهام متعددة في نفس الوقت؟ سيتم الانتهاء منه في جزء بسيط فقط من الوقت المطلوب للعمل المتسق.
المثال الأول
توفر وظيفة stream_select الجديدة ، جنبًا إلى جنب مع العديد من أصدقائها ، هذه الإمكانية. خذ بعين الاعتبار المثال التالي:
0) ($ s = stream_socket_client ("phaseit.net:80"، $ errno، $ errstr، $ timeout، STREAM_CLIENT_ASYNC_CONNECT / STREAM_CLIENT_CONNECT)؛ if ($ s) ($ sockets [$ id ++] = $ s؛ $ http_message = "GET / ظاهر / تأخير؟ Delay =". $ Delay. "HTTP / 1.0 \ r \ n المضيف: phaseit.net \ r \ n \ r \ n"؛ fwrite ($ s، $ http_message)؛) else (echo "Stream". $ id. "فشل في الفتح بشكل صحيح." ؛) تأخير $ - = 3 ؛) بينما (count ($ sockets)) ($ read = $ sockets ؛ stream_select ($ read ، $ w = null ، $ e = null، $ timeout)؛ إذا كان (count ($ read)) (/ * stream_select عادةً ما يخلط $ read ، لذلك علينا معرفة أي مأخذ يقرأ منه. * / foreach ($ read as $ r) ($ id = array_search ($ r، $ sockets) ؛ $ data = fread ($ r، $ appropriate_read_block) ؛ / * يمكن قراءة المقبس إما لأنه يحتوي على بيانات للقراءة أو لأنه في حالة EOF. * / إذا (strlen ($ data) = = 0) (echo "Stream". $ Id. "مغلق عند". Date ("h: i: s"). ". \ N"؛ fclose ($ r)؛ unset ($ sockets [ $ id]) ؛) else ($ result [$ id]. = $ data؛))) else (/ * Ty يعني maut أن جميع الخيوط لم تنتظر ردًا. * / صدى "Time-out! \ n" ؛ استراحة؛ ))؟> |
إذا قمت بتشغيل هذا البرنامج ، فسترى معلومات مشابهة لما يلي:
يبدأ البرنامج الساعة 02:38:50. يغلق الدفق 4 في 02:38:53. يغلق البث 3 في 02:38:56. يغلق البث 2 في 02:38:59. يغلق الدفق 1 الساعة 02:39:02. يغلق البث 0 في 02:39:05. |
من المهم أن نفهم ما يحدث هنا. على مستوى عالٍ ، يقوم البرنامج الأول بإجراء عدة طلبات HTTP ويستقبل الصفحات التي يرسلها خادم الويب إليها. بينما قد يطلب التطبيق الحقيقي عدة خوادم ويب مختلفة (ربما google.com و yahoo.com و ask.com وما إلى ذلك) ، فإن هذا المثال يمرر جميع الطلبات إلى خادم الشركة في Phaseit.net فقط لتقليل التعقيد. ...
تعرض صفحات الويب المطلوبة النتائج بعد التأخير المتغير الموضح أدناه. إذا كان البرنامج سينفذ الطلبات بالتتابع ، فسيستغرق حوالي 15 + 12 + 9 + 6 + 3 (45) ثانية حتى يكتمل. كما هو موضح في القائمة 2 ، يستغرق الأمر 15 ثانية حتى يكتمل. الإنتاجية الثلاثية هي نتيجة رائعة.
أصبح هذا ممكنًا من خلال stream_select ، وهي ميزة جديدة في PHP V5. يتم بدء الطلبات بالطريقة المعتادة - عن طريق فتح العديد من stream_socket_clients وكتابة GET لكل منهم ، والذي يتوافق مع http://phaseit.net/demonstration/delay؟delay=$DELAY. عندما تطلب عنوان URL هذا في متصفحك ، يجب أن ترى:
على الرغم من أن التنفيذ المحدد في القائمة 3 خاص بـ UNIX® ، إلا أن معظم البرامج النصية في هذه المقالة تنطبق بشكل جيد على تثبيتات PHP على Windows® (خاصة ما بعد Windows 98) أو UNIX. على وجه الخصوص ، يمكنك العمل مع القائمة 1 على أي نظام تشغيل. Linux® و Mac OS X هما من نكهات UNIX ، وستعمل جميع التعليمات البرمجية هنا على كلا النظامين.
يتم إجراء طلبات خادم وقت الاستجابة بالترتيب التالي:
تأخير = 15 تأخير = 12 تأخير = 9 تأخير = 6 تأخير = 3 |
الهدف من stream_select هو الحصول على النتائج في أسرع وقت ممكن. في هذه الحالة ، يكون ترتيب التأخيرات هو عكس الترتيب الذي تم تقديم الطلبات به. بعد 3 ثوانٍ ، تصبح الصفحة الأولى جاهزة للقراءة. هذا الجزء من البرنامج عبارة عن كود PHP عادي - في هذه الحالة ، مع fread. تمامًا كما هو الحال في برنامج PHP آخر ، يمكن إجراء القراءة باستخدام fgets.
تستمر المعالجة بنفس الطريقة. كتل البرنامج في stream_select حتى تصبح البيانات جاهزة. المهم هو أنه يبدأ القراءة بمجرد أن يحتوي أي اتصال على بيانات ، بأي ترتيب. هذه هي الطريقة التي ينفذ بها البرنامج تعدد المهام أو المعالجة المتوازية لنتائج استعلامات متعددة.
لاحظ أنه لا يوجد حمل إضافي لوحدة المعالجة المركزية على الكمبيوتر المضيف. ليس من غير المألوف أن تقوم برامج الشبكة بتنفيذ fread بهذه الطريقة قريبًا لاستخدام 100٪ من وحدة المعالجة المركزية. ليس هذا هو الحال هنا ، نظرًا لأن stream_select له الخصائص المطلوبة ويستجيب فورًا بمجرد أن تصبح أي قراءة ممكنة ، ولكنه يقوم بتحميل وحدة المعالجة المركزية في وضع الاستعداد إلى الحد الأدنى بين عمليات القراءة.
ما تحتاج لمعرفته حول stream_select ()
هذه البرمجة القائمة على الحدث ليست تافهة. على الرغم من تقليص القائمة 1 إلى الأساسيات ، فإن أي تشفير يعتمد على عمليات الاسترجاعات أو التنسيق (وهو أمر ضروري في التطبيقات متعددة المهام) سيكون أقل دراية من التسلسل الإجرائي البسيط. في هذه الحالة ، تكمن الصعوبة الأكبر في مصفوفة $ read. يرجى ملاحظة أن هذا رابط ؛ يعرض Stream_select معلومات مهمة عن طريق تعديل محتويات $ read. مثلما تشتهر المؤشرات بكونها مصدرًا ثابتًا للأخطاء في لغة C ، يبدو أن المراجع هي أصعب جزء في PHP للمبرمجين.
يمكن استخدام تقنية الاستعلام هذه من أي عدد من مواقع الويب الخارجية ، مما يضمن أن البرنامج يتلقى كل نتيجة في أسرع وقت ممكن دون انتظار الطلبات الأخرى. في الواقع ، تعمل هذه التقنية بشكل صحيح مع أي اتصال TCP / IP ، وليس فقط الويب (المنفذ 80) ، أي ، من حيث المبدأ ، يمكنك التحكم في استخراج بيانات LDAP ، ونقل SMTP ، وطلبات SOAP ، إلخ.
لكن هذا ليس كل شيء. يتعامل PHP V5 مع التوصيلات المختلفة كـ "تدفقات" بدلاً من مآخذ توصيل بسيطة. تدعم مكتبة عناوين URL لعميل PHP (CURL) شهادات HTTPS وتحميلات FTP الصادرة وملفات تعريف الارتباط والمزيد (يسمح CURL لتطبيقات PHP باستخدام بروتوكولات مختلفة للاتصال بالخوادم). نظرًا لأن CURL يوفر واجهة دفق ، يكون الاتصال شفافًا من وجهة نظر البرنامج. يشرح القسم التالي كيف تعدد الإرسال stream_select حتى الحساب المحلي.
هناك بعض المحاذير بخصوص stream_select. لم يتم توثيق هذه الوظيفة ، لذلك لم يتم تناولها حتى في كتب PHP الجديدة. العديد من أمثلة التعليمات البرمجية المتوفرة على الويب لا تعمل أو غير مفهومة. يجب أن تكون الوسيطتان الثانية والثالثة لـ stream_select ، والتي تتحكم في قنوات الكتابة والاستثناء المتوافقة مع قنوات القراءة في القائمة 1 ، خالية دائمًا. مع استثناءات قليلة ، يعد اختيار هذه القنوات خطأ. إذا لم تكن من ذوي الخبرة الكافية ، فاستخدم فقط الخيارات الموصوفة جيدًا.
أيضًا ، يبدو أن stream_select به أخطاء ، على الأقل في PHP V5.1.2. الأهم من ذلك ، لا يمكن الوثوق بقيمة إرجاع الدالة. على الرغم من أنني لم أصحح التنفيذ حتى الآن ، فقد أظهرت تجربتي أنه من الآمن اختبار العدد (قراءة بالدولار) كما في القائمة 1 ، لكن هذا لا ينطبق على القيمة المرجعة لـ stream_select نفسه ، على الرغم من الوثائق الرسمية.
PHP التزامن المحلي
ركز المثال ومعظم المناقشة أعلاه على كيفية إدارة عدة موارد بعيدة في نفس الوقت والحصول على النتائج كما تظهر ، بدلاً من انتظار معالجة كل منها بترتيب الطلب الأصلي. هذا بلا شك تطبيق مهم لتزامن PHP. في بعض الأحيان يمكن تسريع التطبيقات الحقيقية عشرة أضعاف أو أكثر.
ماذا لو حدث التباطؤ أقرب؟ هل هناك طريقة لتسريع الحصول على النتائج في PHP عند المعالجة محليًا؟ هناك عدد قليل. ربما تكون أقل شهرة من النهج الموجه نحو المقبس في القائمة 1. وهناك عدة أسباب لذلك ، بما في ذلك:
- بالنسبة للجزء الأكبر ، صفحات PHP سريعة بما يكفي. قد يكون الأداء الأفضل ميزة ، ولكن ليس كافيًا لتبرير الاستثمار في كود جديد.
- يمكن أن يؤدي استخدام PHP في صفحات الويب إلى جعل تسريع التعليمات البرمجية الجزئية غير ذي صلة. إعادة توزيع الحساب للحصول على نتائج وسيطة بشكل أسرع غير ذي صلة عندما يكون المعيار الوحيد هو سرعة تسليم صفحة الويب ككل.
- يتم التحكم في عدد قليل من الاختناقات المحلية بواسطة PHP. قد يشتكي المستخدمون من أن الأمر يستغرق 8 ثوانٍ لاسترداد معلومات الحساب ، ولكن هذا قد يحد من معالجة قاعدة البيانات أو بعض الموارد الأخرى الخارجية لـ PHP. حتى إذا قمت بتقليل وقت معالجة PHP إلى الصفر ، فسيستغرق الأمر أكثر من 7 ثوانٍ للبحث فقط.
- حتى عدد أقل من القيود تصلح للمعالجة المتوازية. لنفترض أن صفحة معينة تحسب السعر الموصى به لسهم عادي مدرج ، وأن الحسابات معقدة بما يكفي وتستغرق عدة ثوان لإكمالها. يمكن أن يكون الحساب متسلسلًا في الطبيعة. لا توجد طريقة واضحة لتوزيعها من أجل "التعاون".
- قليل من مبرمجي PHP يفهمون إمكانات PHP للمعالجة المتوازية. بالحديث عن إمكانية الموازاة ، اقتبس معظم المبرمجين الذين قابلتهم عبارة "PHP لا تعمل مع الخيوط" وعادوا إلى نموذجهم الحسابي المعمول به.
في بعض الأحيان يمكنك أن تفعل ما هو أفضل. لنفترض أن صفحة PHP تحتاج إلى حساب سعري سهم ، وربما مقارنتهما ، وأن الكمبيوتر المضيف المستخدم متعدد المعالجات. في هذه الحالة ، يمكننا مضاعفة الأداء تقريبًا عن طريق تعيين عمليتين حسابيتين منفصلتين طويلتين إلى معالجات مختلفة.
في عالم حوسبة PHP ، مثل هذه الأمثلة نادرة. ومع ذلك ، نظرًا لأنني لم أجد وصفًا دقيقًا في أي مكان آخر ، فأنا أريد أن أعطي مثالًا على هذا التسارع هنا.
المصفوفة ("pipe"، "r")، 1 => المصفوفة ("pipe"، "w")، 2 => المصفوفة ("file"، $ error_log، "w"))؛ cmd دولار = "النوم". تأخير دولار. "؛ صدى" انتهى مع تأخير ". $ delay." "."؛ $ handles [$ id] = proc_open ($ cmd، $ descriptorspec، $ الأنابيب)؛ تدفقات $ [$ id] = أنابيب $؛ all_pipes $ [$ id] = أنابيب $؛ تأخير دولار - = 2 ؛ ) while (count ($ streams)) ($ read = $ streams؛ stream_select ($ read، $ w = null، $ e = null، $ timeout)؛ foreach ($ read as $ r) ($ id = array_search ($ r، $ streams)؛ echo stream_get_contents ($ all_pipes [$ id])؛ if (feof ($ r)) (fclose ($ all_pipes [$ id])؛ fclose ($ all_pipes [$ id])؛ $ return_value = proc_close ($ handles [$ id])؛ unset ($ streams [$ id])؛)))؟> |
سيعرض هذا البرنامج المعلومات التالية:
يبدأ البرنامج الساعة 10:28:41. انتهى بتأخير 1. انتهى بتأخير 3. |
الفكرة هي أن PHP بدأت عمليتين فرعيتين مستقلتين ، وتلقت البيانات من الأولى ، ثم من الثانية ، على الرغم من أن الأخيرة بدأت في وقت سابق. إذا كان الكمبيوتر المضيف متعدد المعالجات وتم تكوين نظام التشغيل بشكل صحيح ، فإنه يعتني بتعيين برامج فرعية مختلفة إلى معالجات مختلفة. هذه طريقة واحدة للاستفادة من آلات PHP متعددة المعالجات.
ملخص
يدعم PHP تعدد المهام. لا تدعم PHP معالجة الدفق بالطريقة التي تعمل بها لغات البرمجة الأخرى مثل Java أو C ++ ، ولكن الأمثلة أعلاه أظهرت أن PHP لديها إمكانية تسريع أعلى مما يدركه معظم الناس.
لذا ، أيها الأصدقاء ، إذا وصلت إلى هذا الدرس ، فقد تمكنت من تثبيت خادم محلي ، أو شراء استضافة يمكنك العمل عليها باستخدام PHP. مبروك - هذه خطوة كبيرة!
سأقول بإيجاز عن PHP - تُستخدم لغة البرمجة هذه في جميع أنحاء العالم ويمكنك من خلالها إنشاء مواقع من جميع مستويات التعقيد ، من مواقع بطاقات العمل إلى البوابات الكبيرة. أعتقد أنه لم يعد سرا بالنسبة للكثيرين أن أكبر الشبكات الاجتماعية facebook.com(من الصفر إلى php) و vk.com(محرك php) تمت كتابته بلغة PHP. لذلك نستخلص النتائج ونبدأ العمل!)
كيف يعمل الكود
كود PHP معالجتها على جانب الخادم... أي لا توجد صفحة جاهزة. على سبيل المثال ، في الكود ، يتم إعطاء أمر لجمع البيانات حول عدد المستخدمين المسجلين حاليًا على الموقع. ينقر زائر الموقع على ارتباط جميع المستخدمين... يريد أن يحصل بيانات ديناميكية، أي تلك التي تتغير باستمرار. بعد انتهاء العد على الخادم ، ستأتي البيانات من الخادم في شكل كود HTML الذي تم إنشاؤه للصفحة مع عدد المستخدمين. نتيجة لذلك ، بعد النقر فوق طلب على الرابط ، يتلقى المستخدم الصفحة. إذا قمت بعرض كود الصفحة الناتجة ، يمكنك رؤية HTML فقط ، ولن يكون كود PHP متاحًا للعرض. بشكل تقريبي ، PHP هي تعليمات للخادم حول كيفية ومن أي كتل لإنشاء صفحة.كيف يبدو كود PHP وأين يتم إدخاله؟
يمكن تضمين كود PHP مباشرة في HTML. يتم تضمين كود PHP في صفحات HTML باستخدام أقواس زاوية وعلامة استفهام ومع ذلك ، يمكنك قصر نفسك على أقواس بعلامات استفهام код; ?> ... ستحتاج فقط إلى تغيير امتداد الملف ، على سبيل المثال ، من .لغة البرمجةتشغيل .بي أتش بيكود PHP(ملف index.php)
صدى "مرحبا العالم!" ؛
?>