2011-08-10 12 views
8

जो मैं करने की कोशिश कर रहा हूं वह उसी वेब एप्लिकेशन के कई संस्करणों को संभालने के लिए है, कुछ हद तक Google अपने कुछ उत्पादों के साथ करता है जहां आपको "नया संस्करण आज़माएं" लिंक मिलता है।एक ही यूआरएल में कई संस्करणों को संभालें

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

अब, ऐसा करने का एक बहुत ही आसान तरीका प्रत्येक संस्करण को अपने सबफ़ोल्डर में डालना होगा, जैसे www.mywebapp.com/v1 और www.mywebapp.com/v2।

हालांकि, मैं इसे उपयोगकर्ता और वेबपैप यूआरएल के लिए पारदर्शी होना चाहता हूं (उदा। Www.mywebapp.com/)।

उपयोगकर्ता को लॉग इन करने के बाद कौन सा संस्करण लोड किया जाना चाहिए सर्वर के पक्ष में निर्धारित किया जाना चाहिए (उदाहरण के लिए: दिए गए उपयोगकर्ता के लिए सक्रिय संस्करण डीबी में संग्रहीत है) और बाद में जब उपयोगकर्ता "नए संस्करण को आजमाए" "/" पुराने संस्करण पर वापस जाएं "लिंक।

सर्वर पक्ष पर मुझे MySQL, PHP और अपाचे के साथ करना होगा।

मैं पहले से ही प्रत्येक संस्करण को अपने सबफ़ोल्डर में रखने के लिए काम कर रहा हूं, फिर कुकीज में संस्करण जानकारी संग्रहीत कर रहा हूं (प्रत्येक लॉगिन या पेज रीफ्रेश पर सर्वर द्वारा अपडेट किया गया) और रिवाइट्रूल (ओं) का उपयोग "प्रॉक्सी" अनुरोधों से कर रहा है उचित उपफोल्डर के लिए आधार/संस्करण रहित यूआरएल। यदि कोई कुकी सेट नहीं है, तो एक डिफ़ॉल्ट फ़ोल्डर को फ़ॉलबैक रिवाइटरूल द्वारा चुना जाता है।

यह क्लज काम करता है लेकिन बेहद नाजुक लगता है और यह अपाचे डिमन पर अतिरिक्त बोझ डालता है, इसलिए मैं पूछ रहा हूं कि कोई ऐसा करने का बेहतर तरीका जानता है या नहीं।

धन्यवाद!

+0

इस बारे में कौन सा हिस्सा आपको नाजुक लगता है? कुकी या प्रॉक्सी में जानकारी संग्रहीत करना? –

उत्तर

2

मुझे लगता है कि PHP में एक बेहतर तरीका डेटाबेस से पूछताछ करना होगा, वांछित संस्करण प्राप्त करना होगा, और फिर include() इसे उपफोल्डर से प्राप्त करना होगा। इस तरह यह उपयोगकर्ता के लिए पारदर्शी है।

उदाहरण के लिए, उपयोगकर्ता संभालने नया बीटा के लिए में विकल्प चुना है, तो आप डेटाबेस में अपने प्रवेश,

UPDATE `versions_table` SET (`version`) VALUES ('1.02b') WHERE `userid` = 5 

बचाने और फिर जब वह पृष्ठ पर पहुंचता है, तो आप कुछ इस तरह है पर जा रहा:

//PDO Connection here, skipped for example purposes 
$stmt = $pdo->query('SELECT `version` from `versions_table` WHERE `userid` = 5 LIMIT 1'); 
//Of course 5 is only an example, in actual code that would be a variable 
//representing the actual user ID. 
$row = $stmt->fetch(); //Should be only one row. 
include_once($row['version'].'/myApp'.'.php'); //Include 1.02b/myApp.php 
+0

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

2

अपनी वेबसाइट के रूट फ़ोल्डर में एक भी route.php फाइल करने के लिए सभी अनुरोध मार्ग बदलने के लिए एक भी फिर से लिखना का उपयोग करें।

route.php फ़ाइल इस तरह दिखना चाहिए:

$user = authenticateUser(); 
$version = $user->getPreferredVersion(); 

$filePath = $_SERVER['DOCUMENT_ROOT'].'v'.$version.$_SERVER['REQUEST_URI']; 

if(!file_exists($filePath)) { 
    header("Status: 404 Not Found", true, 404); 
    die(); 
} 

$pathDetails = pathinfo($filePath); 

if($pathDetails['extension'] == 'php') { 
    require($filePath); 
} else { 
    if($pathDetails['extension'] == 'jpg') { 
     header('Content-Type: image/jpeg'); 
    } elseif($pathDetails['extension'] == 'gif') { 
     ... 
    } elseif (...) { 
     ... 
    } else { 
     // unsupported file type 
     header("Status: 404 Not Found", true, 404); 
     die(); 
    } 
    echo file_get_contents($filePath); 
} 

यह है कि तुम क्या route.php में क्या करना चाहिए वहाँ कुछ अन्य सुरक्षा और तकनीकी मुद्दों है कि आप उस फ़ाइल में का ध्यान रखना चाहिए रहे हैं की रूपरेखा है।

+0

आपके सुझाव के लिए धन्यवाद, लेकिन यह दृष्टिकोण बहुत से अवांछित साइड इफेक्ट्स बनाने जैसा प्रतीत होता है जैसे: 1) रिश्तेदार सबफ़ोल्डर में रखी गई PHP फाइलों में शामिल है, काम करना बंद कर देता है, 2) कोड जो पूरे ऐप को दस्तावेज़ रूट स्क्रू अप में होने की अपेक्षा करता है, 3) PHP के माध्यम से proxying छवियों और अन्य सामान द्वारा आप अपाचे (Etags, आदि) के साथ आने वाले सभी प्रदर्शन और कैशिंग लाभ जब्त करते हैं। – Sergio

+0

@sergio वे "अन्य तकनीकी मुद्दों" में से कुछ हैं जो मैंने उल्लेख किया है कि आपको देखभाल करनी चाहिए। आपकी तीसरी चिंता को 'path.php' में उचित कैश-कंट्रोल, अंतिम-संशोधित और एटैग हेडर भेजकर आसानी से संभाला जा सकता है। 'शामिल (dirname (__ FILE __) '/ ../somefile.php') का उपयोग करके तीसरी स्थिति को संभालें। 'सापेक्ष करने के लिए विधि में शामिल हैं और केवल अपनी दूसरी चिंता में स्थितियों से बचें। इस विधि पर जोर देने का कारण यह है कि किसी अन्य विधि जो संस्करण स्विच के लिए पूरी तरह से कुकीज़ पर निर्भर करती है, वह "नाजुक" है जैसा आपने इसे रखा है। – nobody

0

हालांकि नियम बनाने के लिए रूटिंग तंत्र और सत्र जानकारी का उपयोग करना संभव है, तो मैं आपके वर्तमान समाधान को रखना चाहूंगा। PHP में इसे लागू करके आप जो भी करेंगे, वह यह है कि आप लोड को apache2 (जो पहले से ही बहुत तेज़ रिवाइट-इंजन) से php-binary में दबाते हैं। साथ ही, आप डेटा, कुकीज़ और अन्य सत्र-आधारित चर की असंगतताओं के कारण अपने आवेदन को हस्तक्षेप संस्करणों के जोखिम में डाल देंगे।

दूसरी ओर, आपको पुस्तकालयों, डोमेन मॉडल, डेटा मैपर इत्यादि जैसी साझा वस्तुओं की पुन: प्रयोज्यता का लाभ है, लेकिन मेरी राय में यह लाभ खराब प्रदर्शन और हस्तक्षेप जोखिम को कम नहीं करता है।

तो एक वाक्यांश में, मेरा मानना ​​है कि आपका वर्तमान समाधान सबसे अच्छा है।

6

htaccess allows for rewrites based on the contents of cookies। चूंकि अपाचे रीडायरेक्ट पर अद्भुत है और PHP पर्याप्त है, इसलिए मैं इसे इस तरह से संभालूंगा।

यह उदाहरण यह देखने के लिए परीक्षण करता है कि कोई वर्दी कुकी है या नहीं। यदि ऐसा है, तो यह 'vers =' + जो भी बनाम कुकी में अनुरोध में था, जोड़ता है।

RewriteEngine On 
RewriteBase/
RewriteCond %{HTTP_COOKIE} vers=([^;]+) [NC] 
RewriteRule ^(.*)$ /$1?vers=%1 [NC,L,QSA] 

(कि उदाहरण here पाया जा सकता है)

+0

धन्यवाद, लेकिन यह मूल रूप से क्या मैं पहले से ही कर रहा हूँ :) अधिक विशिष्ट मैं भी तरह छोरों से बचने के लिए कुछ बयान को शामिल किया है होना करने के लिए है: पर RewriteCond% {IS_SUBREQ}^झूठी $ RewriteCond% {ENV RewriteEngine: REDIRECT_STATUS}^$ रिवाइटकंड% {HTTP_COOKIE} संस्करण = ([ए-जे 0-9] +) [एनसी] रिवाइट्रूल^(। *)/V_% 1/$ 1 [एनएस, एल] – Sergio

+0

+1, यह एक है अच्छा दृष्टिकोण, और अपाचे के लिए बहुत अधिक काम नहीं है – Joshua

0

अपने संस्करण एड पेज/IFRAME और IFRAME src में wepages हो सकता है "webapp.com/v2" लोड ..

तो जो भी संस्करण उपयोगकर्ता का चयन करता है आपका पता बार पढ़ा जाएगा webapp.com..but अपने iFrame uRL संस्करण के आधार पर बदलता रहता है ..

नियमों को फिर से लिखने लिखने के लिए कोई जरूरत नहीं है ..

0

यह मदद कर सकता है: मैं क्या उपयोग कर रहा हूँ के लिए एक महीने अब है

  1. डेटाबेस में सभी फाइलों को रखें (पथ, कोड, संस्करण = दशमलव (3,1), झंडा: स्थिर = 3/प्रयोगशाला = 2/बीटा = 1/अल्फा = 0)

  2. .htaccess सभी गैर मौजूदा फ़ाइलों पुनर्निर्देश (चित्र, सीएसएस, रीडायरेक्ट नहीं करते है js या अन्य स्थिर गैर संस्करण-खा लिया फ़ाइलें) आंतरिक रूप से loader.pm को (आपके लिए loader.ph_) भिन्नता के लिए अपनी अन्य फ़ाइलों के समान एक्सटेंशन का उपयोग न करें

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule^ loader.pm [L,QSA] 
    
  3. लोडर नवीनतम स्थिर संस्करण डेटाबेस या बीटा संस्करण से लोड करता है यदि कोई स्थिर संस्करण मौजूद नहीं है।

    SELECT code, version, flag FROM table WHERE path = ? AND flag > 0 ORDER BY flag DESC, version DESC LIMIT 1 अल्फा पृष्ठों है कि काम चल रहा है

    उत्पादन 404 त्रुटि यदि कोई परिणाम नहीं, और

    जब संस्करण की तरह ?v=2.0 लोडर फ़ाइल निर्दिष्ट किया जाता है का उपयोग करता है अलग क्वेरी न दिखाएं

    SELECT code, version, flag FROM table WHERE path = ? AND version <= ? ORDER BY flag DESC LIMIT 1

मानदंड:

  1. उपयोगकर्ता या तो स्थिर या नवीनतम चाहते हैं; इसलिए आपको वास्तव में प्रति पथ 2 से अधिक फाइलों की आवश्यकता नहीं है; जब तक आप शोकेस के लिए पुराने संस्करण नहीं रखना चाहते हैं।यदि उपयोगकर्ता नवीनतम चाहते हैं, तो .. ORDER BY version DESC, flag DESC, ..
  2. उपयोगकर्ता को यह जानने की परवाह नहीं है कि यह कौन सा संस्करण है, इसलिए एक ही समय में पूरी वेबसाइट के लिए समान संस्करण सेट करने की बजाय, हम प्रत्येक फ़ाइल का अलग-अलग संस्करण अलग-अलग; तो विकास ट्रैकिंग आसान है।

समस्याएं:

  • नहीं सूचकांक/प्राथमिक कुंजी
    • आप सुनिश्चित करें कि आप डुप्लिकेट प्रविष्टियों की जरूरत नहीं है बनाने की जरूरत है, यह अपनी वेबसाइट को तोड़ने नहीं देंगे, हालांकि, लेकिन यह अच्छा नहीं लगेगा;)
    • यदि एक ही बीटा & फ़ाइल के लिए स्थिर संस्करण मौजूद है, और उपयोगकर्ता ने नवीनतम (बीटा) का चयन किया है; तो आप गलती से उसे स्थिर फ़ाइल के बजाय बीटा फ़ाइल वितरित कर सकते हैं।
  • क्वेरी स्ट्रिंग चर ?v= संस्करणों के चयन के लिए आरक्षित है, लेकिन यह ठीक है; आप ?var=
0

एक क्लाउड प्लेटफार्म है जो इसे स्वचालित रूप से तैनाती पर करता है। www.cycligent.com
दो संस्करणों को तैनात करने के बाद यह एक कुकी सेट करने की बात है। दिखाए गए कुछ अन्य उत्तरों की तुलना में बहुत कम काम।
पूर्ण प्रकटीकरण: मैं चक्रवात के लिए काम करता हूं।

संबंधित मुद्दे