फाल्कन - संकलित PHP MVC फ्रेमवर्क


PHP के लिए संकलित MVC फ्रेमवर्क बनाना एक से अधिक बार कोडर्स के दिमाग में आया।

इस दृष्टिकोण के लाभ:

और अपने आप में कोई कम स्पष्ट नुकसान नहीं:



इस लेख में मैं एक संकलित PHP MVC फ्रेमवर्क बनाने के लिए एक और प्रयास शुरू करने की कोशिश करूंगा।

परिचित


मैं खुद एक तेज, विश्वसनीय और सक्षम ढांचे की तलाश में हूं। विदेशी मंचों और ब्लॉगों के बारे में घूमते हुए, मैं एक दिलचस्प बेंचमार्क पर आया, जहां "हैलो वर्ल्ड!" के लिए एक रूपरेखा तैयार की गई, जिसमें कई बार मशहूर हस्तियों ने पॉट-बेल्ड किया।



मैं इस तरह से नहीं गुजर सकता था और यह पता लगाने लगा कि यह कैसे काम करता है और विकसित होता है।
प्रोजेक्ट एक साल से कम पुराना है। गितुब पर पहली बार 10 जनवरी 2012 को प्रतिबद्ध है। और हां, यह एक खुला स्रोत परियोजना है। जैसा कि मैंने इसे समझा, अब 3 लोग कमोबेश इसमें लगे हुए हैं।

लेखक लोगों को इसके प्रदर्शन के बारे में सोचने, मानकों का पालन करने और उपयोग किए गए अधिकांश तरीकों तक पहुंच देने के बिना कोड लिखने का अवसर देने की कोशिश करते हैं, जो सर्वर की शुरुआत से मेमोरी में लोड होते हैं।

उदाहरण

फ्रेमवर्क सीखने का सबसे अच्छा तरीका समानांतर में प्रलेखन का अध्ययन करते समय उस पर कुछ करना है।
मैंने फाल्कन की कुछ विशेषताओं को दिखाते हुए एक 3-पृष्ठ एप्लिकेशन बनाया , अर्थात्:

इसके अलावा, डेवलपर्स बहुत अधिक कहते हैं:


परियोजना पदानुक्रम:

 xmpl /
     ऐप्स /
         एप्लिकेशन / कॉन्फ़िगरेशन /
         एप्लिकेशन / नियंत्रक /
         ऐप / मॉडल /
         एप्लिकेशन / विचार /
         एप्लिकेशन / मेरा /
     सार्वजनिक /
         सार्वजनिक / img /
         सार्वजनिक / सीएसएस /
         सार्वजनिक / जेएस /


सभी कोड एप्लिकेशन /public/index.php को इनिशियलाइज़ करते हुए, पथ / ऐप्स / के साथ स्थित होंगे। आखिरी फ़ाइल पर, वास्तव में, आपको अपाचे (.htaccess in / / and / public / फ़ोल्डरों में) या nginx के माध्यम से कोई भी अप्रत्यक्ष पृष्ठों पर रीडायरेक्ट करने की आवश्यकता नहीं है।

प्रारंभ:

बिगाड़ने के तहत संक्षेप में प्रारंभिक के बारे में।
<?php //    ini  $config = new Phalcon\Config\Adapter\Ini( '../apps/config/config.ini' ); // ,  ,      $loader = new \Phalcon\Loader(); $loader->registerDirs(array( $config->application->controllersDir, $config->application->modelsDir, $config->application->myDir, )); $loader->register(); // DI $di = new \Phalcon\DI(); //,    url. $di->set('url', function() use ($config){ $url = new \Phalcon\Mvc\Url(); return $url; }); //    ,  ( Mysql, PostgreSQL, SQLite) $di->set('db', function() use ($config) { $connection = new \Phalcon\Db\Adapter\Pdo\Mysql(array( "host" => $config->database->host, "username" => $config->database->username, "password" => $config->database->password, "dbname" => $config->database->name )); return $connection; }); //2       $di->set('modelsManager', function(){ return new Phalcon\Mvc\Model\Manager(); }); //,   -  ,  (Apc, Files, Memory, Session) $di->set('modelsMetadata', function(){ return new \Phalcon\Mvc\Model\Metadata\Memory(); }); //  $di->set('router', 'Phalcon\Mvc\Router'); // ,      view  .    . $di->set('dispatcher', function() use ($di) { $dispatcher = new Phalcon\Mvc\Dispatcher(); return $dispatcher; }); //    $di->set('response', 'Phalcon\Http\Response'); $di->set('request', 'Phalcon\Http\Request'); //   $di->set('filter', function(){ return new \Phalcon\Filter(); }); //    Volt   $di->set('voltService', function($view, $di) use ($config) { $volt = new Phalcon\Mvc\View\Engine\Volt($view, $di); $volt->setOptions(array( "compiledPath" => $config->application->templCompDir, "compiledExtension" => ".compiled" )); return $volt; }); // ,   .    eventManager, //,     view.    //      $di->set('view', function() use ($config) { $eventsManager = new \Phalcon\Events\Manager(); $viewManager = new ViewManager(); $eventsManager->attach('view', $viewManager); $view = new \Phalcon\Mvc\View(); $view->setViewsDir( $config->application->viewsDir ); $view->registerEngines(array( ".phtml" => 'voltService' )); $view->setEventsManager($eventsManager); return $view; }); //    ,  front (Base64, Data, None, Output)  backend (Apc, File, Memcache, Mongo),  ,     $di->set('cache', function(){ $frontCache = new Phalcon\Cache\Frontend\Data(array( "lifetime" => 60 )); $cache = new Phalcon\Cache\Backend\Apc($frontCache); return $cache; }); //         try { $application = new \Phalcon\Mvc\Application(); $application->setDI($di); echo $application->handle()->getContent(); } catch(Phalcon\Exception $e){ echo $e->getMessage(); } 



अधिकांश को स्वचालित रूप से जोड़ा जा सकता है, जैसे:
 $di = new Phalcon\DI\FactoryDefault(); 


नियंत्रक और उनकी कक्षाएं:

अब, आपके आवेदन में मानक राउटिंग / बेसयूरी / कंट्रोलरनेम / एक्शननाम / उपलब्ध है , विधियाँ जुड़ी हुई हैं, जो डि के माध्यम से नियंत्रकों को यह $-> कैश, $ यह-> डिस्पैचर, $ यह-> डीबी ...

आप अपने एप्लिकेशन / My / फ़ोल्डर में स्थित अपनी कक्षाओं को भी कॉल कर सकते हैं
ViewManager वर्ग दृश्य द्वारा उत्पन्न सभी घटनाओं को प्राप्त करेगा। हितों से पहले । इसमें, हम क्लास और एक्शन के नाम वाले व्यू वेरिएबल्स में पास होंगे।

हम BaseController क्लास भी बनाएंगे
 class BaseController extends \Phalcon\Mvc\Controller { public function initialize() { Phalcon\Tag::prependTitle('Example | '); } } 

 class IndexController extends BaseController { public function initialize() { //    title,     (   Poll) Phalcon\Tag::setTitle('Index'); parent::initialize(); } public function indexAction(){ } } 


यह मानक वर्ग को विरासत में मिला है। हमारे नियंत्रकों को पहले से ही बेसकंट्रोलर विरासत में मिलेगा और HTML शीर्षक टैग के लिए एक उपसर्ग मिलेगा।


राय

फाल्कन एक काफी सुविधाजनक टेम्पलेट विधि प्रदान करता है जहां एक पदानुक्रम मौजूद है।
टेम्पलेट / एप्लिकेशन / दृश्य / में संग्रहीत किए जाते हैं
रूट टेम्पलेट /apps/views/index.phtm को सभी नियंत्रकों द्वारा प्रदान किया जाता है, सिवाय उन लोगों के जहां एक अलग रास्ता स्पष्ट रूप से सेट किया गया है।
इस फ़ाइल में आगे पदानुक्रम पथ हो सकता है:
 {{ content() }} 


मैंने अंतर्निहित टेम्पलेट इंजन के सिंटैक्स का उपयोग किया। अन्य इंजनों के भी अपने स्वयं के एनालॉग होते हैं।
यह फ़ंक्शन पथ के साथ स्थित निम्न पैटर्न को कॉल करता है:
/apps/view/layer/ControllerName.phtml

वास्तव में, एक विशिष्ट नियंत्रक के लिए एक विशेष डिज़ाइन सेट करना, जैसा कि मैंने अपने आवेदन में किया था। आप इसमें सामग्री () भी कॉल कर सकते हैं, जिससे /apps/views/ControllerName/ActionName.phpml टेम्पलेट लोड हो रहा है

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

बॉक्स में से संकलित टेम्पलेट्स को संकलित करने की क्षमता है, केवल 0.6.0 तक के संस्करणों में, एक बग है जो कैश को शून्य करता है और एक खाली पृष्ठ का उत्पादन करता है।

आदर्श

डेटाबेस का कनेक्शन पीडीओ का उपयोग करके किया जाता है। डेटाबेस के साथ काम करने के 2 कार्यान्वयन हैं, एक ऑब्जेक्ट-ओरिएंटेड पथ और PHQL, आपका अपना छद्म SQL स्ट्रिंग हैंडलर।
दुर्भाग्य से, पहला केवल काफी सरल प्रश्नों के लिए उपयुक्त है, और दूसरा उन लोगों के लिए मुश्किल होगा जो पहले उपयोग किए जाते हैं।

एप्लिकेशन मॉडल
 class Poll extends Phalcon\Mvc\Model { //    ,  ,    public public $id; public $gender; public $age; public $read_modern; public $authors; public $genre; public $method; public $timestamp; //    ,      public function getSource() { return 'answers'; } //     public function initialize() { $this->setConnectionService('db'); } } 



मॉडल में, मेरे लिए, मुझे कुछ भी नया और दिलचस्प नहीं मिला, सिवाय इसके कि विभिन्न स्थानों में मेटा डेटा का भंडारण। वे पूरी तरह से पूर्व निर्धारित भी हो सकते हैं।

कमियों

मुझे पूरी तरह से सब कुछ समझ में नहीं आया कि यह ढांचा क्या कर सकता है, लेकिन फिर भी खामियों पर ध्यान दिया गया:

इसे दोष कहना कठिन है। जब तक कि डेवलपर्स के साथ सीधा संवाद न हो, सिवाय गितुब पर जारी सूची के।

अनुप्रयोग की कार्यक्षमता


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

आयरन: वीपीएस होस्टिंग। प्रोसेसर X1 500 MHz, ओपी 256 एमबी। घोड़ा कमजोर है।
कनेक्टेड एपीसी। सेटिंग्स सभी डिफ़ॉल्ट हैं। सर्वर: nginx - php-fpm - php - mysql

सिंथेटिक परीक्षण:
1. -c50 -d5 -r10
2. -c100 -d2 -r10
3. -300 -d2 -r20 (एलए - 0.7)
4.-c400 -d1 -r20 (LA - 0.47)
5. -c800 -d1 -r30 (एलए - 1.1)
6. -c1000 -b -r20 (LA - 2)
(-c: प्रतियोगियों, -d: फिर से फोन करने से पहले देरी; -आर: रिट्रीट की संख्या, -b: देरी के बिना कॉल, ला: लोड औसत)


घेरा अनियमित रूप से 3 अनुरोध करता है, सभी गतिशील। उनमें से 2 डेटाबेस प्रश्नों के साथ, 1 मिनट के कैशिंग के साथ।
बड़ी प्रतिस्पर्धा के साथ, त्रुटियां प्रकट हुईं (अनुरोधों के 2% तक)।
अधिकतम प्रति सेकंड 516 अनुरोधों को संसाधित किया गया। सुंदर थम्स अप। यदि आप फ़ाइलों में अनुरोधित जोंस को स्टोर करते हैं और क्रोन द्वारा उन्हें अपडेट करते हैं, तो आप कई बार लोड को कम कर सकते हैं।

घेराबंदी के साथ कुछ और परीक्षण किए। -c500 -r10 -d1 -i
1. APC अक्षम है
2. एपीसी एक छोटे बफर और स्टेट = 0 के साथ सक्षम है
छवि

संदर्भ


फाल्कन वेबसाइट
फाल्कन रिपोजिटरी

काम करने का उदाहरण
GitHub नमूना स्रोत

पुनश्च

आवेदन में सर्वेक्षण सिर्फ चुना नहीं है, कृपया ईमानदारी से जवाब दें;)
और मैं भ्रम के लिए माफी मांगता हूं, एक लेख में सब कुछ करना असंभव है।

11/19/2012 11:00 बजे।
किसी ने एक क्वेरी पर चुटकी लेने का फैसला किया जो डेटाबेस से परिणाम देता है। लॉग छलांग और सीमा से बढ़ते हैं। ला 1 से 4 तक है। साइट लोड हो रही है। मैं बहुत खुश हूँ :)
प्रकोष्ठ के साथ उपयोगिता। लॉग्स को देखते हुए प्रति सेकंड 60 अनुरोध आते हैं। आईपी ​​188.254.105.18
11/19/2012 11:43 PM
मुझे 0.5GB लॉग इन किया और यह काफी है। अलविदा ddos

Source: https://habr.com/ru/post/In159217/


All Articles