CGI
صفحات وب اطلاعات متفاوتی را در خود نگهداری می نمايند. صفحات فوق بر روی سرويس دهندگان وب و بر اساس يک ساختار مشخص ، سازماندهی و ذخيره خواهند شد. کاربران اينترنت با استفاده از مرورگر خود ، درخواست يک صفحه وب را می نمايند ، در خواست مورد نظر پس از ارسال از طريق محيط انتقال در اختيار سرويس دهنده وب قرار خواهد گرفت . سرويس دهنده وب پس از دريافت درخواست کاربران ، عمليات جستجو و يافتن فايل درخواست شده را آغاز می نمايند. در صورتيکه فايل ( صفحه وب ) درخواستی پيدا نگردد ، سرويس دهنده برای برنامه مرورگر کاربر کدی را بمنزله عدم يافتن فايل ارسال و مرورگر پيام مناسبی در رابطه با عدمم يافتن فايل را در اختيار کاربر قرارخواهد داد. در صورتيکه سرويس دهنده فايل درخواستی را پيدا نمايد ، آن را بمنظور نمايش برای مرورگر کاربر ارسال خواهد کرد.
فرآيند فوق ، نحوه برخورد سرويس دهنده وب با فايل های ايستا ( صفحات وب ايستا ) را تشريح می نمايد. صفحات وب ايستا ، قبل از درخواست کاربران توسط مولفين مربوطه ، طراحی و بر اساس ساختار سازماندهی شده بر روی سرويس دهنده وب مستقر خواهند شد. محتويات اين نوع صفحات همواره يکسان بوده و اطلاعات موجود را صرفنظر از زمان ، مکان ، تمايلات درخواست کننده بصورت يکسان نمايش خواهند داد. اکثر سرويس دهندگان امکان استفاده از فايل های پويا را نيز فراهم می آورند. برای ارائه تکنولوژی فوق از امکانات متعددی استفاده می گردد . CGI)Common Gateway Interface) يکی از امکانات موجود در اين زمينه است . امروزه از اينترفيس CGI در موارد متعددی استفاده می گردد :
![]() |
يک دفترچه تلفن امکان ارسال اطلاعات کاربران را از طريق يک فرم Html فراهم و پس از ارسال اطلاعات موجود در فرم ، اطلاعات در بانک های اطلاعاتی ذخيره خواهد شد. |
![]() |
يک فروشگاه online کتاب ، امکان ارسال اطلاعات مربوط به يک گروه از کتاب را قراهم و در ادامه اطلاعات تکميلی در رابطه به هر يک از کتاب های موجود در گروه در اختيار کاربران قرار خواهد گرفت . |
![]() |
در برنامه های موتور جستجو ، امکان درج کلمات مورد نظر برای جستجو در اختيار کاربران گذاشته خواهد شد ، در ادامه برنامه مورد نظر، آدرس صفحات وب شامل اطلاعات مورد نظر ( جستجو) را در اختيار کاربران قرار خواهد داد. |
مکانيزم
CGI
مکانيزم نحوه عملکرد
CGI در اکثر سرويس دهندگان وب ، يکسان و
استاندارد است . در اين راستا فولدری با نام cgi-bin
در فهرست ريشه وب سايت مورد نظر ايجاد می گردد. نحوه برخورد سرويس
دهنده با فايل هائی که در فولدر فوق قرار می گيرند ، متفاوت خواهد بود.
سرويس دهنده در رابطه با فايل های فوق صرفا" عمليات ساده خواندن و
ارسال را انجام نخواهد داد. اين نوع فايل ها می بايست اجراء و خروجی
بدست آمده در اثر اجرای برنامه، برای مرورگر متقاضی ارسال خواهد گرديد.
از زبانهای متعددی برای نوشتن برنامه ها در اين زمينه استفاده می گردد.
زبان اسکريپتی PERL
يکی از متداولترين گزينه
ها برای نوشتن اسکريپت های CGI ، می باشد.
بمنظور نوشتن فايل های
CGI ، می توان از زبانهای برنامه نويسی و
زبانهای اسکريپت استفاده کرد. زبانهای C و
PERL دو گزينه مناسب در اين راستا می باشند.
مسئوليت برخورد با اسکريپت های CGI برعهده
سرويس دهنده وب است .
اسکريپت های
ساده CGI
بمنظور نوشتن اسکريپت های
CGI ، لازم است که امکان دستيابی به فولدر
cgi-bin و آشنائی با يکی از زبانهای
C و يا PERL وجود
داشته باشد. در اين بخش به بررسی نحوه ايجاد اسکريپت های
CGI توضيح داده می شود .
مثال : صفحه وب زير ، يک پيام ساده را در خروجی ( مرورگر ) نمايش می دهد .
يک صفحه وب ساده |
<html> <body> <h1>يک صفحه ساده وب </h1> </body> </html> |
برنامه زير با زبان C نوشته شده و همان خروجی صفحه وب فوق را نمايش خواهد داد. اين برنامه ساده ترين نوع استفاده از CGI برای ايجاد خروجی مورد نظر است .
متن برنامه به زبان C |
#include <stdio.h> int main() { printf("Content-type: text/html\n\n"); printf("<html>\n"); printf("<body>\n"); printf("<h1>يک صفحه ساده وب</h1>\n"); printf("</body>\n"); printf("</html>\n"); return 0; } |
برنامه فوق را در فايلی با نام simplest.c ذخيره و با استفاده از کمپايلر C ، آن را با استفاده از دستور زير ترجمه می نمائيم .
gcc simplest.c -o simplest.cgi |
پس از ترجمه برنامه و توليد فايل simplest.cgi ، آن را در فولدر cgi-bin ذخيره تا امکان اجرای آن فراهم گردد. بمنظور اجرای برنامه فوق ، مرورگر خود را فعال و در بخش آدرس آن ، آدرس زير را وارد نمائيد.
http://www.yourcompany.com/cgi-bin/simplest.cgi |
پس از تايپ آدرس فوق ، برنامه موجود در فايل simplest.cgi اجراء و خروجی مناسب را نمايش خواهد داد. در برنامه فوق استفاده از دستور زير لازم است . دستور زير اولين خطی است که توسط هر اسکريپت CGI برای مرورگر ارسال می گردد :
printf("Content-type: text/html\n\n"); |
برنامه فوق را می توان با استفاده از زبان PERL نيز نوشت . در اين راستا لازم است کدهای نوشته شده PERL زير را در تايپ و در فايلی با نام simplest.pl ذخيره نمود.
متن برنامه به زبان Perl |
#! /usr/bin/perl print "Content-type: text/html\n\n"; print "<html><body><h1>Hello World!"; print "</h1></body></html>\n"; |
فايل فوق را در فولدر cgi-bin قرار داده و بمنظور اجرای آن ، مرورگر را فعال و در بخش آدرس آن ، آدرس زير را وارد نمائيد :
http://www.yourcompany.com/cgi-bin/simplest.pl |
در مثال فوق با نحوه استفاده از
اسکريپت های CGI بمنظور ايجاد صفحات وب
ايستا آشنا شديم . پس از اجرای برنامه های CGI
، خروجی مورد نظر برای مرورگر ارسال می گردد ( اسکريپت ) .
مهمترين مزيت و جايگاه اسکريپت
های CGI ، استفاده از تکنولوژی فوق بمنظور
ايجاد محتويات پويا می باشد. هر مرتبه که اسکريپت اجراء می گردد ،
خروحی متفاوت خواهد بود . در صورتيکه خروجی در هر مرتبه اجراء يکسان
باشد ، می توان از صفحات ايستا در اين خصوص استفاده کرد. برنامه نوشته
شده به زبان C زير ، يک محتويات پويای
ساده را ايجاد می نمايد .
يک برنامه ساده بمنظور ايجاد محتويات پويا |
#include <stdio.h> int incrementcount() { FILE *f; int i; f=fopen("count.txt", "r+"); if (!f) { sleep(1); f=fopen("count.txt", "r+"); if (!f) return -1; } fscanf(f, "%d", &i); i++; fseek(f,0,SEEK_SET); fprintf(f, "%d", i); fclose(f); return i; } int main() { printf("Content-type: text/html\n\n"); printf("<html>\n"); printf("<body>\n"); printf("<h1>The current count is: ") printf("%d</h1>\n", incrementcount()); printf("</body>\n"); printf("</html>\n"); return 0; } |
با استفاده از يک اديتور برنامه فوق را تايپ و آن را در فايلی با نام count.c ذخيره و با استفاده از دستور زير آن را کمپايل نمائيد :
gcc count.c -o count.cgi |
فايل متنی ساده ای با نام count.txt ايجاد و مقدار صفر را در آن قرار دهيد. فايل های count.cgi و count.txt را در فولدر cgi-bin ذخيره تا امکان اجرای آنها فراهم گردد. بمنظور اجرای برنامه فوق ، مرورگر را فعال و در بخش آدرس آن ، آدرس زير را تايپ نمائيد :
http://www.yourcompany.com/cgi-bin/count.cgi |
پس از اجرای برنامه فوق ، يک صفحه ايجاد که در هر مرتبه اجراء ، خروجی "The current count is :X" ، مقدار X در هر بار اجرای اسکريپ تغيير و افزايش خواهد يافت . فايل count.txt شماره جاری را در خود نگهداری و تابع incrementcounr ، تابعی است که مقدار count را پس از هر مرتبه اجراء افزايش و آن را در فايل count.txt ثبت خواهد کرد.
فرم ها :
ارسال اطلاعات ورودی
همانگونه که مشاهد گرديد ،
سرويس دهنده وب فايل های اجرائی موجود در فولدر cgi-bin
را اجراء و پس از توليد خروجی ، برای مرورگر ارسال می گردند. برای
ارسال اطلاعات به برنامه های CGI می توان از
فرم های Html استفاده کرد. از فرم ها در سايت های متعددی
استفاده می گردد. هر صفحه ای که اين امکان را به کاربران خواهد داد که
اطلاعاتی را تايپ و ارسال دارند ، از فرم استفاده می نمايد. فرم ها با
استفاده از تگ های Html ايجاد و در صفحات وب
قرار می گيرند. در تگ های Html مربوط
به فرم ، نام اسکريپت CGI که مسئول برخورد
با فرم پس از تکميل و فشردن دکمه Submit است
، مشخص خواهد شد. اطلاعاتی که توسط کاربر در فرم درج می گردنند ، پس از
ارسال فرم در اختيار اسکريپت مورد نظر گذاشته شده و امکان استفاده و
عمليات مورد نظر بر روی اطلاعات فراهم خواهد شد.
مثال : دستورات زير يک صفحه Html بهمراه يک فرم را نشان می دهد. دستورات فوق با استفاده از يک اديتور متنی تايپ و در فايلی با نام simpleform.htm ذخيره می گردند.
يک صفحه وب و يک فرم |
<html>
<body>
<h1>A super-simple form<h1>
<FORM METHOD=GET ACTION="http://www.yourcompany.com/
cgi-bin/simpleform.cgi">
Enter Your Name:
<input name="Name" size=20 maxlength=50>
<P>
<INPUT TYPE=submit value="Submit">
<INPUT TYPE=reset value="Reset">
</FORM>
</body>
</html>
|
همانگونه که مشاهده می گردد ، کدهای Html فوق يک فرم ساده شامل يک فيلد برای ورود نام را تعريف و برای ارسال اطلاعات به اسکريپت CGI از متد GET استفاده شده است . فرم فوق دارای دو دکمه submit و Reset برای ارسال اطلاعات و يا reset نمودن فرم است .
فايل simpleform.cgi ، که توسط فرم استفاده خواهد شد ، يک برنامه نوشته شده به زبان C است . برنامه فوق در ابتدا با محتويات زير در فايلی با نام simpleform.c ايجاد شده است .
پردازش اطلاعات فرم ارسالی |
#include <stdio.h> #include <stdlib.h> int main() { printf("Content-type: text/html\n\n"); printf("<html>\n"); printf("<body>\n"); printf("<h1>The value entered was: ") printf("%s</h1>\n", getenv("QUERY_STRING")); printf("</body>\n"); printf("</html>\n"); return 0; } |
برنامه فوق پس از تايپ در يک اديتور متنی در فايلی با نام simpleform.c ذخيره و بصورت زير کمپايل خواهد شد.
gcc simpleform.c -o simpleform.cgi |
پس از ترجمه برنامه فوق ، آن را در فولدر cgi-bin ذخيره می گردد. برنامه فوق اطلاعات ارسالی توسط فرم را دريافت ( انتخاب ) ، و آنها را نمايش خواهد داد. مثلا" پس از اجرای برنامه فوق خروجی مطابق زير نمايش داده خواهد شد:
The value entered was: Name=Ali+Rahmani |
Name ، نا فيلد ورودی در فرم است . هر فيلد ورودی در يک فرم می بايست دارای يک مشحصه منحصر بفرد باشد. Ali+Rahmani ، نام وارد شده در فرم است. علامت + نشاندهنده فضای خالی است .
استفاده از فرم ها بمنظور اخذ اطلاعات کاربران و ارسال آنها برای يک اسکريپت CGI عمليات ساده ای است . در اين زمينه ، پيشنهادات زير توصيه می گردد :
![]() |
هر يک از فيلدهای ورودی موجود در فرم، می بايست دارای يک مشخصه منحصربفرد باشند. |
![]() |
برای ارسال فرم می بايست متد ارسال را مشخص نمود. در اين راستا دو گزينه GET و POST وجود دارد. متد GET دارای اين مزيت عمده است که می توان مقادير وارد شده را بهمراه URL برای اسکريپت مشاهده و اشکال زدائی آن راحت تر است . ( ويژگی فوق صرفا" از بعد اشکال زدائی مورد نظر است ) |
![]() |
تعداد کاراکترهای ارسالی توسط متد GET محدوده بوده و معمولا" از آن برای ارسال اطلاعات با حجم کم استفاده می شود. متد POST برای فرم هائی که دارای اطلاعات زياد برای ارسال می باشند ، ترجيح داده می شود. |
![]() |
اطلاعات ارسال شده با استفاده از متد GET با استفاده از متغير محيطی QUERY_STRING قابل دستيابی و استفاده می باشند. ( مقدار متغير فوق در زبان C با استفاده از تابع getenv و در PERL با استفاده از ENV$ قابل دستيابی خواهند بود). اطلاعات ارسال شده توسط متد POST را در زبان C با استفاده از تابع gets و در PERL از read استفاده می گردد. |
![]() |
اطلاعات ارسالی شامل مقادير مربوط به تمام فيلدهای موجود بر روی فرم بوده که بصورت يک رشته در کنار يکديگر قرار گرفته اند. در اين زمينه ممکن است کاراکترهای فراوانی همراه فرم ارسال و نيازمند ترجمه باشند. مثلا" تمام فضا های خالی با علامت + جايگزين می گردند. |
متغير محيطی QUERY_STRING يکی از نمونه های متنوع متغير های محيطی است . در اين زمينه متغيرهای محيطی بيشتری وجود داشته که می توان از آنها بهمراه اسکريپت های CGI استفاده کرد.
متغيرهای محيطی |
||||||||||||||||||||||||||||||||||||||
|
هر يک از متغيرهای محيطی فوق ، در بردارنده اطلاعات مفيد و جالبی می باشند. مثلا" با استفاده از متغير محيطی REMOTE_USER می توان از آدرس های IP کاربران آگاهی يافت .
ايجاد يک
فرم واقعی
در يک فرم واقعی ممکن است از
چندين نوع فيلد ورود اطلاعات استفاده گردد . کنترل های استاندارد بر
روی يک فرم عبارتند از :
|
با ترکيب و استفاده از کنترل های فوق ، می توان فرم های جالبی را ايجاد کرد. در ادامه به بررسی هر يک از کنترل های فوق اشاره خواهد شد.
![]() |
Single-line edit : واژه " Input" ، يک محدوده قابل ويرايش يک خطی برای ورود اطلاعات را تعريف می نمايد. برای انتساب يک نام منحصر بفرد به فيلد فوق از واژه "Name" استفاده می گردد. هر يک از کنترل های موجود بر روی فرم می بايست دارای يک نام منحصر بفرد باشند. بمنظور تعيين اندازه ( طول ) فيلد بر حسب کاراکتر از واژه "Size" استفاده می گردد. از واژه "Maxlength" برای مشخص نمودن حداکثر کاراکتر ورودی در فيلد مربوطه استفاده می گردد. در صورتيکه فيلد فوق می بايست دارای يک مقدار اوليه در زمان نمايش بر روی فرم باشد از واژه "Value" استفاده و مقدار اوليه فيلد مورد نظر را مشخص می نمائيم . در فيلد فوق بصورت پيش فرض text وارد می گردد. در صورتيکه لازم است که صرفا" در فيلد فوق مقادير عددی صحيح وارد شود ، می بايست نوع اطلاعات وارد شده در فيلد را با صراحت مشخص کرد . در اين زمينه از واژه type=int استفاده می گردد. |
يک فيلد کنترلی Single-line |
Enter Name: <input name="Name" size=30 maxlength=50 value="Sample"> |
![]() |
Multi-Line edit : عملکرد کنترل فوق مشابه کنترل Single-line است . برای کنترل يک نام تعريف و اندازه آن برحسب تعداد سطر و ستون مشخص گردد. هر متنی که قبل از تگ <textarea/> استفاده شود بعنوان مقدار پيش فرض برای کنترل در نظر گرفته خواهد شد. |
يک فيلد کنترلی Multi-Line |
<textarea name="Company Address" cols=30 rows=4></textarea> |
![]() |
Check box : نوع خاصی از يک محدوده ورود اطلاعات بوده که برای آن يک مقدار تعيين می گردد. در صورتيکه فيلد فوق توسط کاربر انتخاب گردد ، مقدار در نظر گرفته ، برگردانده خواهد شد. |
يک فيلد کنترلی Check box |
<input type=checkbox name="Include" value=1> |
![]() |
Radio buttons : کنترل های فوق مشابه Check box بوده ولی در گروه هائی سازماندهی می گردند. تمام Radio button های موجود در يک گروه می بايست دارای يک نام مشابه بوده و در صورتيکه لازم است برای آنها مقدار اوليه ای را تغريف کرد از واژه "CHECKED" استفاده می گردد. |
يک فيلد کنترلی Radio buttons |
Choose your item:<br> <input type=radio CHECKED name=one value=ONE> <input type=radio name=two value=TWO> <input type=radio name=three value=THREE> <input type=radio name=four value=FOUR> |
![]() |
Selection lists : ليست های انتخابی ، امکان انتخاب يک گزينه از ميان مجموعه ای گزينه های را برای کاربر فراهم می نمايد. با استفاده از وازه " Size" طول فيلد مشخص و با استفاده از واژه "Name" ، برای کنترل يک نام منحصر بفرد تعريف می گردد. |
يک فيلد کنترلی Selection list |
Select an Option<br> <SELECT size=2 NAME="Option"> <OPTION> Option 1 <OPTION> Option 2 <OPTION> Option 3 <OPTION> Option 4 </SELECT> |
![]() |
دکمه های خاص : تگ های زير دو دکمه خاص را تعريف می کند. دکمه Submit اطلاعات موجود در فرم را برای سرويس دهنده ارسال و دکمه Reset برای Reset نمودن فرم استفاده می گردد. |
فيلدهای کنترلی خاص |
<INPUT TYPE=submit value="Submit"> <INPUT TYPE=reset value="Reset"> |
يک فرم واقعی
فرم زير اطلاعات متعددی شامل :
نام ، جنسيت ، سن و توضيحات را از کاربران اخذ و آنها را برای پردازش
در اختيار يک اسکريپت CGI قرار خواهد داد.
فرم فوق در يک صفحه html با نام
Testform.htm ذخيره خواهد گرديد.
يک فرم کامل |
<html> <body> <h1>Test Form <h1> <FORM METHOD=POST ACTION="http://www.yourcompany.com/cgi-bin/testform.cgi"> Enter Your Name: <input name="Name" size=20 maxlength=50> <P>Enter your sex: <input type=radio CHECKED name=sex value=MALE>Male <input type=radio name=sex value=FEMALE>Female <P>Select your age<br> <SELECT size=2 NAME=age> <OPTION> 1-10 <OPTION> 11-20 <OPTION> 21-30 <OPTION> 31-40 <OPTION> 41-50 <OPTION> 51-60 <OPTION> 61 and up </SELECT> <P>Enter Your Comment: <input name="Name" size=40 maxlength=100> <P> <INPUT TYPE=submit value="Submit"> <INPUT TYPE=reset value="Reset"> </FORM> </body> </html> |
اسکريپت CGI ، چهار فيلد اطلاعاتی موجود در فرم را اخذ و پردازش های لازم را انجام خواهد داد.
خلاصه
![]() |
يک اسکريپت CGI برنامه ای است که عموما" با استفاده از زبانهای C و يا PERL نوشته می گردند. |
![]() |
در اکثر سرويس دهندگان ، اسکريپت های CGI در فولدر cgi-bin قرار می گيرند. |
![]() |
اسکريپت های CGI موجود در فولدر cgi-bin در زمان درخواست کاربر ، اجراء خواهند شد. |
![]() |
تمام اطلاعات ارسالی توسط اسکريپت ها به STDOUT برای مرورگر ارسال خواهند شد. |
![]() |
رشته "Content-type:text/html\n\n" می بايست اولين خط ارسالی برای مرورگر باشد. |
![]() |
بمنظور ارسال اطلاعات ورودی از فرم های html استفاده و با استفاده از ACTION آدرس اسکريپت پاسخگو مشخص می گردد. |
![]() |
پس از دريافت اطلاعات فرم ها توسط يک اسکريپت ، می بايست عمليات پالايش اطلاعات ( حذف کاراکترهای غير ضروری ) انجام گيرد. |
در صورت طراحی و پياده سازی يک سايت واقعی و پويا ، استفاده از اينترفيس CGI يکی از گزينه های مناسب در اين زمينه خواهد بود .