إنشاء موقع باستخدام C ++

هل هذا ممكن؟


نعم.

أعلم أن هذا يبدو غريباً ويشبه إلى حد كبير تمرين بلا قيمة ، لكنه ليس كذلك.
في هذه المقالة ، سوف أخبرك كيف يمكنك استخدام C ++ في تطوير موقع الويب ، وسأقدم بعض الأسباب الجيدة لذلك.

لن تكون مثيرة للاهتمام فحسب ، بل ستكون مفيدة وعملية للغاية أيضًا.

استضافة


ربما تعتقد: لا يمكن تنفيذ مثل هذا التكوين غير العادي إلا في بيئة متخصصة. ومع ذلك ، هذا ليس هو الحال عادة. على الرغم من أن الخادم الخاص العادي أو الافتراضي سيكون حلاً مثاليًا للعديد من المواقع (وليس فقط مواقع C ++) ، يمكنك في معظم الحالات استخدام C ++ على خدمات الاستضافة المشتركة.
أي استضافة ويب تدعم CGI (أي ، من حيث المبدأ ، كل شيء) ستكون قادرة على دعم موقع في C ++. حسب الموفر ، يمكنك إما ترجمة موقعك محليًا أو لا ، وستحتاج إلى المترجم المضمّن في حسابك. تحقق منها إذا كنت تخطط للتحرير والتجميع عبر SSH مباشرة على خادم الويب.

مثال بسيط


في الأمثلة أعلاه ، أستخدم حساب استضافة cPanel. أنها بأسعار معقولة وغير مكلفة ومتسقة. ولكن يمكنك بسهولة تكييف هذه الأساليب مع خادم افتراضي أو مخصص أو مثيل Amazon EC2 مع بعض تعديلات تكوين Apache البسيطة.

يزودنا cPanel بمجلد cgi-bin ، لكننا لسنا في حاجة إليه. في معظم الحالات ، سيتم معالجة أي ملف بالامتداد .cgi تلقائيًا إذا كان لديه الأذونات الصحيحة (عادةً ما تكون 0755). فيما يلي الملفات الضرورية (تأكد من استخدام TAB في Makefile)

ماكيفيلي:

all: g++ -O3 -s hello.cpp -o hello.cgi clean: rm -f hello.cgi 

hello.cpp:

 #include <iostream> #include <string> #include <stdlib.h> using namespace std; void set_content_type(string content_type) { cout << "Content-type: " << content_type << "\r\n\r\n"; } void set_page_title(string title) { cout << "<title>" << title << "</title>\n"; } void h1_text(string text) { cout << text << "\n"; } int main() { set_content_type("text/html"); // Output HTML boilerplate cout << "<!doctype html>\n"; cout << "<html lang=\"en\">\n"; cout << "<head>\n"; set_page_title("Hello, World!"); cout << "</head>\n"; cout << "<body>\n"; h1_text("Hello, World!"); cout << "</body>\n"; cout << "</html>"; return 0; } 

إذا كانت لديك برامج ترجمة مضمّنة في حسابك (قد تحتاج إلى مطالبة فريق الدعم باستضافة موقعك على الويب) ، فما عليك سوى استخدام SSH في حسابك ، ثم ضع هذه الملفات في مجلد public_html ، ثم قم بما يلي:

 make 

سيتم تنفيذ ملف hello.cgi. إذا قمت بإدخال عنوان الملف في متصفح ، على سبيل المثال ، مثل هذا:

 http://your-test-site.com/hello.cgi 

ثم استبدل your-test-site.com باسم نطاقك أو عنوان URL الخاص بالاستضافة. يجب أن يظهر "Hello World" على الشاشة.

قبل الغوص في الشفرة نفسها ، دعونا ننظر في كيفية عملها على خادم الويب. عندما يقبل Apache الطلب ، فإن أول ما ينظر إليه هو قاعدة معالج الكتابة الداخلية أو الكتابة فوقها ، ثم يبحث على القرص عن الملف المطابق للطلب. في حالتنا ، يجد hello.cgi ويسترجعه. لا يقبل برنامجنا الإدخال ، لكنه يعرض الرسالة "Hello world" فقط. ثم يتلقى Apache هذه البيانات ويعيدها إلى المستخدم.

عند الحديث عن الكود ، يجب ذكر أنه يمكن أن يكون أسهل. لم يكن من الضروري تضمين وظائف منفصلة set_content_type و set_page_title و h1_text. هناك مساعدين بسيطين يحافظون على النظافة في الوظيفة الرئيسية. كل هذا يمكن ببساطة نقله إلى الوظيفة الرئيسية ، وسيعمل بنفس الطريقة تمامًا.

ولكن آمل أن ترى ميزة في تسليط الضوء على هذه الميزات. إذا كنت بحاجة إلى إنشاء وظيفة لكل عنصر من عناصر HTML ، فيمكنك استخدام هذا الرمز لإنشاء استجابة استجابة نظيفة في البرنامج:

 void p(string text) { cout << "<p>" << text << "</p>\n"; } 

ثم استخدم شيئًا مثل:

 p("This would be paragraph text."); 

لعرض فقرة.

يمكنك حتى تطوير هذه الفكرة بحيث تعمل الداعم المساعد مثل p ، h1_text ، إلخ ، على إعادة النص بدلاً من الإخراج المباشر إلى الإخراج القياسي عبر cout. في الوقت نفسه ، يمكنك إنشاء نظام قوالب أو إجابات متداخلة لإنشاء صفحات معقدة برمز C ++ مبسط وفعال للغاية.

هذا المثال بسيط بقدر الإمكان ، فهو يشير فقط إلى النقاط الرئيسية. لديك حق الوصول الكامل إلى كل رأس استجابة ، مما يتيح لك السيطرة الكاملة على حلقة الاستجابة.

المزيد عن المدخلات


مثالنا لا يقبل أي مدخلات ، بل يعرض فقط "Hello World". لكن Apache يستجيب لكل طلب بكمية هائلة من المعلومات من خلال متغيرات البيئة. يمكنك استخدام دالة getenv () في مكتبة C القياسية للحصول على قيمها (لا تنسَ إضافة # تضمين <stdlib.h> في بداية التعليمات البرمجية). على سبيل المثال ، إذا كنت بحاجة لمعرفة URI للطلب الكامل ، فستستخدم:

 string request_uri = getenv("REQUEST_URI"); 

للحصول على هذه القيمة. المتغيرات المفيدة الأخرى:

  • REMOTE_ADDR - الحصول على عنوان IP للزائر
  • REQUEST_METHOD - إرجاع طريقة (مثل GET أو POST أو ما إلى ذلك)
  • DOCUMENT_ROOT - مسار الموقع (عادةً ~ / public_html على الأنظمة المشتركة أو / var / www / html على الخوادم الافتراضية / المخصصة).
  • QUERY_STRING - سلسلة استعلام للحصول على متغيرات GET.

مثال أوضح


بالطبع ، من الممكن تحليل متغيرات GET يدويًا ، ويمكن إجراء متغيرات POST عن طريق التحقق من المدخلات القياسية. يمكنك حتى تلقي وتعيين ملفات تعريف الارتباط عن طريق تغيير رؤوس الطلب والرد. ولكن كلا النهجين شاقة للغاية.

يمكنك كتابة الأصداف الخاصة بك أو استخدام مكتبة GNU cgicc الجاهزة. أنه يحتوي على وظائف المساعد لتعديل HTML ومعالجة النماذج. في العمل مع المشاريع الكبيرة ، سيؤدي استخدام هذه المكتبة إلى توفير الوقت بشكل لائق.

في دبيان وأوبونتو ، يمكنك تثبيت المكتبة والرؤوس باستخدام:

 apt install libcgicc5 libcgicc5-dev 

لكن CentOS / RHEL ليس لديها حزم خاصة بها. للتثبيت عليها ، قم بتشغيل:

 cd /usr/local/src wget ftp://ftp.gnu.org/gnu/cgicc/cgicc-3.2.19.tar.gz tar xfz cgicc*.tar.gz cd cgicc* ./configure — prefix=/usr make make install 

ملاحظة: كان الإصدار 3.2.19 هو أحدث إصدار في وقت كتابة هذا التقرير ، ولكن يمكنك التحقق من وجود نسخة أحدث على الموقع ftp.gnu.org/gnu/cgicc . لقد استخدمت أيضًا / usr كبادئة لتجنب مشاكل ربط المكتبات. إذا كان أي شيء ، وتغيير بهدوء لهم.

بعد تثبيت cgicc ، يمكنك تجميعه. جرب هذا المثال ، الذي يأخذ الإدخال من نموذج ويعرضه في المستعرض:

ماكيفيلي:

 all: g++ -O3 -s hello.cpp -o hello.cgi g++ -O3 -s cgicc.cpp -o cgicc.cgi /usr/lib/libcgicc.a clean: rm -f hello.cgi cgicc.cgi 

cgicc.html:

 <!doctype html> <html lang="en"> <head> <title>cgicc Test</title> </head> <body> <form method="POST" action="cgicc.cgi"> <label for="name">Name</label> <input name="name" type="text" value=""> <input name="submit" type="submit" value="Submit"> </form> </body> </html> 

cgicc.cpp:

 #include <iostream> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; void set_content_type(string content_type) { cout << "Content-type: " << content_type << "\r\n\r\n"; } void set_page_title(string title) { cout << "<title>" << title << "</title>\n"; } void h1_text(string text) { cout << text << "\n"; } int main() { Cgicc cgi; string name; set_content_type("text/html"); cout << "<!doctype html>\n"; cout << "<html lang=\"en\">\n"; cout << "<head>\n"; set_page_title("cgicc Test"); cout << "</head>\n"; cout << "<body>\n"; cout << "<p>"; // Grab the "name" variable from the form name = cgi("name"); // Check to make sure it isn't empty. if (!name.empty()) { cout << "Name is " << name << "\n"; } else { cout << "Name was not provided."; } cout << "</p>\n"; cout << "</body>\n"; cout << "</html>"; return 0; } 

ربما لاحظت أنني ربطت بشكل ثابت مكتبة cgicc في Makefile. على الرغم من أن هذا ليس ضروريًا (يمكنك استبداله بـ -Icgicc) ، إلا أنني أفضل الربط الثابت بين الكود الثنائي الذي أرسله إلى الخادم بحيث يتم إرسال كل ما هو مطلوب لتشغيل البرنامج كمجموعة.

في هذا المثال ، تقوم مكتبة cgicc بالعمل الجاد لمتغيرات POST وتعيد إلينا "الاسم".

لم أفلت من متغير الإدخال POST ، لكن يوصى به ، خاصة في أماكن الإنتاج ، خاصةً إذا كنت تتفاعل مع قاعدة البيانات.

هذا ليس سوى جزء صغير من إمكانيات cgicc. يمكنك قراءة الوثائق كاملة هنا .

الأداء / الأداء


C ++ سريع بشكل لا يصدق في العمل مع رمز جيد. تعمل واجهة CGI على إبطاء الأمور قليلاً ، ولكن حتى تحصل على تنفيذ أفضل من اللغات التي يتم تفسيرها مثل PHP.
كما يقولون ، هناك دائمًا شيء يجب السعي إليه. في بيئة متخصصة أو افتراضية ، يمكنك استخدام دعم FastCGI من Nginx أو Apache لتقليل التأخير الصغير (وغير الواضح إذا لم يتم تحميل الخادم بشكل كبير) في وقت تحميل البرنامج. لم يكن هناك أي تأخير في اختباراتي ، ولكن للعمل مع موقع ويب به حركة مرور محمولة ، سيكون من المفيد دراسة هذه الحلول من أجل تنفيذ أسرع / عمل سريع

بالإضافة إلى ذلك


سيكون من السهل التفاف برنامج C ++ في حاوية Docker رقيقة. سيوفر لك هذا مرونة كبيرة عند وضع الموقع. يمكنك أيضًا الوصول إلى قاعدة بيانات MySQL من خلال تضمين رؤوس تطوير C / C ++ MySQL في البرنامج. إذا كنت معتادًا على استخدام MySQL مع PHP ، ستلاحظ أن أسماء المتغيرات متشابهة جدًا.

بدلاً من إنشاء عمليات سطر أوامر إضافية لمعالجة الصور ، يمكنك تضمين رؤوس ImageMagick C ++ لمعالجة هذه الصور مباشرة في برنامجك

يا لها من رحلة طويلة وغريبة


إنشاء موقع في C ++ أمر عملي ، خاصة إذا كان الأداء مهمًا. لا أوصي بهذا لمدونة أو موقع شخصي - يمكن إجراؤها بسهولة على WordPress. ولكن إذا كانت لديك حاجة ملحة للسرعة ورغبة في الكتابة جيدًا على مسار هزم ، فكر في C ++ لمشروعك التالي المتخصص على الويب.

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


All Articles