PDA

View Full Version : مبتدی: تفاوت بین CGI و Apache



spider man
شنبه 21 تیر 1393, 20:28 عصر
Apache رو میدونم که در خواست را میگیره و میده به PHP و پردازش میشه و بعد میفرسته به کلاینت

پس فرق بین CGI و Apache چیه ؟ من نمیتونم درک اش کنم.

یک مثل میزنید ؟

MMSHFE
یک شنبه 22 تیر 1393, 01:38 صبح
Apache همه درخواستها رو میگیره و بعضیها رو میده به PHP و بعضیها رو میده به برنامه های دیگه که با CGI کار میکنن. حتی خود PHP رو هم میشه بصورت CGI نصب کرد. مطالب لینکهای این جستجو رو ببینید: لینک (https://www.google.com/search?q=difference+between+web+server+and+CGI&rlz=1C1ASUT_enUS578IR579&oq=difference+between+web+server+and+CGI&aqs=chrome..69i57.12231j0j7&sourceid=chrome&es_sm=122&ie=UTF-8)

spider man
یک شنبه 22 تیر 1393, 18:30 عصر
Apache همه درخواستها رو میگیره و بعضیها رو میده به PHP و بعضیها رو میده به برنامه های دیگه که با CGI کار میکنن. حتی خود PHP رو هم میشه بصورت CGI نصب کرد. مطالب لینکهای این جستجو رو ببینید: لینک (https://www.google.com/search?q=difference+between+web+server+and+CGI&rlz=1C1ASUT_enUS578IR579&oq=difference+between+web+server+and+CGI&aqs=chrome..69i57.12231j0j7&sourceid=chrome&es_sm=122&ie=UTF-8)

باز هم نفهمیدم :اشتباه:


حتی خود PHP رو هم میشه بصورت CGI نصب کرد

یعنی چی ؟

اصلا کار اصلی CGI چی میتونه باشه ؟

MMSHFE
دوشنبه 23 تیر 1393, 09:23 صبح
ببینید CGI یک رابط عمومیه که ازطریق اون میتونید هر برنامه ای رو توسط وب سرور فراخوانی کنید. برای مثال میشه مفسر PHP رو بصورت CGI صدا بزنیم و فایل PHP رو بهش بدیم تفسیر کنه و خروجی رو بهمون بده. یا اگه فرضاً آدرسی بصورت mysite.com/test.cpp وارد شد، کامپایلر ++C رو با CGI صدا بزنیم بگیم این برنامه رو کامپایل و اجرا کنه و جواب رو به ما تحویل بده. توضیحات بیشتر رو تو این لینک (http://en.wikipedia.org/wiki/Common_Gateway_Interface) میتونید مشاهده کنید.

spider man
دوشنبه 23 تیر 1393, 12:55 عصر
ببینید CGI یک رابط عمومیه که ازطریق اون میتونید هر برنامه ای رو توسط وب سرور فراخوانی کنید. برای مثال میشه مفسر PHP رو بصورت CGI صدا بزنیم و فایل PHP رو بهش بدیم تفسیر کنه و خروجی رو بهمون بده. یا اگه فرضاً آدرسی بصورت mysite.com/test.cpp وارد شد، کامپایلر ++C رو با CGI صدا بزنیم بگیم این برنامه رو کامپایل و اجرا کنه و جواب رو به ما تحویل بده. توضیحات بیشتر رو تو این لینک (http://en.wikipedia.org/wiki/Common_Gateway_Interface) میتونید مشاهده کنید.

ممنون مثال خیلی بجایی بود.

پس یا باید از Apache استفاده کنیم یا CGI

یعنی نمیشه از هر دو استفاده کرد. درسته ؟

حالا به نظر شما CGI بهتر است یا Apache ؟

Unique
دوشنبه 23 تیر 1393, 16:04 عصر
با اجازه جناب شهرکی ،

دوست عزیز اصلا apache هیچ ربطی به CGI نداره. Apache یک سرویس دهنده وب هست در صورتی که CGIیا همون Common Gateway Interface یک روش استاندارد برای تولید محتوای داینامیک هست ، در واقع Apache یا هر وب سرور دیگه از طریق Interface های مربوط به خودش این روش پیاده سازی محتوای دینامیک را پشتیبانی میکنند. سرویس دهنده وب بر اساس تعاریفی که توی config هاش میشه تشخیص میده درخواست برای چه برنامه ای از طریق روش CGI ارسال بشه تا خروجی را بگیره و برای درخواست کننده ارسال کنه. با زبان های اسکریپتی مثل perl یا python یا php یا هر زبان اسکریپتی دیگه یا هر زبان برنامه نویسی مثل c یا ++c یا pascal میشه از طریق روش CGI برای سرویس دهنده محتوای وب دینامیگ تولید کرد.

در حال حاضر fastcgi و خیلی روش های دیگه با معماری های کم و بیش شبیه به هم داره استفاده میشه. مقایسه apache و cgi یه چیزی شبیه به مقایسه مربی فوتبال یا روش بازی ۱-۲-۳-۴ هستش. اون یک روش بازی کردن فوتبال هست و مربی بر اساس قابلیت های اون سیستم تیمش را میچینه و رهبری میکنه.

پ.ن : حیف جام جهانی تموم شد.

spider man
دوشنبه 23 تیر 1393, 21:37 عصر
آقای شهرکی اگر ممکن هست نام تاپیک را به نام مربوطه تغییر دهید.

spider man
دوشنبه 23 تیر 1393, 22:00 عصر
با اجازه جناب شهرکی ،

دوست عزیز اصلا apache هیچ ربطی به CGI نداره. Apache یک سرویس دهنده وب هست در صورتی که CGIیا همون Common Gateway Interface یک روش استاندارد برای تولید محتوای داینامیک هست ، در واقع Apache یا هر وب سرور دیگه از طریق Interface های مربوط به خودش این روش پیاده سازی محتوای دینامیک را پشتیبانی میکنند. سرویس دهنده وب بر اساس تعاریفی که توی config هاش میشه تشخیص میده درخواست برای چه برنامه ای از طریق روش CGI ارسال بشه تا خروجی را بگیره و برای درخواست کننده ارسال کنه. با زبان های اسکریپتی مثل perl یا python یا php یا هر زبان اسکریپتی دیگه یا هر زبان برنامه نویسی مثل c یا ++c یا pascal میشه از طریق روش CGI برای سرویس دهنده محتوای وب دینامیگ تولید کرد.

در حال حاضر fastcgi و خیلی روش های دیگه با معماری های کم و بیش شبیه به هم داره استفاده میشه. مقایسه apache و cgi یه چیزی شبیه به مقایسه مربی فوتبال یا روش بازی ۱-۲-۳-۴ هستش. اون یک روش بازی کردن فوتبال هست و مربی بر اساس قابلیت های اون سیستم تیمش را میچینه و رهبری میکنه.

پ.ن : حیف جام جهانی تموم شد.

ممنون خیلی عالی بود.

پس با این وجود Apache را میشه برای برنامه های شخصی هم کانفیگ کرد(کامپایلر شخصی) . در هرصورت وب سرور یک سری امکاناتی را ارائه میدهد که مخصوص وب هست.

ولی این مطلب را بخونید سوال من را پرسیده :

http://docs.joomla.org/Should_PHP_run_as_a_CGI_script_or_as_an_Apache_mod ule%3F

Unique
سه شنبه 24 تیر 1393, 13:49 عصر
ولی این مطلب را بخونید سوال من را پرسیده

نه دوست عزیز ، مطلبی که اینجا پرسیده اینه که php را به صورت cgi روی apache پیکربندی کنه یا apache module و در حواب هم مقایسه کرده این دو حالت را. پس باز هم نتیجه میده CGI فقط یک بستر ، روش یا Interface هست و بس.

H:Shojaei
سه شنبه 24 تیر 1393, 16:47 عصر
سلام...
با اجازه اساتید من چون خودم یه ماهه فهمیدم CGI چیه شاید ساده تر بتونم توضیح بدم...
CGI فقط یه واسط هست که شما با هر زبانی میتونی واسه وب برنامه بنویسی و توسط این واسط به کدهایی که بروزر های بفهمنشون تبدیل بشن مثل این کد زیر که با C++ نوشته شده و با CGI تبدیل به یه کد HTML میشه و اجرا میشه CGI فقط کارش همینه

#include <stdio.h>

int main(void)
{
printf("Content-type: text/html\n\n");
printf("<html><title>Hello</title><body>\n");
printf("Goodbye Cruel World\n");
printf("</body></html>");
return 1;
}
مثال های دیگه:

http://www.csce.uark.edu/~sgauch/cgicode/dynamicHTML.cpp

https://www.cs.tut.fi/~jkorpela/forms/cgic.html#get

Unique
سه شنبه 24 تیر 1393, 18:23 عصر
با اجازه اساتید من چون خودم یه ماهه فهمیدم CGI چیه شاید ساده تر بتونم توضیح بدم...
CGI فقط یه واسط هست که شما با هر زبانی میتونی واسه وب برنامه بنویسی و توسط این واسط به کدهایی که بروزر های بفهمنشون تبدیل بشن مثل این کد زیر که با C++‎ نوشته شده و با CGI تبدیل به یه کد HTML میشه و اجرا میشه CGI فقط کارش همینه

با شرمندگی این صحبت شما نه ساده هستش و نه درست. cgi خودش هیچ چیزی نیست که حالا واسط باشه و بیشتر یک روش و interface هست. یک روش پیاده سازی استاندارد برای تولید محتوای دینامیک.

H:Shojaei
سه شنبه 24 تیر 1393, 22:06 عصر
با شرمندگی این صحبت شما نه ساده هستش و نه درست. cgi خودش هیچ چیزی نیست که حالا واسط باشه و بیشتر یک روش و interface هست. یک روش پیاده سازی استاندارد برای تولید محتوای دینامیک.
واقعا!!
یعنی این مثالهایی هم که زدم اشتباهه؟؟
پس منم هنوز نفهمیدم CGI چیه...:لبخند:
یه سوال این CGI تو هر زبان استاندارد خواصی نسبت به اون زبان داره یا واسه همه زبان ها یه استاندارد داره؟؟

Unique
چهارشنبه 25 تیر 1393, 00:33 صبح
دوست عزیز ، استاندارد یک قراراداد ثابت هستش ! در ضمن CGI ربطی به زبان برنامه نویسی نداره ! CGI مربوط به سرویس دهنده وب میشه ، برنامه باید اطلاعات ارسال شده توسط صفحه که حالا post یا get هست را از سرویس دهنده بر اساس RFC مربوطه بگیره ، پردازش کنه و محتوای Html را برگردونه.

spider man
چهارشنبه 25 تیر 1393, 11:18 صبح
حقیقت اش هنوز واسه بنده خوب جا نیافتاده .

http://dmuirdesigns.com/mbss/webdesign/kss/webdesign12/Webegineering/lec06_files/l06fig01.gif
در این تصویر نشان میده که در واقع وب سرور (apache,iis,...) یک برنامه CGI را فراخوانی میکند.


الان این قسمت CGI Program واسه من جا نیافتاده! یعنی چی ؟ چطوریه ؟

الان من روی سیستم ام xampp دارم و اپاچی و PHP هم داره و یک پوشه به نام cgi-bin هم دارد. این واسه چیه ؟

چطوری میشه PHP را بصورت CGI نصب کرد درصورتی که خود آپاچی از استاندارد CGI استفاده می کند.

اگر بتونین منظورتون را روی عکس بیان کنید بهتر هست.

MMSHFE
چهارشنبه 25 تیر 1393, 12:32 عصر
PHP رو میشه بصورت یک ماژول Apache هم اجرا کرد و همیشه بصورت CGI کار نمیکنه و درواقع کار اصلی وب سرور، پردازش درخواستها و تصمیم درخصوص نحوه پاسخدهی به اونهاست و این وسط اگه لازم بود میشه وب سرور رو طوری تنظیم کرد که ازطریق یک رابط CGI یک برنامه دیگه (مثل مفسر PHP یا کامپایلر ++C یا یک فایل exe. یا هر چیز دیگه) رو صدا بزنه و خروجی اون رو بگیره و بعنوان پاسخ برای درخواست کننده بفرسته. مثلاً با کمک CGI و ترکیبش با Web Server میتونید کاری کنید که هرچی درخواست فایل با پسوند m. اومد، بره برنامه Matlab رو باز کنه و اون فایل رو بهش بده تا اجرا کنه و جواب رو ازش بگیره و بعنوان پاسخ برای کلاینت که درخواست رو ارسال کرده بوده، بفرسته. درواقع وجود وب سرور ضروریه تا سرور بتونه درخواستهای کاربر رو بگیره و پردازش کنه و جواب بده و بدون اون، نمیشه یک سرور کار کنه و CGI هم مستقیماً نمیتونه با کلاینت در ارتباط باشه و برای ارتباط، نیاز به وب سرور داره تا درصورت لزوم، اون رو صدا بزنه تا جواب بگیره ازش ولی وجود CGI اجباری نیست و خیلی از درخواستها رو وب سرور میتونه بدون CGI هم پاسخ بده. برای مثال فایلهای HTML و CSS و... مستقیماً بدون پردازش برای کلاینت ارسال میشن (طبق تنظیمات پیشفرض وب سرورها که البته قابل تغییره). برای همینه که کدهای PHP بطور پیشفرض توی فایلهای با پسوند html. و... اجرا نمیشن چون وب سرور طوری تنظیم شده که فرضاً فقط درخواستهای مربوط به فایلهای php. رو بده به مفسر PHP تا اجرا کنه. معمولاً هم اون پوشه cgi-bin برای اجرای اسکریپتهای Perl و SHtml و... است (منبع (http://www.parkansky.com/tutorials/bdlogcgi.htm))

Unique
چهارشنبه 25 تیر 1393, 15:24 عصر
الان من روی سیستم ام xampp دارم و اپاچی و PHP هم داره و یک پوشه به نام cgi-bin هم دارد.
این پوشه هیچ ربطی به PHP شما نداره ! شما اگه توی این پوشه یک برنامه بر اساس استاندارد CGI بنویسین و بگذارین که مثلا با perl یا python یا c نوشته شده باشه ، وب سرور شما که در اینجا آپاچی هست میاد و این برنامه را از command line صدا میزنه و header ها و اطلاعات دیگه را از طریق stdin میده به برنامه ، برنامه از طریق این stdin و Environment Variables اطلاعات مورد نیازش را میگیره و خروجی را میده به stdout و وب سرور این خروجی را بر می گردونه به کاربر.

مثلا این برنامه ساده از perl به عنوان یک cgi استفاده کرده :


#!/usr/bin/perl -wT

print <<END_OF_HTML;
Content-type: text/html

<HTML>
<HEAD>
<TITLE>About this Server</TITLE>
</HEAD>
<BODY>
<H1>About this Server</H1>
<HR>
<PRE>
Server Name: $ENV{SERVER_NAME}
Listening on Port: $ENV{SERVER_PORT}
Server Software: $ENV{SERVER_SOFTWARE}
Server Protocol: $ENV{SERVER_PROTOCOL}
CGI Version: $ENV{GATEWAY_INTERFACE}
</PRE>
<HR>
</BODY>
</HTML>
END_OF_HTML

میشه فایل را با پسوند cgi ذخیره کرد و گذاشت توی cgi-bin و اجراش کرد. (توی لینوکس جواب میده ها)
یک موضوعی که باید متوجه باشین اینه که اگه از cgi-bin استفاده کردین خودتون باید همه اطلاعات را parse کنین و مثلا get و post و header و غیره را بدست بیارین


چطوری میشه PHP را بصورت CGI نصب کرد درصورتی که خود آپاچی از استاندارد CGI استفاده می کند

اما قضیه php یه چیز دیگست. وقتی میخوایم php به صورت cgi کار کنه ! در واقع برای هر درخواست یک proccess به فایل php.exe ایجاد بشه (دیگه این کار انجام نمیشه و به صورت fastcgi یا apache module انجام میشه که یک proccess داریم و جواب request ها داده میشه) میایم و توی تنظیمات apache میگیم اگه فایلی پسوندش php بود این فایل را با php.exe صدا بزن. خوب فرقش اینجاست که php.exe میاد و کل مقادیر get و post و server و cookie ها و غیره را برای فایل php ما استخراج میکنه و از طریق global variable ها مثل GET_$ و غیره .. در اختیارمون میگذاره.

در واقع برنامه cgi اصلی اینجا php.exe هستش نه فایل php ما ! اگه میخواستیم با php از طریق همون cgi-bin و بدون دخالت php.exe یک برنامه php بنویسیم باید مثل perl اطلاعات را از stdin و environment varable ها میخوندیم به stdout میدادیم ! پس php.exe کار ما را خیلی خیلی خیلی راحت میکنه. البته الان میان و از طریق یک ماژول آپاچی همین کار را انجام میدهند تا proccess های زیاد روی سرور ایجاد نشه.

امیدوارم متوجه شده باشین.

spider man
چهارشنبه 25 تیر 1393, 20:48 عصر
توضیحاتتون عالی بود و کم و کسری نداشت.

بلکه بنده یکم ریز بینم و تا زمانی که یک موضوع کامل برایم جا نیافتد نمی توانم در ذهنم از آن استفاده کنم.

تا اینجا که بنده فهمیدم CGI یک روش استانداردی هست که با انجام این روش تمام برنامه ها را به یک قانون وادار میکند و درنتیجه باعث میشه که هر برنامه ایی با یک وب سرور تعامل خوبی بر قرار کند و قاعدتا بدون وب سرور(و نرم افزار های مربوطه) نمیتوان CGI را ایجاد کرد.

ولی بیاییم بصورت تئوری جلو بریم و هر جا بنده اشتباه کردم گوش زد کنید :


1. کاربر در خواست را به localhost/test.php میفرستد.

2. مرورگر کاربر درخواست را همراه با هدر از پورت 80 به 127.0.0.1 میفرستد.

3. در این طرف سرور با استفاده از نرم افزار آپاچی که بر روی پرت 80 listen میکند اطلاعات را دریافت می کند.

4. با توجه به نوع درخواست آپاچی تشخیص میدهد که داده ارسال شده مربوط به یک فایل php هست در اینصورت با توجه به کانفیگ انجام شده، از طریق command line با php.exe ارتباط برقرار می کند و خروجی را گرفته و به سمت کلاینت ارسال می کند.

جاهایی که آبی شده از استاندارد CGI استفاده شده.


این پوشه هیچ ربطی به PHP شما نداره ! شما اگه توی این پوشه یک برنامه بر اساس استاندارد CGI بنویسین و بگذارین که مثلا با perl یا python یا c نوشته شده باشه ، وب سرور شما که در اینجا آپاچی هست میاد و این برنامه را از command line صدا میزنه و header ها و اطلاعات دیگه را از طریق stdin میده به برنامه ، برنامه از طریق این stdin و Environment Variables اطلاعات مورد نیازش را میگیره و خروجی را میده به stdout و وب سرور این خروجی را بر می گردونه به کاربر.

پس گفته شما چطوری اجرا میشه میشه یک مثال بزنید ؟(از سمت کلاینت به سرور)

Unique
پنج شنبه 26 تیر 1393, 01:35 صبح
بلکه بنده یکم ریز بینم و تا زمانی که یک موضوع کامل برایم جا نیافتد نمی توانم در ذهنم از آن استفاده کنم.
هیچ اشکالی نداره ! ندونستن عیب نیست و نپرسیدن عیبه. میتونم ادعا کنم ۹۰٪ برنامه نویسان وب ایرانی اصلا از موضوعات مربوط به server round trip (به همین ۴ مرحله که شما گفتین میگن) و cgi و این مفاهیم آشنایی کامل ندارند. دلیل اینکه من کمی در موردش اطلاعات دارم اینه که در ابتدا میخواستم از پاسکال برای نوشتن برنامه های سمت وب استفاده کنم و اون زمان وقتی دیدم با asp چقدر راحت تر میشه این کار را انجام داد کلا بی خیالش شدم اما خوب همه این موضوعات را هم یاد گرفتم.

۴ مرحله به صورت تئوری درسته. اما در مرحله ۴ از php.exe درخواست میشه که پس از parse کردن get و post و ... فایل php مربوطه را تفسیر کنه و خروجیش را برگردونه به وب سرور.


پس گفته شما چطوری اجرا میشه میشه یک مثال بزنید
توی همون ۴ مرحله شما ، به جای اینکه در مرحله ۴ اطلاعات در اختیار php.exe برای تفسیر فایل php مورد نظر قرار بگیره ، کلا از طریق stidn و environment variable ها در اختیار برنامه cgi ما که به هر زبونی میتونه باشه قرار میگیره و مستقل proccess خودش را انجام میده و خروجیش را به وب سرور بر میگردونه

موفق باشین