Mojolicious के बारे में कई लेख पहले ही लिखे जा चुके हैं, जिनसे आप इस वेब फ्रेमवर्क के सामान्य इंप्रेशन प्राप्त कर सकते हैं। प्रकाशनों को पढ़कर, आप समझ सकते हैं कि पीएसजीआई सहित आवेदन को तैनात करना कितना आसान है, स्केल, वेब सर्वर के साथ बातचीत और उच्च भार का सामना करना। यह सब अच्छा है, ज़ाहिर है, लेकिन किसी कारण से एक साधारण आभासी होस्टिंग पर एप्लिकेशन को चलाने के तरीके पर कोई लेख नहीं है। हालांकि, शायद यह इस तथ्य से नहीं है कि यह केवल करने के लिए अभद्र है?
आवश्यकताओं।
जैसा भी हो, लेकिन साझा होस्टिंग कुछ आवश्यकताओं को पूरा करना चाहिए।
- पर्ल संस्करण 5.10 या उच्चतर स्थापित है;
- cgi- स्क्रिप्ट के उपयोग की अनुमति दी;
- mod_rewrite द्वारा समर्थित;
सामान्य तौर पर, यह सब है। बेशक, यह अच्छा है अगर आप वेब निर्देशिका के बाहर की जगह का उपयोग सभी आवश्यक मॉड्यूल को संग्रहीत करने के लिए कर सकते हैं। हम मानते हैं कि आपने पहले ही अपने कंप्यूटर पर Mojolicious स्थापित कर लिया है, उदाहरण के लिए, इस वेब फ्रेमवर्क की समीक्षा के साथ किसी भी लेख का उपयोग करना।
होस्टिंग पर PSGI एप्लिकेशन को चलाने के लिए, Plack स्थापित होना चाहिए और mod_perl समर्थित होना चाहिए।
Mojolicious आवेदन
यदि आपके पास पहले से ही एक नहीं है, तो मैं सुझाव देता हूं कि कुछ मज़ेदार हों और सहनशीलता के लिए हबराब्र की जाँच करें। ऐसा करने के लिए, हमें स्वयं Mojolicious की आवश्यकता होगी, आपका पसंदीदा IDE और थोड़ा धैर्य।
अनुप्रयोग वायरफ़्रेम
पहला कदम एप्लिकेशन फ्रेमवर्क उत्पन्न करना है। चूंकि हम सिंगल-लाइन एप्लिकेशन की सीमाओं से परे जाना चाहते हैं और डांसर बनाम मोजोलसियस के बीच टकराव को समाप्त करते हैं, हम लाइट संस्करण को छोड़ देंगे:
habra@cynovg-notebook:~$ mojo generate app Habra [mkdir] /home/habra/habra/script [write] /home/habra/habra/script/habra [chmod] habra/script/habra 744 [mkdir] /home/habra/habra/lib [write] /home/habra/habra/lib/Habra.pm [mkdir] /home/habra/habra/lib/Habra [write] /home/habra/habra/lib/Habra/Example.pm [mkdir] /home/habra/habra/t [write] /home/habra/habra/t/basic.t [mkdir] /home/habra/habra/log [mkdir] /home/habra/habra/public [write] /home/habra/habra/public/index.html [mkdir] /home/habra/habra/templates/layouts [write] /home/habra/habra/templates/layouts/default.html.ep [mkdir] /home/habra/habra/templates/example [write] /home/habra/habra/templates/example/welcome.html.ep
यदि वे हस्तक्षेप करते हैं और मनोरंजन के साथ आगे बढ़ते हैं तो हम उदाहरणों के साथ निर्देशिकाओं को हटाते हैं।
आवेदन डिजाइन
ताकि आवेदन "हैलो, वर्ल्ड!" की तुलना में थोड़ा अधिक गंभीर हो जाए, मैं सुझाव देता हूं कि कौशल अभ्यास के लिए हबराबरा खोज का उपयोग करें। अर्थात्, उपयोगकर्ता को एक खोज स्ट्रिंग के लिए पूछने के लिए, इसे हैबर को दें, एक प्रतिक्रिया प्राप्त करें और इसे उपयोगकर्ता को प्रदर्शित करें।
आइए छोटे से शुरू करें, एक खोज क्वेरी इनपुट फ़ॉर्म जेनरेट करना सीखें और एक उपयोगकर्ता से डेटा प्राप्त करने के लिए एक प्रतिक्रिया के रूप में एक स्टब टेम्पलेट प्रदर्शित करें। ऐसा करने के लिए, आपको इनपुट फ़ॉर्म, फ़ॉर्म टेम्पलेट स्वयं और प्रतिक्रिया स्टब के लिए एक मार्ग की आवश्यकता होगी।
हम सभी मार्गों को Habra.pm मॉड्यूल में संग्रहित किया गया है जो कि लिबरी डायरेक्टरी में स्थित है, जिसकी सामग्री पीढ़ी के बाद इस तरह दिखाई देगी।
package Habra; use Mojo::Base 'Mojolicious';
चूँकि हम खोज में लगे हुए हैं, इसलिए हमारे नियंत्रक खोज को नाम देना उचित है, और इसके लिए मार्ग, क्रमशः, # डिफ़ॉल्ट खोजें और # परिणाम खोजें। डिफ़ॉल्ट रूप से, हम इनपुट फॉर्म प्रदर्शित करेंगे:
$r->route( '/' )->via('get')->to( 'search#default' );
और इनपुट फॉर्म के लिए एक टेम्पलेट बनाएं, उसे /templates/search/deafult.html.ep में रखकर:
% layout 'default'; % title ' '; <form action='<% url_for %>' method='post'> <input type='text' name='q' placeholder=' ?'> <input type='submit' value='!'> </form>
अब, जब हमने Habra.pm मॉड्यूल से अनावश्यक सब कुछ हटा दिया और डिफ़ॉल्ट मार्ग बदल दिया, तो हमारे मॉड्यूल को इस तरह दिखना चाहिए:
package Habra; use Mojo::Base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route( '/' )->via('get')->to( 'search#default' ); } 1;
आइए जाँचें कि यह कमांड लाइन से उसी नाम की निर्देशिका से स्क्रिप्ट चलाकर कैसे काम करता है:
morbo script/habra Server available at http://127.0.0.1:3000.
127.0.0.1eps000 पर ब्राउज़र से इसे चालू करते हुए, हमारे इनपुट फॉर्म को प्रदर्शित किया जाना चाहिए, जो निश्चित रूप से, एप्लिकेशन के क्रैश की ओर जाता है जैसे ही हम कहीं जाने वाले हैं। और ऐसा इसलिए होता है क्योंकि हमारे पास पोस्ट विधि के लिए नियंत्रण का मार्ग नहीं है, जिसका उपयोग इनपुट फॉर्म से डेटा स्थानांतरित करने के लिए किया जाता है। मुख्य मॉड्यूल में एक मार्ग और टेम्पलेट्स में एक अस्थायी ठूंठ टेम्पलेट जोड़ें। ऐसा करने के लिए, मुख्य मॉड्यूल में लाइन जोड़ें:
$r->route( '/' )->via('post')->to( 'search#result' )
और एक डेटा आउटपुट टेम्पलेट, टेम्प्लेट / खोज / result.html.ep बनाएं
% layout 'default'; % title ' ';
यदि हम अब जांचते हैं कि हमारा आवेदन कैसे काम करता है, तो हम देखेंगे कि कहीं जाने की हमारी इच्छा की प्रतिक्रिया के रूप में, "खोज परिणाम" शीर्षक के साथ एक खाली पृष्ठ होगा।
अपने लक्ष्य को प्राप्त करने के लिए, हमें नियंत्रण में परिणाम पद्धति को लागू करने की आवश्यकता होगी, जो अनुरोध को स्वीकार करेगी, इसे हैबर को भेजेगी और प्रतिक्रिया को हमारे लिए सुविधाजनक रूप में हबर से रूपांतरित करेगी। ऐसा करने के लिए, निम्न सामग्री के साथ lib / Habra / Search.pm मॉड्यूल बनाएं:
package Habra::Search; use Mojo::Base 'Mojolicious::Controller'; sub result { my $self = shift; my $str = $self->param( 'q' ); my $ua = Mojo::UserAgent->new; my $dom = $ua->get( 'http://habrahabr.ru/search/?q='.$str )->res->dom; my $pull = (); for my $raw ( $dom->find( 'div[id^="post"]' )->each ) { my $header= $raw->find( 'a[class="post_title"]' )->first; push @$pull, { title => $header->text, url => $header->{href}, content => $raw->find( 'div[class^="content"]' )->first->text }; } $self->render( result => $pull ); } 1;
और अनुरोध के परिणाम को प्रदर्शित करने के लिए स्टब टेम्पलेट को पूरक करें:
% layout 'default'; % title ' '; <ul> % for my $row ( @$result ) { <li> <h2><%= $row->{title} %></h2> <p><%= $row->{content} %></p> <p> : <a href="<%= $row->{url} %>"><%= $row->{url} %></a></p> </li> %} </ul>
यदि आपकी राय में कोई सरल या, डेटा निकालने का अधिक "सही" तरीका है, तो मुझे इसके बारे में जानना अच्छा लगेगा।
हम मानते हैं कि यह पहले परिचित के लिए पर्याप्त होगा, लेकिन हम अभी भी इस स्तर पर मुख्य लक्ष्य तक नहीं पहुंचे हैं, क्योंकि हमारा आवेदन अभी भी स्थानीय मशीन पर स्थित है। यह एक साझा होस्टिंग पर लॉन्च करने का समय है।
अनुप्रयोग प्रकाशित करें
इस स्तर पर, हमारे पास एक होस्टिंग है जो आवश्यकताओं और एक कामकाजी अनुप्रयोग को पूरा करती है। यह छोटे के लिए मामला है, इसे प्रकाशित करें। अरे हाँ, मान लेते हैं कि हमारे पास डोमेन नाम mojoex.am.pl है, और साइट का रास्ता /home/mojoex.am.pl/www है
एप्लिकेशन को चलाने के लिए, आपको GjHub से Mojolicious स्रोत कोड डाउनलोड करने की आवश्यकता है
git clone https://github.com/kraih/mojo.git
फिर वितरण से सबकुछ हटा दें, केवल काम करने योग्य निर्देशिका को छोड़ दें, क्योंकि यह वह जगह है जहां सभी मॉड्यूल संग्रहीत हैं। आवेदन मॉड्यूल और स्वयं Mojolishes के मॉड्यूल के बीच भ्रमित नहीं होने के लिए, आप उदाहरण के लिए, मोजो में काम कर रहे निर्देशिका का नाम बदल सकते हैं।
अगला कदम स्क्रिप्ट को थोड़ा संशोधित करना है जो कि मोड्ज़ोलिसिस मॉड्यूल के साथ निर्देशिका में एक संकेतक जोड़कर आवेदन शुरू करता है और अपने हेडर में ही आवेदन करता है और इसे habra.cgi में बदल देता है।
use lib ( '/home/mojoex.am.pl/mojo' ); use lib ( '/home/mojoex.am.pl/lib' );
अगला कदम पथ /home/mojoex.am.pl.mojo के साथ साइट के बाहर Mojolishes मॉड्यूल लगाने के लिए है। उसी तरह, क्रमशः एप्लिकेशन मॉड्यूल और टेम्प्लेट, /home/mojoex.am.pl/lib और /home/mojoex.am.pl/templates बाहर रखें। लॉग के लिए एक निर्देशिका भी बनाएं, /home/mojoex.am.pl/log। लेकिन आवेदन शुरू करने वाली स्क्रिप्ट को निर्देशिका /home/mojoex.am.pl/www/cgi-bin, को निष्पादित करने के अधिकार के साथ रखा जाना चाहिए।
अंतिम चरण mod_rewrite के साथ कुछ जादू है। नियम बनाना आवश्यक है। ऐसा करने के लिए, एक .htaccess फ़ाइल बनाएँ, जिसे निम्नलिखित सामग्री के साथ /home/mojoex.am.pl/www निर्देशिका में स्थित होना चाहिए:
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-l RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /cgi-bin/habra.cgi/$1 [L] RewriteRule ^$ /cgi-bin/habra.cgi [L]
fismtechnix टिप्स कि अगर होस्टिंग पर mod_perl स्थापित है, तो हम PSGI एप्लिकेशन चला सकते हैं। ऐसा करने के लिए, .htaccess में निम्नलिखित निर्दिष्ट करें:
<Perl> $ENV{PLACK_ENV} = 'production'; $ENV{MOJO_HOME} = '/home/mojoex.am.pl'; $ENV{MOJO_TEMPLATE_CACHE} = 0; $ENV{PERL5LIB} .= '/home/mojoex.am.pl/lib;/home/mojoex.am.pl/mojo' </Perl> SetHandler perl-script PerlHandler Plack::Handler::Apache2 PerlSetVar psgi_app /home/mojoex.am.pl/www/cgi-bin/habra
सब कुछ, इस पर हमारी प्रक्रिया समाप्त होनी चाहिए, जैसा कि आप साइट के मुख्य पृष्ठ पर जाकर देख सकते हैं। यदि सब कुछ सही ढंग से किया जाता है, तो खोज के लिए डेटा दर्ज करने का संकेत दिखाई देना चाहिए। यदि ऐसा नहीं हुआ, तो आपको सर्वर त्रुटि लॉग में कारण को देखना चाहिए, सबसे अधिक समस्या एप्लिकेशन लॉन्च स्क्रिप्ट तक पहुंच है।
सारांश
नतीजतन, होस्टिंग संरचना समान दिखनी चाहिए:
/home/mojoex.am.pl/
स्टैटिक फाइलें, जैसे कि शैलियों, चित्र, आदि को सामान्य तरीके से संग्रहीत किया जाता है, इन नियमों के लिए धन्यवाद। पुनर्निर्देशन के दौरान उन्हें अनदेखा किया जाता है। गैर-मौजूद संसाधनों तक पहुंचने पर, एप्लिकेशन पर पुनर्निर्देशित होता है, जो स्वतंत्र रूप से तय करता है कि क्या करना है। यदि एक निर्दिष्ट पथ के साथ एक अपील होती है, तो नियंत्रण को नियंत्रित करने के लिए स्थानांतरित किया जाता है, अन्यथा एक त्रुटि संदेश उत्पन्न होता है, जिसे स्वतंत्र रूप से उत्पन्न किया जा सकता है।
यदि किसी को कोड का टुकड़ा उग्र लग सकता है, या कुछ अचूक बिंदु, टिप्पणी या सुझाव हैं, तो टिप्पणी छोड़ दें।