چگونه اسکریپت CGI کار می کند

مکانیسم CGI
در بیشتر سرورهای وب، مکانیزم CGI به روش زیر استاندارد شده است. در درخت دایرکتوری معمولی که سرور آن را ریشه می داند، شما یک پوشه زیر را به نام cgi-bin ایجاد می کنید. (شما می توانید این پوشه را در شکل قبلی مشاهده کنید.) سرور پس از آن می داند که هر فایل درخواست شده از دایرکتوری ویژه cgi-bin نباید فقط خواندن و ارسال شود، بلکه باید اجرا شود. خروجی برنامه اعدام همان چیزی است که در واقع به مرورگر درخواست شده از صفحه فرستاده شده است. اجرایی به طور کلی یک اجرایی خالص است، مانند خروجی یک کامپایلر C، یا یک پرونده PERL است. PERL یک زبان بسیار محبوب برای اسکریپت CGI است.

تصور کنید که URL زیر را در مرورگر خود تایپ می کنید: https://www.howstuffworks.com/cgi-bin/search.pl. سرور به رسمیت شناخته شده است که search.pl در دایرکتوری cgi-bin است، بنابراین exec.asp (که یک پرونده PERL است) اجرا می کند و خروجی را از اعدام به مرورگر شما می فرستد.

شما می توانید اسکریپت خود را بنویسید و خودتان CGI را امتحان کنید:

    
شما یک زبان برنامه نویسی مانند C یا PERL می دانید.
    
شما به یک سرور وب دسترسی دارید که اسکریپت های CGI را مدیریت می کند. اگر شما خدمات میزبانی وب را برای میزبانی وب سایت خود پرداخت کرده اید، احتمالا شما از طریق میزبان خود به اسکریپت CGI دسترسی خواهید داشت. برای جزئیات بیشتر با سرویس میزبانی تماس بگیرید. اگر نه، شما می توانید با نصب یک سرور وب در دستگاه خانگی خود و یادگیری از آن استفاده کنید. گزینه دوم کمی پیچیده تر است، اما شما تضمین می کنید که در این فرآیند بسیار زیاد یاد بگیرید!

 

اسکریپتهای CGI ساده
با فرض اینکه شما به یک دایرکتوری cgi-bin دسترسی داشته باشید (به بخش قبلی مراجعه کنید) و فرض کنید که شما زبان برنامه نویسی C یا PERL را می شناسید، می توانید چندین آزمایش جالب را با CGI انجام دهید تا پاهای خود را خیس کنید. ابتدا با ایجاد ساده ترین اسکریپت CGI شروع کنید.

در مقاله How Web Pages Work، ما ساده ترین صفحه وب HTML را بررسی کردیم. این چیزی شبیه به این بود:

 

<html>

  <body>

     <h1>Hello there!</h1>

  </body>

</html>

 

 

ساده ترین اسکریپت CGI، پس از اجرای، این صفحه ساده و ثابت را به عنوان خروجی آن ایجاد می کند. در اینجا این است که چگونه این برنامه CGI به نظر می رسد اگر شما آن را در C:

 

#include <stdio.h>
 
int main()
{
  printf("Content-type: text/html\n\n");
  printf("<html>\n");
  printf("<body>\n");
  printf("<h1>Hello there!</h1>\n");
  printf("</body>\n");
  printf("</html>\n");
  return 0;
}

 

 

در وب سرور من، این برنامه را به فایل simpleest.c وارد کردم و سپس آن را با گفتن گفتم:

gcc simplest.c -o simplest.cgi

 

(برای جزئیات کامپایل برنامه های C به نحوه کارکرد برنامه نویسی مراجعه کنید.)

با قرار دادن simplest.cgi در پوشه cgi-bin، می توان آن را اجرا کرد. همانطور که می بینید، تمام آنچه که اسکریپت انجام می دهد، یک صفحه ای تولید می کند که می گوید: “سلام!” تنها بخش غیر منتظره خط است که می گوید:

printf("Content-type: text/html\n\n");

 

خط “Content-type: text / html \ n \ n” یک قطعه خاص از متن است که باید اولین چیزی باشد که توسط هر اسکریپت CGI به مرورگر ارسال می شود. تا زمانی که به یاد داشته باشید برای انجام این کار، همه چیز خوب خواهد بود. اگر شما فراموش کردید، مرورگر خروجی اسکریپت را رد می کند.

شما می توانید همان کار را در PERL انجام دهید. این کد PERL را به یک فایل به نام simplest.pl پر کنید:

 

#! /usr/bin/perl
print "Content-type: text/html\n\n";
print "<html><body><h1>Hello World!";
print "</h1></body></html>\n";

 

فایل را در دایرکتوری cgi-bin قرار دهید. در یک دستگاه یونیکس، ممکن است به تایپ نیز کمک کند:

chmod 755 simplest.pl

 

این به UNIX می گوید که اسکریپت اجرایی است.

شما فقط ایده اصلی اسکریپت CGI را دیدید. واقعا به همین سادگیه! یک برنامه اجرا می شود و خروجی آن به مرورگر فرستاده می شود که اسکریپت نامیده می شود. خروجی Normal به stdout ارسال می شود که به مرورگر فرستاده می شود.

با این حال، نقطه شروع اسکریپت 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 ایجاد کنید و یک عدد صفر در آن قرار دهید. با قرار دادن counter.cgi و count.txt در پوشه cgi-bin، می توانید اسکریپت را اجرا کنید. همه آنچه که اسکریپت انجام می دهد یک صفحه ای است که می گوید: “تعداد فعلی: X” است، جایی که X هر بار که شما اسکریپت را اجرا می کنید، افزایش می یابد. سعی کنید آن را چندین بار اجرا کنید و محتوای تغییر صفحه را تماشا کنید!

فایل count.txt شمارش جاری را نگه می دارد و تابع increconcount () تابع کوچک است که شمارش را در فایل count.txt افزایش می دهد. این تابع فایل count.txt را باز می کند، شماره آن را می خواند، تعداد آن را افزایش می دهد و آن را به فایل می نویسد. این تابع در واقع تلاش می کند فایل را دو بار باز کند. این کار فقط در مورد دو نفر سعی دارد به طور همزمان به فایل دسترسی پیدا کند. مطمئنا تکنیک احمقانه نیست، اما برای چیزی که این کار ساده است، کار می کند. اگر فایل را در مرحله دوم باز نکنید، -۱ مقدار خطای بازگشت به تماس گیرنده است. یک برنامه پیچیده تر -۱ ارزش بازگشتی را تشخیص می دهد و یک پیام خطا مناسب ایجاد می کند.

 

فرم ها: ارسال ورودی
ما دیده ایم که ایجاد اسکریپت های CGI بسیار آسان است. سرور وب هر اجرایی را که در دایرکتوری cgi-bin قرار دارد اجرا می کند و هر خروجی ای که اجرایی به stdout می فرستد در browser نمایش می دهد که اسکریپت نامیده می شود. حالا آنچه ما نیاز داریم، راهی برای ارسال یک ورودی به یک اسکریپت است. روش معمول برای ارسال ورودی استفاده از یک فرم HTML است.

فرم ها را در سراسر وب مشاهده می کنید. هر صفحهی که شما توانستید چیزی را تایپ کنید یک فرم است. آنها را در موتورهای جستجو، کتاب های مهمان، پرسشنامه ها و غیره می بینید. صفحه خانگی HowStuffWorks.com شامل حداقل دو قالب کوچک است، یکی برای «چطور به اینجا رسیدید؟» نوار کناری و یکی برای نوار کناری پیشنهادات (بله، یک صفحه HTML تنها می تواند شامل چندین فرم باشد). شما فرم را در صفحه HTML خود ایجاد می کنید و در تگ های HTML برای فرم شما نام اسکریپت CGI را برای تماس زمانی که کاربر روی دکمه ارسال بر روی فرم کلیک می کند، مشخص می کند. مقادیری که کاربر وارد فرم می شود بسته بندی می شود و به اسکریپت فرستاده می شود که می تواند از هر نوعی که دوست دارد استفاده کند.

شما واقعا این نوع چیزها را به طور مداوم مشاهده کرده اید و ممکن است متوجه نشوید که این اتفاق می افتد. به عنوان مثال، به http://www.lycos.com بروید، کلمه “test” را در جعبه “Search for:” تایپ کنید و “Go Get It!” را فشار دهید. دکمه. URL صفحه نتیجه مانند این خواهد بود:

http://www.lycos.com/cgi-bin/pursuit?matchmode=and
                    &cat=lycos&query=test&x=10&y=9

 

شما می توانید ببینید که صفحه اصلی Lycos یک فرم است. Lycos دارای یک اسکریپت در فهرست cgi-bin به نام تعقیب است. این فرم پنج پارامتر را به اسکریپت ارسال می کند:

     matchmode =
و
    
گربه = lycos
     query = test
     x = 10
     y = 9

سومین رشته جستجو ما وارد شده است. چهار نفر دیگر نیز چیزی را به اسکریپت می رسانند. اسکریپت CGI در پایگاه داده Lycos برای کلمه “test” را نمایش می دهد و سپس نتایج را برمی گرداند. این قلب هر موتور جستجو است!

بیایید یک فرم ساده برای این را امتحان کنیم. یک فایل با نام simpleform.htm ایجاد کنید و HTML زیر را وارد کنید:

<html>
<body>
  <h1>A super-simple form<h1>
  <FORM METHOD=GET ACTION="https://www.howstuffworks.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 مشخص ایجاد یک فرم است که از روش GET ارسال شده به اسکریپت CGI در https://www.howstuffworks.com/cgi-bin/simpleform.cgi استفاده می کند. درون فرم، یک منطقه ورودی متن به علاوه دکمه های استاندارد و بازنشانی استاندارد است.

فایل https://www.howstuffworks.com/cgi-bin/simpleform.cgi که توسط این فرم ارجاع شده است یک برنامه C است. این زندگی آغاز شد به عنوان این قطعه کد 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;
}

 

این دستور با استفاده از دستور زیر انجام شد:

gcc simpleform.c -o simpleform.cgi

 

و این در دایرکتوری cgi-bin قرار داشت. این برنامه به سادگی ارزش فرستاده شده توسط فرم را بر میدارد و آن را نمایش می دهد. برای مثال، ممکن است موارد زیر را ببینید:

The value entered was: Name=John+Smith

 

نام شناسه برای فیلد ورود متن در فرم است (هر فیلد ورودی در یک فرم باید یک شناسه منحصر به فرد داشته باشد)، و جان + اسمیت یک نام معمولی است که ممکن است در فرم وارد شود. توجه داشته باشید که “+” کاراکتر فضایی را جایگزین می کند.

از این مثال، می توانید ببینید که فرایند اساسی ایجاد یک فرم و گرفتن داده ها از یک فرم به یک اسکریپت CGI نسبتا ساده است. در اینجا چندین جزئیات وجود دارد که باید در ذهن داشته باشید:

    
هر فیلد ورودی در فرم باید یک شناسه منحصر به فرد داشته باشد.
    
فرم باید از روش GET یا POST استفاده کند. روش GET دارای مزیتی است که شما می توانید مقادیر فرم را در URL ارسال شده به اسکریپت ببینید و باعث می شود که اشکال زدایی ساده تر شود.
    
محدودیت های مشخصی برای تعداد کاراکترهایی که می توانند از طریق روش GET ارسال شوند وجود دارد، بنابراین POST برای فرم های بزرگ ترجیح داده می شود.
    
داده هایی که از طریق روش GET در می آیند با نگاه کردن به متغیر محیطی QUERY_STRING (معمولا با عملگر getenv در C و یا ENV در PERL خوانده می شود) دریافت می شود. داده هایی که از طریق روش POST وارد می شوند از طریق STDIN با استفاده از C وارد می شوند یا در Perl خوانده می شوند.
    
داده هایی که وارد می شوند، تمام رشته ها را با هم در یک رشته ترکیب می کنند، و بسیاری از شخصیت ها جایگزین خواهند شد و بنابراین نیاز به ترجمه دارند. به عنوان مثال، تمام فضاهای با پلاگین جایگزین خواهند شد.

متغیر محیطی QUERY_STRING به طور کلی موضوع متغیرهای محیطی را به ارمغان می آورد. تعدادی متغیر محیطی وجود دارد که می توانید در اسکریپت CGI خود بررسی کنید، از جمله:

    AUTH_TYPE
    CONTENT_LENGTH
    
نوع محتوا
    GATEWAY_INTERFACE
    HTTP_ACCEPT
    HTTP_USER_AGENT
    PATH_INFO
    PATH_TRANSLATED
    QUERY_STRING
    REMOTE_ADDR
    
میزبان راه دور
    REMOTE_IDENT
    REMOTE_USER
    REQUEST_METHOD
    SCRIPT_NAME
    
نام ارائهکننده
    SERVER_PORT
    SERVER_PROTOCOL
    SERVER_SOFTWARE

انواع مختلف جزییات جالب اطلاعاتی که در این متغیرهای محیط ذخیره شده اند شامل طول رشته ورودی (CONTENT_LENGTH)، METHOD مورد استفاده (GET یا POST – REQUEST_METHOD به شما امکان می دهد که در مورد STDIN یا QUERY_STRING برای ورودی نگاه کنید) )، آدرس IP دستگاه کاربر (REMOTE_ADDR)، و غیره. برای توصیف کامل این متغیرها، به متغیر محیطی CGI مراجعه کنید.

 

ایجاد یک فرم واقعی
یک شکل واقعی از قسمت های گوناگون ورودی تشکیل می شود و مقدار کد در اسکریپت نیاز به بازنویسی نقشه های شخصیت و تجزیه رشته های فردی دارد. با نگاه کردن به کنترل های ورودی استاندارد بر روی یک فرم ابتدا شروع کنید. آنها عبارتند از:

    
ورودی تک خطی
    
ورودی چند خطی
    
لیست انتخاب
    
جعبه ها را چک کنید
    
دکمه های رادیویی
    
دکمه های تخصصی برای ارسال یا پاکسازی فرم

شما می توانید این کنترل ها را با سایر متون و گرافیک استاتیک ترکیب کنید، همانطور که در هر صفحه دیگر قرار دارید.

در اینجا چندین نمونه وجود دارد که نشان می دهد استفاده از برچسب های مختلف کنترل:

ویرایش خط تک خطی

کلمه “input” یک منطقه ویرایش خط را شناسایی می کند. فیلد “name” یک شناسه برای کنترل به اسکریپت CGI را فراهم می کند و باید برای هر کنترل بر روی فرم منحصر به فرد باشد. فیلد “size” نشان دهنده عرض، در کاراکترها، منطقه ورودی در فرم است. “Maxlength” حداکثر تعداد کاراکترهای موجود در منطقه ورودی را محدود می کند. “ارزش” مقدار اولیه را تعیین می کند.

Enter Name: <input name="Name" size=30 maxlength=50
value="Sample">

 

به طور معمول، منطقه ورودی قبل از یک قطعه از متن استاتیک است که هدف از فیلد ورودی را شناسایی می کند. در اینجا این متن استاتیک است “Enter name:”.

شما می توانید مقدار “type = int” را برای محدود کردن ورودی به مقادیر عدد صحیح اضافه کنید. به طور پیش فرض، نوع “متن” است و هر حرفی را می پذیرد.

ویرایش چند خط

یک منطقه ویرایش چند خط شبیه به یک منطقه ورودی است. شما یک نام برای کنترل تعریف می کنید و اندازه آن را در فرم در سطر و ستون تعریف می کنید. هر چیزی که قبل از </ textarea> گذاشته اید در کنترل به عنوان مقدار پیش فرض ظاهر می شود.

<textarea name="Company Address" cols=30
rows=4></textarea>

 

جعبه ها را چک کنید

جعبه چک نوع خاصی از یک منطقه ورودی با نوعی است که به “جعبه” تنظیم شده است.

<input type=checkbox name="Include" value=1>

 

اگر کادر انتخاب انتخاب شود، مقدار بازگشت خواهد شد.

دکمه های رادیویی

دکمه های رادیویی شبیه به جعبه های چک هستند، اما آنها به صورت بصری با هم گروه بندی می شوند:

Choose the search area:<br>
<input type=radio CHECKED name=universe value=US-STOCK>
Stocks
<input type=radio name=universe value=CA-STOCK>
Canadian Stocks
<input type=radio name=universe value=MMF>
Money Markets
<input type=radio name=universe value=MUTUAL>
Mutual Funds

توجه داشته باشید که دکمه رادیوی پیش فرض می تواند با کلمه CHECKED مشخص شود. همچنین توجه داشته باشید که تمام دکمه های رادیویی در همان گروه دارای همان نام هستند.

لیست انتخاب

یک لیست انتخابی، کاربر را از تعدادی گزینه انتخاب می کند. برچسب برای یک لیست انتخاب به شما اجازه می دهد تعداد ردیف های قابل مشاهده در زمینه “اندازه” و همچنین مقادیر برای تمام گزینه ها را مشخص کنید.

Select an Option<br>
<SELECT size=2 NAME="Option">
    <OPTION> Option 1
    <OPTION> Option 2
    <OPTION> Option 3
    <OPTION> Option 4
</SELECT>

 

کلمه MULTIPLE یک قابلیت چند انتخابی را ایجاد می کند.

دکمه های تخصصی

تگ های زیر دو دکمه تخصصی را ایجاد می کنند، یکی برای ارسال فرم به سرور و یکی برای بازنشانی فرم:

<INPUT TYPE=submit value="Submit">
<INPUT TYPE=reset value="Reset">

 

 

همه اش رو بذار کنار هم
بگذارید بگوییم شما مایلید یک پرسشنامه ساده برای یکی از صفحات وب خود ایجاد کنید. به عنوان مثال، شما می خواهی نام خواننده، جنسیت، سن و نظر را بپرسید و سپس آن را در یک اسکریپت CGI پردازش کنید. فرم HTML ممکن است در یک فایل با نام https://www.howstuffworks.com/survey.htm زندگی کند و شبیه به این باشد:

<html>
  <body>
    <h1>HSW Survey Form<h1>
    <FORM METHOD=POST ACTION="http:
//www.howstuffworks.com/cgi-bin/survey.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 که توسط این فرم ارجاع شده است، چهار قطعه مختلف داده را دریافت می کند: نام، سن، جنسیت و نظر خواننده که فرم را ارائه می دهد. اسکریپت باید چهار ارزش را تجزیه و تحلیل کند و تمامی تحولات شخصیت را مدیریت کند. یک فایل جداگانه به نام https://www.howstuffworks.com/survey.c برای ایجاد survey.cgi script استفاده شده و شاید ۱۰۰ خط طول داشته باشد.

 

خلاصه
در این تور سریع CGI scripting، ما شاهد آن هستیم:

    
یک اسکریپت CGI یک برنامه است – به طور کلی یک برنامه C یا یک PERL اسکریپت است.
    
در بیشتر سرورها، اسکریپتهای CGI در دایرکتوری به نام cgi-bin زندگی میکنند. اسکریپت زمانی اجرا می شود که آدرس URL اسکریپت توسط یک مرورگر درخواست شود.
    
هر چیزی که اسکریپت به STDOUT ارسال می کند به مرورگر ارسال می شود. رشته “Content-type: text / html \ n \ n” باید اولین چیزی باشد که ارسال شده است. پس از آن هر چیزی می رود اما معمولا، تگ های معتبر HTML برای یک سند معتبر HTML ارسال می شوند.
    
ورودی به اسکریپت با ایجاد یک فرم HTML که ACTION نشانی اینترنتی اسکریپت را مشخص می کند ارسال می شود.
    
هنگامی که یک اسکریپت داده ها را از فرم دریافت می کند، باید رشته های مختلف را تجزیه و تحلیل کند و همه کاراکترهای اصلاح شده را تبدیل کند. ما یک برنامه C ساده را دیدیم که می تواند این وظایف را انجام دهد. کتابخانه CGI برای PERL (به صفحه بعدی مراجعه کنید) تبدیل آسان برای اسکریپت PERL را آسان می کند.

اگر این کار را در یک وب سایت واقعی انجام دادید، معمولا نتایج هر بررسی را به یک فایل متنی یا یک پایگاه داده ذخیره می کنید تا بتوانید نتایج را بعدا بررسی کنید. این آسان است که از برنامه C یا یک PERL انجام شود.

 

دیدگاه‌تان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *