क्या C ++ को सर्वर-साइड वेब डेवलपमेंट लैंग्वेज के रूप में इस्तेमाल किया जा सकता है? [बन्द है]


34

मैं सर्वर + पर "स्क्रिप्टिंग भाषा" के रूप में C ++ का उपयोग करके वेब विकास में आना चाहता हूं। मेरा सर्वर इन्फ्रास्ट्रक्चर * निक्स आधारित है, इसलिए ए ++ पर C ++ में वेब डेवलपमेंट लागू नहीं है और C ++ / CLI ASP.NET भी लागू नहीं है।

विरासत CGI अनुप्रयोगों से अलग, क्या C ++ का उपयोग करके वेब विकास किया जा सकता है?


33
बेशक यह संभव है , सवाल यह है; क्या यह व्यावहारिक है ?
एड एस।

इस सवाल पर देखें stackoverflow.com पर।
केविन क्लाइन

24
यदि आप बहुत इच्छुक थे तो आप असेंबली को सर्वर-साइड भाषा के रूप में उपयोग कर सकते हैं।
Channel72

8
या यहां तक ​​कि ब्रेनफ * सीके यदि एक सॉकेट पर पुनर्निर्देशित किए ,जाते .हैं।
dan04

4
यह उस पहली वेब परियोजना की भयानक यादों को वापस लाता है जो मैं सीजीआई गेटवे टू सी कोड में शामिल था। जब मैं इसके बारे में सोचता हूं तब भी मैं कांप जाता हूं! :-)
ब्रायन नोब्लुक

जवाबों:


56

पूर्ण रूप से।

Wt , cppcms , CSP , और अन्य सहित उन्हें विकसित करने के लिए कई रूपरेखाएँ हैं। FastCGI का मेनलाइन कार्यान्वयन C में है, और C ++ सहित कई भाषाओं का सीधे समर्थन करता है।

कोई भी प्रोग्रामिंग भाषा जो स्ट्रिंग्स को पार्स कर सकती है उसका उपयोग CGI या सर्वलेट में किया जा सकता है। कोई भी भाषा जो C पुस्तकालयों के साथ बाइंडिंग को लागू कर सकती है, का उपयोग ISAPI- या अपाचे-संगत सर्वर के लिए मॉड्यूल विकसित करने के लिए भी किया जा सकता है।

यह सी ++ में विशेष रूप से आसान नहीं है, और अच्छे टेम्प्लटिंग इंजन कुछ और दूर हैं, लेकिन यह किया जा सकता है।

बेशक, यह सवाल कि क्या यह एक अच्छा विचार है, पूरी तरह से एक और मामला है। :)

ध्यान दें: Amazon.com, eBay और Google जैसी प्रमुख वेबसाइटें अपने बुनियादी ढांचे के कुछ हिस्सों के लिए C ++ का उपयोग करती हैं। हालांकि, एहसास है कि Google केवल C-++ का उपयोग स्पीड-क्रिटिकल सिस्टम के लिए करता है, और Amazon.com केवल हाल ही में लिस्प से दूर चला गया है (जिससे उनके कुछ वरिष्ठ कर्मचारी :)।

फेसबुक ने पहले PHP को C ++ में संकलित किया था, लेकिन उनके हिपहॉप कंपाइलर (C ++ में आंशिक रूप से लिखा गया है) को तब से बाईटेकोड वर्चुअल मशीन के रूप में देखा गया है।


2
+1 विभिन्न रूपरेखाओं का हवाला देते हुए। आपको जोड़ना चाहिए कि यह (बहुत) बड़ी वेब ऐप्स के लिए सी ++ (और अन्य भाषाओं) द्वारा संचालित होने के लिए आम है: amazon.com, google.com, अब facebook.com हिपहॉप के माध्यम से, आदि
Klem

7
@ अस्वीकरण: यह आम है, लेकिन यह नियम से नहीं है। अमेज़ॅन की वास्तुकला ऐतिहासिक रूप से लिस्प-आधारित थी और हाल ही में सी ++ में फिर से लिखा गया। Google की वास्तुकला में जावा, पायथन और अन्य शामिल हैं जो लगभग C ++ के रूप में अक्सर, विभिन्न कारणों से सभी होते हैं। फेसबुक अब केवल हिपहॉप का उपयोग करता है क्योंकि उन्हें पता चला है कि PHP स्केल नहीं है। :)
ग्रेफेड

4
मैं सहमत हूं, लेकिन मेरा मतलब था कि वे अभी भी C ++ के उपयोग के प्रसिद्ध उदाहरण हैं - सीधे मूल प्रश्न शीर्षक का जवाब देने के लिए।
स्लेम

1
@johannes Facebook की स्केलिंग की समस्या इस तथ्य से उपजी है कि उन्हें परिमाण के एक क्रम को बनाए रखना है, जो अन्यथा आवश्यक नहीं है, विशेष रूप से एक अनुकूलित PHP स्क्रिप्ट के खराब प्रदर्शन के कारण। रैखिक स्केलिंग केवल इतने बड़े बुनियादी ढांचे के लिए पर्याप्त नहीं है। लेकिन याद रखें कि "साझा कुछ भी नहीं" दृष्टिकोण PHP के लिए अनन्य नहीं है। C और C ++ भी ऐसा कर सकता है।
ग्रेफेड

1
@ उमर बात यह है कि उस कच्चे प्रदर्शन की आवश्यकता वाले 0.1% ऐप्स को छोड़कर बहुत कम रिटर्न है। आप अच्छी वेब स्टैक सहायता के साथ अधिकांश अन्य भाषाओं में उस समय के 1/3 भाग में सेवा कर सकते हैं। बैंक, वेब विज्ञापनदाता, आदि सभी C ++ का सहारा लिए बिना बड़े पैमाने पर सेवा करते हैं। यहां तक ​​कि फेसबुक भी। ट्विटर। स्टैक ओवरफ़्लो। सभी इसे उच्च स्तरीय भाषाओं में करते हैं। यहाँ रहने के लिए लेकिन यह फिर से बहुमत बनने वाला नहीं है। शायद कभी भी।
ऋग

18

क्यों नहीं?

OkCupid डेटिंग साइट सी ++ के साथ बनाया जाता है। शायद अन्य उदाहरण हैं।

C ++ के साथ वेब एप्लिकेशन विकसित करने के लिए Qt- प्रेरित टूलकिट भी है जिसे Wt कहा जाता है ।


11
"क्यों नहीं "? क्योंकि इस तरह की चीज़ के लिए अधिक समर्थन वाली भाषा का उपयोग करना बहुत आसान है।
एड एस।

5
@ ईएस एस। जैसा कि मैंने और ग्रेफेड ने बताया कि सी ++ के साथ वेब एप्लिकेशन विकसित करने के लिए रूपरेखाएं हैं।
विटोर पाय

2
हां, लेकिन फिर से, क्या वे अधिक सामान्यतः उपयोग किए जाने वाले फ्रेमवर्क के रूप में उपयोग करना आसान है? मैं ईमानदारी से पूछ रहा हूं, मैं एक वेब डेवलपर नहीं हूं और मैंने कभी भी उनका उपयोग नहीं किया है, लेकिन कुछ मुझे बताता है कि वे संभवत: परिपक्व या व्यापक रूप से उपयोग नहीं किए जाते हैं (उदाहरण के लिए) उनके रूबी / अजगर / PHP समकक्ष।
एड एस।

3
@ ईडीएस: वेब फ्रेमवर्क के साथ न तो रूबी और न ही पायथन की शुरुआत हुई। वास्तव में इसे प्रदर्शित होने में एक दशक लग गया। फ्रेमवर्क समस्या के लिए भाषा X का उपयोग करने के लिए पर्याप्त लोगों का मात्र परिणाम हैं। वही C ++ के लिए भी हो सकता है। मुख्य कारणों में यह क्यों नहीं हुआ: C ++ प्रबंधित नहीं है, संकलन करने के लिए उम्र लेता है और सामान्य रूप से एक उच्च प्रवेश बाधा है।
back2dos

1
@ back2dos: किसने कहा कि या तो भाषा को दिमाग में वेब के साथ विकसित किया गया था? मैंने निश्चित रूप से नहीं किया। मैंने "समर्थन" शब्द का इस्तेमाल किया।
एड एस।

11

यदि आप C ++ में अपना वेब एप्लिकेशन लिखने की योजना बना रहे हैं, तो यह CGI के रूप में इंटरफ़ेस करने के लिए कुल अपशिष्ट होगा।

मेरा सुझाव ASIO (एसिंक्रोनस I / O) का उपयोग करके इसे एसिंक्रोनस बनाने के लिए होगा । इसके साथ आप धधकती तेज़ वेब सेवा का निर्माण कर सकते हैं ( श्रेष्ठ प्रभावों के लिए नगणक्स के साथ रिवर्स-प्रॉक्सी और स्टेटिक्स सर्वर के रूप में संयोजन ); Wt जैसी टेम्पलेट लाइब्रेरी के साथ संयोजन करें और आप एक सर्वर से प्रति सेकंड हजारों अनुरोधों को पूरा करने के लिए तैयार हैं।

क्या यह गतिशील भाषा वेब फ्रेमवर्क का व्यावहारिक विकल्प है, एक और मुद्दा है।


9

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

तकनीकी रूप से, किसी भी भाषा का उपयोग CGI स्क्रिप्ट के रूप में किया जा सकता है:

  1. सर्वर द्वारा प्रस्तुत सभी इनपुट और पर्यावरण की व्याख्या करता है
  2. एक ज्ञात मार्कअप भाषा में आउटपुट (आमतौर पर html)
  3. सर्वर द्वारा चलाया जा सकता है

इसके अन्य तरीके भी हैं। पर्ल में सी / सी ++ कोड के आसपास एक आवरण के रूप में निर्मित होने की क्षमता है, दोनों के बीच एक व्याख्यात्मक परत के रूप में कार्य करता है (और यह पर्ल मॉड्यूल शामिल नहीं है जो सी के रूप में संकलित फ्लैट हैं)।


7

शुरुआत में, यह काफी सामान्य था - 1990 के दशक के उत्तरार्ध में मैंने जिन वेब साइटों पर काम किया, वे C ++ में लिखे गए ISAPI एक्सटेंशन थे, और उन्होंने काफी अच्छा काम किया।


3
isapi.dll कोई भी?
लाल-गंदगी

या ATLServer - atlserver.codeplex.com
gbjbaanb

5

ऐसा प्रतीत होता है कि Microsoft सोचता है कि यह भी हो सकता है। कैसाब्लांका की जाँच करें जो C ++ का उपयोग करने के लिए टूलिंग का एक नया सेट है (ऐसा प्रतीत होता है) Azure।

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

यहाँ आपको कैसाब्लांका के साथ मिलता है:

  • Windows Vista, Windows 7 और Windows 8 उपभोक्ता पूर्वावलोकन पर मूल कोड से REST सेवाओं तक पहुँचने के लिए समर्थन, HTTP, JSON और URIs को अतुल्यकालिक C ++ बाइंडिंग प्रदान करके।
  • आपके Windows 8 मेट्रो स्टाइल ऐप में C ++ HTTP क्लाइंट साइड कोड लिखने में मदद करने के लिए एक विज़ुअल स्टूडियो एक्सटेंशन SDK
  • विज़ुअल स्टूडियो एकीकरण सहित Azure के लिए मूल-कोड REST लिखने के लिए समर्थन
  • प्रथम श्रेणी प्लेटफॉर्म-ए-सर्विस (PaS) सुविधा के रूप में देशी ग्राहकों से एज़्योर बूँद और कतार भंडारण तक पहुँचने के लिए सुविधाजनक पुस्तकालय
  • C ++ 11 सुविधाओं के आधार पर अतुल्यकालिक संचालन की रचना के लिए एक सुसंगत और शक्तिशाली मॉडल
  • एरलंग अभिनेता-आधारित प्रोग्रामिंग मॉडल का एक C ++ कार्यान्वयन
  • नमूने और प्रलेखन का एक सेट

2

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

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

100+ डेस्कटॉप / टैबलेट / मोबाइलों की सामूहिक शक्ति के साथ सब के बाद आप के लिए प्रसंस्करण कर रही है कि एक डेटासेंटर में बैठे अपने सर्वर की तुलना में कहीं अधिक शक्ति है कहीं न कहीं आपके व्यवसाय के पैसे हर महीने चल रहे हैं। संभावित रूप से तब आपका सभी सर्वर डेटाबेस से डेटा प्राप्त कर रहा होगा, डेटाबेस में वापस स्टोर करने से पहले सामग्री की सेवा और डेटा के पूर्व / पोस्ट प्रसंस्करण और डेटा के सत्यापन के लिए थोड़ा सा। जाहिर है कि आप क्लाइंट साइड कोड को भी सीपीयू इंटेंसिव नहीं बनायेंगे जो वेब ब्राउजर यूआई को ब्लॉक / फ्रीज कर सकता है, आप सर्वर के लिए एक AJAX अनुरोध को बंद कर सकते हैं, डेटा को पुनः प्राप्त कर सकते हैं और फिर वेब को छोड़कर अतुल्यकालिक क्लाइंट-साइड डेटा को प्रोसेस कर सकते हैं। -Browser UI पूरी तरह से प्रयोग करने योग्य।


2

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

परिणाम एक एकल कार्यक्रम है जो एक वेब सर्वर और एक गतिशील पृष्ठ जनरेटर ("अपाचे" और "php" दोनों को शामिल करता है) दोनों है, इसमें sqlite के माध्यम से डेटाबेस का उपयोग भी होगा।

प्रयुक्त पुस्तकालय:

  • Mongoose - Http सर्वर
  • Sqlite - SQL डेटाबेस
  • MiniXML - गतिशील पेज पीढ़ी को आसान बनाता है। जावास्क्रिप्ट की तरहcreateElement

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

1. 3 पुस्तकालयों को डाउनलोड करें

2. अपना फोल्डर तैयार करें

  • एक खाली फ़ोल्डर बनाएँ (हम इसे मुख्य फ़ोल्डर कहेंगे)
  • इसमें निम्नलिखित फाइलें रखें:
    • Sqlite से tar.gz: sqlite3.c , sqlite3.h
    • Mongoose ज़िप से: mongoose.c , mongoose.h
    • Mxml से tar.gz: mxml.h

3. संकलन एमएक्सएमएल

आपने देखा होगा कि mxml.c गायब है, ऐसा इसलिए है क्योंकि हमें एक स्थिर mxml लाइब्रेरी बनाने की आवश्यकता है। उस फ़ोल्डर पर जाएँ जहाँ mxml tar.gz डाउनलोड किया गया था और प्रदर्शन:

tar -xvf mxml-<version>.tar.gz #Extract the tar
cd mxml-<version> #Go to the newly extracted directory
./configure #prepare the compiler
make #compile, you may need to install "make" first.

एक बार संकलन समाप्त हो जाने के बाद, कई फाइलें उत्पन्न हो जाएंगी, हमारे लिए केवल ब्याज की फाइल है libmxml.a, उस फाइल को मुख्य फ़ोल्डर में कॉपी करें।

3.1 डबलचेक

जांचें कि मुख्य फ़ोल्डर में निम्नलिखित हैं:

  • आम के लिए: mongoose.c, mongoose.h
  • Mxml के लिए: libmxml.a, mxml.h
  • sqlite के लिए: sqlite.c, sqlite.h

4. मुख्य सी.सी.

चलो वास्तविक कार्यक्रम बनाते हैं, main.cमुख्य फ़ोल्डर में एक फ़ाइल बनाते हैं , यहां आपको आरंभ करने के लिए एक कंकाल है।

#include <string.h>
#include <stdio.h>

#include "mongoose.h"
#include "mxml.h"
#include "sqlite3.h"

/***Sqlite initialization stuff***/
//comment out everything sqlite related if you don't want sqlite, including the callback function and the include "sqlite3.h"
static int callback(void * custom, int argc, char **argv, char **azColName);
char *zErrMsg = 0;
sqlite3 *db;
int rc;

/***Just some laziness shortcut functions I made***/
typedef mxml_node_t * dom; //type "dom" instead of "mxml_node_t *"
#define c mxmlNewElement   //type "c" instead of "mxmlNewElement"
inline void t(dom parent,const char *string) //etc
{
    mxmlNewText(parent, 0, string);
}

//type "sa" instead of "mxmlElementSetAttr"
inline void sa(dom element,const char * attribute,const char * value) 
{
    mxmlElementSetAttr(element,attribute,value);
}




//The only non boilerplate code around in this program is this function
void serve_hello_page(struct mg_connection *conn)
{
    char output[1000];
    mg_send_header(conn,"Content-Type","text/html; charset=utf-8");
    mg_printf_data(conn, "%s", "<!DOCTYPE html>");
    //This literally prints into the html document


    /*Let's generate some html, we could have avoided the
     * xml parser and just spat out pure html with mg_printf_data
     * e.g. mg_printF_data(conn,"%s", "<html>hello</html>") */

    //...But xml is cleaner, here we go:
            dom html=mxmlNewElement(MXML_NO_PARENT,"html");
                dom head=c(html,"head");
                    dom meta=c(head,"meta");
                    sa(meta,"charset","utf-8");
                dom body=c(html,"body");
                    t(body,"Hello, world<<"); //The < is auto escaped, neat!
                    c(body,"br");
                    t(body,"Fred ate bred");    
                dom table=c(body,"table");
                sa(table,"border","1");

                //populate the table via sqlite
                rc = sqlite3_exec(db, "SELECT * from myCoolTable", callback, table, &zErrMsg);
                if( rc!=SQLITE_OK )
                {
                    fprintf(stderr, "SQL error: %s\n", zErrMsg);
                    sqlite3_free(zErrMsg);
                }

            mxmlSaveString (html,output,1000,  MXML_NO_CALLBACK);
            mg_printf_data(conn, "%s", output);
            mxmlDelete(html); 
}

//sqlite callback
static int callback(void * custom, int argc, char **argv, char **azColName)
{
    //this function is executed for each row
    dom table=(dom)custom;

    dom tr=c(table,"tr");
    dom td;
    int i;
    for(i=0; i<argc; i++)
    {
        td=c(tr,"td");
        if (argv[i])
            t(td, argv[i]);
        else
            t(td, "NULL");

        printf("%s == %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
     printf("\n");
     return 0;
}


static int event_handler(struct mg_connection *conn, enum mg_event ev)
{
    if (ev == MG_AUTH)
    {
        return MG_TRUE;   // Authorize all requests
    }
    else if (ev == MG_REQUEST)
    {
        if (!strcmp(conn->uri, "/hello"))
        {
            serve_hello_page(conn);
            return MG_TRUE;   // Mark as processed
        }
    }
    return MG_FALSE;  // Rest of the events are not processed

}

int main(void)
{
    struct mg_server *server = mg_create_server(NULL, event_handler);
    //mg_set_option(server, "document_root", "."); //prevent dir listing and auto file serving
    //TODO can I allow file listing without dir listing in a specified directory?
    mg_set_option(server, "listening_port", "8080");


    rc = sqlite3_open("db.sqlite3", &db); 

    if( rc )
    {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return(1);
    }

    printf("Server is running on port 8080!\n");
    for (;;)
    {
        mg_poll_server(server, 1000);  // Infinite loop, Ctrl-C to stop
    }
    mg_destroy_server(&server);
    sqlite3_close(db);

    return 0;
}




/*
 * useful stuff:
 * mg_send_file(struct mg_connection *, const char *path); - serve the file at *path*/

अंत में, संकलन!

संकलन करते हैं। cdअपने मुख्य फ़ोल्डर में और इन पर अमल करें:

gcc -c main.c
gcc -c mongoose.c
gcc -c sqlite3.c
gcc -o server.out main.o mongoose.o sqlite3.o -ldl -lpthread -lmxml -L . 

अब, server.out के साथ निष्पादित करें /server.out, और नेविगेट करेंlocalhost:8080/hello

किया हुआ :)



@ हे: इस मानगो विकल्प को इंगित करने के लिए धन्यवाद, मैं हमेशा समुदाय संचालित परियोजनाओं को प्राथमिकता देता हूं। मैं पूरी तरह से इसका परीक्षण करने के बाद अपने जवाब में शायद मैंगोसे को सिवेतवेब से बदल दूंगा।
नमस्ते विश्व

0

मुझे लगता है कि कई एम्बेडेड सिस्टम (जैसे राउटर, प्रिंटर, ...) में कुछ सी ++ संचालित वेब सर्वर है।

विशेष रूप से, आप कुछ HTTP सर्वर लाइब्रेरी का उपयोग कर सकते हैं, जैसे कि परिवाद कुछ सी या सी ++ प्रोग्राम के लिए कुछ वेब क्षमताओं को जोड़ने के लिए, या कुछ वेब इंटरफेस के साथ एक प्रकाश सर्वर विकसित करने के लिए।

कुछ लोग Ocsigen का उपयोग करके Ocaml में अपने वेब सर्वर या अपने HTTP इंटरफ़ेस को कोड कर रहे हैं । हर वेब चीज PHP नहीं है। और FastCGI के साथ आप अपने आवेदन में कुछ गतिशील वेब प्रसंस्करण कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.