Apakah ini mungkin?
Ya
Saya tahu itu terdengar aneh dan lebih mirip latihan dalam ketidakberdayaan, tapi ternyata tidak.
Pada artikel ini saya akan memberi tahu Anda bagaimana Anda dapat menggunakan C ++ dalam pengembangan situs web, dan saya akan memberikan beberapa alasan bagus untuk ini.
Ini tidak hanya menarik, tetapi juga berguna dan sangat praktis.
Hosting
Anda mungkin berpikir: konfigurasi yang tidak biasa seperti itu hanya dapat diimplementasikan dalam lingkungan khusus. Namun, ini biasanya tidak demikian. Terlepas dari kenyataan bahwa server khusus biasa atau virtual akan menjadi solusi ideal untuk banyak situs (bukan hanya situs C ++), dalam kebanyakan kasus Anda dapat menggunakan C ++ pada layanan hosting bersama.
Setiap web hosting yang mendukung CGI (pada prinsipnya, segalanya) akan dapat mendukung situs dalam C ++. Bergantung pada penyedia, Anda dapat mengkompilasi situs Anda secara lokal atau tidak, dan Anda akan memerlukan kompiler yang termasuk dalam akun Anda. Periksa mereka jika Anda berencana untuk mengedit dan mengkompilasi melalui SSH langsung di server web.
Contoh sederhana
Dalam contoh di atas, saya menggunakan akun hosting cPanel. Mereka terjangkau, murah dan konsisten. Tetapi Anda dapat dengan mudah mengadaptasi metode ini ke virtual atau dedicated server atau Amazon EC2 misalnya dengan beberapa modifikasi konfigurasi Apache sederhana.
cPanel memberi kami folder cgi-bin, tetapi kami tidak membutuhkannya. Dalam kebanyakan kasus, file apa pun dengan ekstensi .cgi akan diproses secara otomatis jika memiliki izin yang benar (biasanya 0755). Berikut adalah file yang diperlukan (pastikan untuk menggunakan TAB di Makefile)
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; }
Jika Anda memiliki kompiler yang termasuk dalam akun Anda (Anda mungkin perlu meminta tim dukungan untuk hosting web Anda), cukup gunakan SSH di akun Anda, letakkan file-file ini di folder public_html, lalu lakukan:
make
File hello.cgi akan dieksekusi. Jika Anda memasukkan alamat file di browser, misalnya, seperti ini:
http:
Kemudian gantilah-test-site.com Anda dengan nama domain atau URL hosting Anda. "Hello World" akan muncul di layar.
Sebelum menyelam ke dalam kode itu sendiri, mari kita lihat cara kerjanya di server web. Ketika Apache menerima permintaan, hal pertama yang dilihatnya adalah aturan internal handler atau overwriting, kemudian terlihat pada disk untuk file yang cocok dengan permintaan. Dalam kasus kami, ia menemukan hello.cgi dan mengambilnya. Program kami tidak menerima input, tetapi hanya menampilkan pesan "Hello world". Apache kemudian menerima data ini dan mengembalikannya kepada pengguna.
Berbicara tentang kode, harus disebutkan bahwa itu bisa lebih mudah. Itu tidak perlu untuk memasukkan fungsi terpisah set_content_type, set_page_title dan h1_text. Ada pembantu sederhana yang menjaga kebersihan di fungsi utama. Semua ini dapat dengan mudah dibawa ke fungsi utama, dan itu akan bekerja dengan cara yang persis sama.
Tapi saya harap Anda melihat keuntungan dalam menyoroti fitur-fitur ini. Jika Anda perlu membuat fungsi untuk setiap elemen HTML, Anda bisa menggunakan kode ini untuk membuat respons respons bersih di program Anda:
void p(string text) { cout << "<p>" << text << "</p>\n"; }
Kemudian gunakan sesuatu seperti:
p("This would be paragraph text.");
Untuk menampilkan paragraf.
Anda bahkan dapat mengembangkan ide ini sehingga fungsi pembantu seperti p, h1_text, dll., Mengembalikan teks alih-alih output langsung ke output standar melalui cout. Pada saat yang sama, Anda dapat membuat sistem template atau jawaban sarang untuk membuat halaman kompleks dengan kode C ++ yang sangat ramping dan efisien.
Contoh ini sesederhana mungkin, ini hanya menunjukkan poin utama. Anda memiliki akses penuh ke setiap tajuk respons, memberi Anda kendali penuh atas loop respons.
Lebih lanjut tentang input
Contoh kami tidak menerima input apa pun, hanya mengembalikan "Hello World". Tetapi Apache menanggapi setiap permintaan dengan sejumlah besar informasi melalui variabel lingkungan. Anda dapat menggunakan fungsi getenv () di pustaka standar C untuk mendapatkan nilainya (jangan lupa untuk menambahkan #include <stdlib.h> di awal kode). Misalnya, jika Anda perlu mengetahui URI permintaan lengkap, Anda akan menggunakan:
string request_uri = getenv("REQUEST_URI");
untuk mendapatkan nilai ini. Variabel berguna lainnya:
- REMOTE_ADDR - Memperoleh alamat IP pengunjung
- REQUEST_METHOD - Mengembalikan metode (mis. GET, POST, dll.)
- DOCUMENT_ROOT - Rute situs (biasanya ~ / public_html pada sistem bersama atau / var / www / html di server virtual / khusus).
- QUERY_STRING - String kueri untuk mendapatkan variabel GET.
Contoh yang lebih jelas
Tentu saja, dimungkinkan untuk mem-parse variabel GET secara manual, dan memproses variabel POST dapat dilakukan dengan memeriksa input standar. Anda bahkan dapat menerima dan mengatur cookie dengan mengubah header permintaan dan respons. Namun kedua pendekatan itu terlalu membosankan.
Anda dapat menulis cangkang Anda sendiri atau menggunakan pustaka GNU cgicc yang sudah jadi. Ini berisi fungsi pembantu untuk memodifikasi HTML dan memproses formulir. Dalam bekerja dengan proyek-proyek besar, menggunakan perpustakaan seperti itu akan menghemat waktu.
Di Debian dan Ubuntu, Anda dapat menginstal perpustakaan dan header menggunakan:
apt install libcgicc5 libcgicc5-dev
Tetapi CentOS / RHEL tidak memiliki paket sendiri. Untuk menginstalnya, jalankan:
cd /usr/local/src wget ftp:
CATATAN: 3.2.19 adalah versi terbaru pada saat penulisan, tetapi Anda dapat memeriksa salinan yang lebih baru di
ftp.gnu.org/gnu/cgicc . Saya juga menggunakan / usr sebagai awalan untuk menghindari masalah dengan menghubungkan perpustakaan. Jika ada, ubah dengan tenang.
Setelah menginstal cgicc, Anda dapat mengompilasinya. Coba contoh ini, yang mengambil input dari formulir dan menampilkannya di browser:
Makefile:
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; }
Anda mungkin memperhatikan bahwa saya secara statis menautkan pustaka cgicc di Makefile. Meskipun ini tidak perlu (Anda dapat menggantinya dengan -Icgicc), saya lebih suka menautkan secara statis kode biner yang saya kirim ke server sehingga semua yang diperlukan untuk program yang akan dikirim dikirim sebagai set.
Dalam contoh ini, pustaka cgicc melakukan kerja keras variabel POST dan mengembalikan kami "nama".
Saya tidak luput dari variabel input POST, tetapi disarankan, terutama di tempat-tempat produksi, terutama jika Anda berinteraksi dengan database.
Ini hanya sebagian kecil dari kemungkinan cgicc. Anda dapat
membaca dokumentasi selengkapnya di
sini .
Performa / kinerja
C ++ sangat cepat bekerja dengan kode yang baik. Antarmuka CGI sedikit memperlambat segalanya, tetapi meskipun demikian Anda akan mendapatkan eksekusi yang lebih baik daripada dalam bahasa yang ditafsirkan seperti PHP.
Seperti yang mereka katakan, selalu ada sesuatu untuk diperjuangkan. Dalam lingkungan khusus atau virtual, Anda dapat menggunakan dukungan FastCGI dari Nginx atau Apache untuk mengurangi keterlambatan kecil (dan tidak mencolok, jika server tidak dimuat secara berlebihan) pada saat program dimuat. Tidak ada penundaan dalam pengujian saya, tetapi untuk bekerja dengan situs web dengan lalu lintas dimuat akan berguna untuk mempelajari solusi ini untuk eksekusi yang lebih cepat / kerja cepat
Opsional
Akan mudah untuk membungkus program C ++ dalam wadah Docker yang tipis. Ini akan memberi Anda fleksibilitas besar saat menempatkan situs. Anda juga dapat mengakses database MySQL dengan memasukkan header pengembangan C / C ++ MySQL di program Anda. Jika Anda terbiasa menggunakan MySQL dengan PHP, Anda akan melihat bahwa nama-nama variabel sangat mirip.
Alih-alih membuat proses baris perintah tambahan untuk pemrosesan gambar, Anda bisa menyertakan header ImageMagick C ++ untuk memproses gambar-gambar ini secara langsung di program Anda
Perjalanan yang panjang dan aneh
Membuat situs di C ++ adalah praktis, terutama jika kinerjanya penting. Saya tidak akan merekomendasikan ini untuk blog atau situs pribadi - mereka dapat dengan mudah dilakukan di WordPress. Tetapi jika Anda memiliki kebutuhan mendesak akan kecepatan dan keinginan untuk menulis dengan baik di jalur yang sulit, pertimbangkan C ++ untuk proyek niche Anda berikutnya di web.