Penjelasan tentang bagaimana bahasa pemrograman sisi server diakses

45

Ini adalah pemahaman saya bahwa bahasa pemrograman tujuan umum apa pun dapat digunakan untuk pengembangan sisi-server suatu situs web.

Apakah saya benar berpikir bahwa server hanya perlu beberapa jenis antarmuka seperti CGI untuk membuat server dan bahasa pemrograman bekerja bersama? Jika demikian maka mengapa beberapa bahasa pemrograman (seperti php) lebih populer daripada yang lain?

Chris Dance
sumber
2
Ini benar-benar alasan yang sama dengan tugas pemrograman lainnya. Orang-orang menciptakan bahasa pemrograman baru karena mereka tidak menyukai sesuatu yang ada. Dan yang lain terus menggunakan yang lama karena mereka tidak menyukai hal yang sama - atau setidaknya tidak cukup untuk beralih.
Kilian Foth
Jadi apakah saya benar dalam mengatakan beberapa bahasa, seperti php, dirancang dengan pengembangan web dalam pikiran dan dengan demikian merupakan pilihan yang lebih mudah (dan karena itu lebih populer) untuk aplikasi umum?
Chris Dance
29
PHP adalah apa yang saya sebut bahasa "dangkal". Struktur dasarnya mudah dimengerti, dan ada ratusan fungsi kecil yang melakukan sesuatu yang bermanfaat. Karena itu menarik bagi pendatang baru. Bandingkan dengan bahasa seperti C #, di mana Anda harus mempelajari hal-hal seperti pewarisan, orientasi objek, keamanan jenis, dan perpustakaan yang relatif kompleks untuk menjadi produktif di dalamnya.
Robert Harvey
4
Jika tidak ada antarmuka seperti itu, maka Anda masih dapat menulis server dalam bahasa tersebut.
user253751

Jawaban:

75

Pada hari-hari awal web, CGI memang satu-satunya cara (praktis) untuk memiliki konten dinamis (Anda bisa membuat pipa bernama file - dan itu digunakan di hari-hari sebelum cgi, tapi itu tidak praktis sama sekali).

CGI bekerja dengan menempelkan banyak informasi di lingkungan proses yang bercabang dan kemudian dieksekusi (dan mungkin beberapa di stdin) dan kemudian mengambil apa yang keluar dari stdout dan meludahkannya kembali ke pemohon.

Ini tidak peduli sedikit pun tentang apa itu bahasa implementasi. Memang, saya menulis CGI awal saya kembali pada hari di C atau C ++. Agak menyakitkan. Saya kemudian belajar beberapa perl di awal 90-an dan itu jauh lebih menyakitkan.

Ini berfungsi, sampai batas tertentu. Masalahnya adalah skala. Setiap permintaan CGI adalah fork dan exec dari suatu proses. Ribuan permintaan berarti ribuan proses. Itu benar - benar tidak berfungsi dengan baik.

Solusi untuk ini adalah menghapus forking dan executing dengan memindahkannya ke utas di server web itu sendiri, atau mengirimkan permintaan ke proses lain yang menangani permintaan tanpa perlu fork dan exec. mod_perl adalah salah satu alat untuk melakukan ini (sebuah plugin memindahkan perl ke apache). Php (akhir 90-an) juga melakukan ini dengan menerapkan bahasa sebagai plugin di server web itu sendiri daripada sesuatu yang bercabang dan melebihi. Ini menjadi sangat populer karena itu seperti perl (yang merupakan bahasa pemrograman web dominan awal) dan bisa mengungguli perl cgis. Masih ada sedikit momentum dari periode waktu ini di pertengahan 90-an - sebelum server aplikasi yang lebih kelas mulai mengambil alih dengan bahasa yang lebih formal di belakang mereka. Jika Anda menggali,

Ini membawa kita ke server aplikasi di mana utas internal muncul (atau pendekatan lain - ini bukan kasus untuk semuanya) untuk menangani permintaan daripada seluruh proses baru - yang dapat membantu dengan skala. Sebagai proses eksternal ini dapat dilihat dengan FastCGI dan kemudian menjadi lazim dengan server aplikasi lain. Perhatikan bahwa dengan ini garis antara server aplikasi dan server web menjadi agak buram - banyak server aplikasi dapat berfungsi ganda sebagai server web, meskipun tidak dioptimalkan untuk menangani IO file statis dengan cara yang seperti server web tradisional.

Server aplikasi generik juga telah membuka jalan ke solusi di mana alih-alih server aplikasi generik , Anda memiliki aplikasi itu sendiri yang menjalankan server web tertanam atau seluruh penyebaran. Dalam situasi seperti itu seseorang tidak menyebarkan aplikasi web pada server aplikasi - itu hanya menjalankan sendiri dan menangani permintaan. Sekali lagi, tujuan dari model ini adalah untuk menghindari harga yang mahal dari peluncuran contoh aplikasi yang baru dan alih-alih menangani permintaan di dalam aplikasi dengan benang yang lebih ringan atau pendekatan serupa.

Inilah masalahnya - semua solusi kurang dalam beberapa cara, bentuk, atau bentuk. CGI, sementara mudah memiliki masalah serius dengan skala. Plugin di server web terikat ke server web itu sendiri (apache vs nginx vs IIS vs ...) dan kehilangan fungsionalitas umum bahasa tersebut. Microsoft memiliki parade teknologi sendiri yang ingin dipromosikan. Dan jika Anda tahu satu bahasa, tidakkah Anda lebih suka pemrograman di dalamnya daripada memiliki bahasa yang berbeda di berbagai bagian tumpukan (javascript di klien dan Node.js)?

Jadi, Anda dapat hari ini. Beberapa orang bekerja di tumpukan Java (dengan scala dan clojure menjadi tidak biasa). Lainnya di tumpukan C #. Lainnya di tumpukan JavaScript. Ada banyak tumpukan php di luar sana. Banyak sekali python. Anda masih dapat menemukan beberapa tumpukan perl di luar sana (dan jika Anda melihat beberapa situs volume rendah, Anda masih akan menemukan CGI). Dengan komputasi awan, Google juga mempromosikan Go sebagai bahasa web sisi server yang layak.

Masing-masing memiliki kelebihan, kekurangan, kerangka dan servernya. Popularitas relatif pasang surut ini seiring dengan perubahan teknologi di sekitarnya. Mereka melakukan berbagai hal dengan baik.


sumber
Ini persis apa yang saya cari. Jawaban yang komprehensif dan tidak terionisasi. Terima kasih!
Chris Dance
1
"Solusinya adalah memindahkan siklus fork dan exec ke server web itu sendiri." Tidak harus: FastCGI, reverse proxying adalah solusi terkenal untuk terhubung ke server aplikasi tanpa harus peduli dengan bahasa target atau untuk implementasi server web, yang menggunakan protokol komunikasi lintas proses yang ditentukan dengan baik untuk melakukan pekerjaan mereka.
jhominal
1
@jhominal "Alih-alih membuat proses baru untuk setiap permintaan, FastCGI menggunakan proses persisten untuk menangani serangkaian permintaan. Proses ini dimiliki oleh server FastCGI, bukan server web." ( sumber ) - itu intinya, inilah yang dilakukan server aplikasi. Proses gigih yang menangani permintaan tanpa melakukan fork dan exec.
@MichaelT: Anda menggunakan "server web" dan "server aplikasi" seolah-olah ketentuannya dapat dipertukarkan - dan, dalam jawaban Anda, Anda menggunakan "server web" sebagian besar untuk merujuk ke apache, nginx - yaitu, perangkat lunak server web generik yang hanya memiliki (pada intinya) kemampuan program terbatas.
jhominal
1
Saya tidak berpikir ini cukup untuk menyebutkan praktik (yang sekarang sangat umum) hanya memiliki setiap aplikasi menjadi server web sendiri, kemungkinan besar digawangi oleh satu atau lebih proxy HTTP.
hobbs
19

Ya, bahasa pemrograman umum apa pun dapat berfungsi untuk menulis bagian sisi server dari situs web.

Namun, kualitas bahasa pemrograman, dalam hal ini seperti dalam hal lain, biasanya hanya satu dari banyak faktor yang berkontribusi terhadap popularitasnya.

Misalnya, saya rasa PHP menjadi populer untuk situs web karena:

  • Sangat mudah untuk memutakhirkan dari situs web statis ke situs web dinamis PHP - cukup ganti ekstensi file file HTML Anda, tempatkan <?phptag di awal, dan, asalkan PHP diinstal, Anda memiliki situs web dinamis! Sisa alur kerja sama persis dengan untuk situs web statis;
  • Karena kemudahan penyebaran itu, host web yang ingin mengusulkan situs web dinamis memilih PHP, menjadikannya platform platform sisi server yang paling banyak digunakan;
  • Ia masuk ke pasar itu pada waktu yang tepat;

Dan begitu PHP disebarkan secara luas, menjadi menarik untuk menulis aplikasi web yang lebih serius dalam PHP untuk mendapatkan keuntungan dari perluasan yang luas.

Untuk mengatakannya dengan cara yang lebih umum: adopsi bahasa sering kali merupakan jawaban atas pertanyaan-pertanyaan ini:

  • Seberapa mudah untuk melakukan apa yang ingin saya lakukan?
  • Seberapa luas dukungan bahasa untuk apa yang ingin saya lakukan?
jhominal
sumber
7

Apakah saya benar berpikir bahwa server hanya perlu beberapa jenis antarmuka seperti CGI untuk membuat server dan bahasa pemrograman bekerja bersama?

Hampir. Anda memerlukan server web yang memiliki beberapa jenis perangkat lunak untuk memungkinkannya menanggapi permintaan HTTP juga.

Pikirkan tentang bagaimana halaman statis disajikan. Server mengambil permintaan HTTP, menemukan dokumen yang diminta dari sistem file berdasarkan pada konfigurasi server HTTP, dan mengembalikan halaman statis.

CGI memperluas konsep ini dengan memungkinkan Anda untuk menunjuk folder cgi-bin pada sistem file tempat executable atau skrip dapat disimpan. Ketika Anda mengakses suatu program melalui CGI, server HTTP menjalankan proses atau skrip dan meneruskan output standar ke klien daripada hanya melayani dokumen statis.

 If so then why are some programming languages (such as php) more popular than others?

Struktur CGI yang lama tidak menskalakan permintaan dalam jumlah besar. Bahasa pemrograman dan kerangka kerja yang berbeda untuk web ada karena alasan yang berbeda, dan masing-masing melakukan hal yang berbeda dengan baik. PHP sama populernya dengan alasan historis, karena PHP adalah salah satu solusi mudah dan murah pertama untuk melayani halaman dinamis tanpa menggunakan CGI dan memiliki dukungan hosting yang luas. ASP populer di kalangan Microsoft karena memungkinkan pengembang VB untuk mengalihkan keterampilan mereka ke web. ASP.NET (Formulir Web) membuatnya sangat mudah bagi pengembang Windows Forms, banyak di antaranya adalah coders VB, untuk beralih ke web.

ravibhagw
sumber
3

Saat browser membuat permintaan HTTP, tampilannya seperti ini:

GET /search?q=cats HTTP/1.0
Host: www.google.com
Connection: close

... di mana server harus mengirim respons yang terlihat seperti ini:

HTTP/1.0 200 Success
Content-Type: text/html; charset=UTF-8
Content-Length: 1337

<!DOCTYPE html>
<html>
  <head><title>cats - Google Search</title>
  <body>
    <h1>About 415,000,000 results</h1>
    …
  </body>
</html>

Setiap kode yang berjalan pada server yang mendengarkan untuk permintaan pada soket TCP, membaca permintaan, dan balasan dengan respon yang tepat akan cukup. Salah satu cara bodoh adalah dengan mengeluarkan respons kalengan kepada siapa pun yang terhubung ke TCP port 80, menggunakan skrip shell:

$ nc -l 8000 <<'RESPONSE'
HTTP/1.0 200 Success
Content-Type: text/html; charset=UTF-8
Content-Length: 1337

<!DOCTYPE html>
<html>
  <head><title>cats - Google Search</title>
  <body>
    <h1>About 415,000,000 results</h1>
    …
  </body>
</html>
RESPONSE

Tentu saja, teknik itu nyaris tidak sesuai dengan protokol HTTP .

Sebuah langkah maju dari respons kalengan adalah program Python sederhana ini, yang menggunakan http.serverpustaka dalam Python 3.

#!/usr/bin/python3

import http.server

class Handler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        payload = '<!DOCTYPE html>... insert cats here ...'.encode('UTF-8')
        self.send_response(200)
        self.send_header('Content-Type', 'text/html; charset=UTF-8')
        self.send_header('Content-Length', len(payload))
        self.end_headers()
        self.wfile.write(payload)

http.server.HTTPServer(('', 80), Handler).serve_forever()

Server HTTP dapat ditulis dalam bahasa apa pun; itu hanya sebuah contoh. Jelas, contoh ini sangat sederhana. Payloadnya dikodekan secara keras - program sepenuhnya mengabaikan isi permintaan - URL, string kueri, tajuk Bahasa Terima, dll. Anda dapat menambahkan kode untuk menghasilkan respons yang bermakna berdasarkan permintaan, tetapi kemudian kode akan menjadi sangat kompleks. Selain itu, programmer lebih suka fokus menulis aplikasi web, tidak perlu khawatir tentang detail bagaimana menangani permintaan HTTP.

Solusi yang lebih tepat adalah dengan menggunakan server web, seperti Apache HTTPD , IIS , atau nginx . Server web hanyalah sebuah program yang mendengarkan pada soket TCP yang relevan, menerima beberapa permintaan (mungkin secara bersamaan), dan memutuskan bagaimana menghasilkan respons berdasarkan URL permintaan, tajuk, dan aturan lainnya. Idealnya, banyak detail, seperti SSL, kontrol akses, dan batasan sumber daya dijaga melalui konfigurasi alih-alih kode. Sebagian besar waktu, server web akan merumuskan respons yang hanya terdiri dari konten dari file dalam sistem file.

Untuk konten dinamis, server web dapat dikonfigurasi untuk mengeksekusi beberapa kode untuk menghasilkan respons. Salah satu mekanisme untuk melakukan itu adalah dengan CGI - server menetapkan beberapa variabel lingkungan berdasarkan permintaan, menjalankan program, dan menyalin hasilnya ke soket TCP. Solusi yang sedikit lebih canggih adalah dengan memiliki modul yang menambahkan dukungan ke server web untuk memanggil kode dalam bahasa pemrograman lain (mis. Mod_php for Apache ). Namun pilihan lain adalah untuk menulis server web dalam bahasa yang sama dengan aplikasi web, dalam hal ini pengiriman permintaan hanyalah panggilan fungsi. Itu adalah kasus dengan node.js dan mesin servlet Java seperti Apache Tomcat .

Pilihan teknologi benar-benar terserah Anda, dan tergantung pada bahasa pemrograman yang Anda inginkan, lingkungan hosting yang tersedia untuk Anda, persyaratan kinerja, pendapat populer, dan mode yang lewat. CGI, misalnya, belum disukai akhir-akhir ini, karena kebutuhan untuk meluncurkan program eksternal membatasi skalabilitas.

200_sukses
sumber
1

Server web adalah program yang ditulis dalam bahasa pemrograman apa pun yang menangani "lalu lintas web" melalui soket yang mematuhi standar / protokol tingkat aplikasi (HTTP, dll). Sebagian besar bahasa pemrograman menawarkan Anda untuk membuat soket.

Apakah saya benar berpikir bahwa server hanya perlu beberapa jenis antarmuka seperti CGI untuk membuat server dan bahasa pemrograman bekerja bersama?

Tidak perlu memiliki program server khusus dan program aplikasi Anda - keduanya bisa sama (mengabaikan masalah terkait kinerja).

mucaho
sumber
0

Anda dapat menggunakan beberapa pustaka server HTTP , misalnya libonion , bahkan dalam program Anda yang dikodekan dalam C (atau C ++, lihat juga Wt ). Ada juga beberapa pustaka klien HTTP (mis. Libcurl )

Anda dapat menggunakan perpustakaan HTTP lain, misalnya ocsigen & ocamlnet untuk OCaml .

Ada beberapa bahasa khusus Web (di luar PHP), misalnya Opa , HOP , Kaya , dll ... (baik HOP & Opa dapat dengan mudah menggabungkan perhitungan sisi-server dan sisi-browser, tetapi Anda harus melakukannya dengan susah payah dan manual di PHP, secara eksplisit menggunakan teknik AJAX dan pengkodean tangan beberapa Javascript untuk browser. Sebaliknya, HOP, Opa, Ocsigen dapat menghasilkan Javascript tersebut).

Anda juga dapat menggunakan teknologi FASTCGI untuk menambahkan beberapa layanan dinamis ke beberapa server web ... FASTCGI lebih baik daripada CGI biasa yang memulai proses baru untuk setiap permintaan HTTP yang masuk, sementara aplikasi FASTCGI dapat melayani banyak permintaan HTTP dalam proses yang sama. BTW, PHP dapat dikonfigurasi untuk berfungsi sebagai aplikasi FASTCGI.

C.Queinnec mengamati bahwa penelusuran web dan kelanjutan terkait secara signifikan.

PS. Saya tidak suka PHP, dan saya percaya bahwa popularitasnya memiliki alasan historis dan sosial (tidak terutama yang teknis). Memang PHP tersebar luas sebelum AJAX menjadi banyak digunakan, dan lebih tua dari HOP atau Opa (atau Ocsigen).

Basile Starynkevitch
sumber