PHP-də dəyişənlər. Integer (tam ədədlər)

Riyaziyyat kursundan məlumadur ki, tam ədədlər dedikdə natural ədədlər, onların əksi və sıfır (0) birlikdə olan çoxluq nəzərdə tutulur. PHP dilində də digər proqramlaşdırma dillərində olduğu kimi Integer anlayışı elə riyaziyyatdakı tam ədəd anlayışı ilə eynidir. Lakin əməliyyat sisteminin neçə bit əsaslı olmasından asılı olaraq onun yuxarı və aşağı sərhədləri müəyyən olunur. 32-bit variantlı ƏS-də tam ədəd -2 147 483 648-dən 2 147 483 647-ə qədər qiymət ala bilər. 64-bit variantlı ƏS-də isə tam ədəd -9 223 372 036 854 775 807-dən  9 223 372 036 854 775 807 kimi qiymət ala bilər. PHP-də tam ədədin maksimal dəyərini əvvəlcədən təyin edilmiş PHP_INT_MAX sabitinə müraciət etməklə ayırd etmək olar.

<?php
  echo PHP_INT_MAX; // 9223372036854775807
?>

PHP7 və ondan sonrakı versiyalarda, Integerin həmçinin ən aşağı sərhəddini göstərən PHP_INT_MIN sabiti də daxil edilmişdir.

Alternativ kimi PHP_INT_SIZE sabitindən istifadə etmək olar. Bu sabitin qiyməti tam ədədlər üçün yaddaşdan neçə bayt ayrıldığını göstərir. 32-bit ƏS-də bu sabit 4 qiymətini alır. 4 baytın hərəsinə 8 bit olduğunu nəzərə alsaq məhz 32 bit edir və bunu da 32 bit əsaslı prosessorlarda emal etmək rahatdır. 64 bit əsaslı versiyalarda PHP-in bu sabitinin qiyməti 8-dir.

Tam ədəd göstərilən diapazondan kənara çıxarsa avtomatik double tipli ədədə çevrilir.

PHP-də dəyişənlər

Digər proqramlaşdırma dillərində olduğu kimi (çox güman ki, tək Forth dili istisna olmaqla) PHP-də də dəyişən (İngilis dilində “variable“) anlayışı var. Əvvəlki mövzularda dəyişənin nə olduğunu çox güman ki, təxmin etmisiniz.

PHP-də proqramlaşdırma zamanı yeni dəyişənlərin elan edilməsində xəsislik etmək qəbul edilməyib. Məsələn, elə əvvəlki sadə misalımızda biz sadəcə bir dəyişəndən – dövr operatorunun sayğacından istifadə edə bilərdik. Ancaq bir neçə dəyişən elan edəndə skript daha oxunaqlı olur, həm də interpretatora yeni identifikator yaratmaq ümumiyyətlə “ucuz” başa gəlir.

Dəyişənlərin adı reqistrə həssasdır. Bu o deməkdir ki, məsələn, $my_variable, $My_variable, $My_Variable$MY_VARIABLE tam fərqli dörd dəyişəndir. Həm də dəyişənlərin adları mütləq $ işarəsi ilə başlamalıdır. Bu, dəyişnləri daha rahat ayırd etmək və “başa düşməkdə” interpretatorun işini sadələşdirir.

PHP-də dəyişənlər sözün əsl mənasında istənilən informasiyanı özündə saxlaya bilən xüsusi obyektlərdir. Əgər proqramda nəsə saxlanılırsa o mütləq hər hansısa dəyişəndə saxlanılır. İstisna hal daxilində yalnız ədəd və yazı, PHP7-dən başlayaraq isə massiv saxlaya bilən sabitlər ola bilər.

PHP-də həmçinin istinad dəyişənlər anlayışı da var. Bu tipin üç növü var: birbaşa, simvolikobyektə istinad. Növbəti mövzulardan birində bu haqda danışılacaq.

Yuxarıda deyildiyi kimi PHP-də dəyişənləri açıq elan etmək, onların tipini əvvəlcədən elan etmək lazım deyil. Bu interpretator tərəfindən avtomatik edilir. Ancaq hərdən, məsələn, yazı tipli dəyişəndə həqiqətən də rəqəm göstərilərsə interpretator səhv edə bilir və buna görə də nadir hallarda bu və ya digər ifadənin hansı tipdə olduğunu aydın göstərmək ehtiyacı yarana bilər.

PHP-də dəyişənlərin birbaşa olaraq bir necə tipi var. İrəli gedərək qeyd edək ki, dəyişənin tipini gettype($variable) funksiyasını çağırmaqla öyrənmək olar. Bu funksiya dəyişənin tipinin yazı formasında adını qaytarır.

Növbəti mövzularda PHP-in başa düşdüyü dəyişənlərin tiplərinə qısa da olsa ayrılıqda baxılıb:

PHP proqram nümunəsi

İndi isə PHP dilində ənənəvi “Hello, world!” proqramına baxaq:

<?php
echo "Hello, world!";
?>

PHP-skript öz təbiətinə görə adi CGI-skriptlərdən müəyyən qədər fərqlidir. Yuxarıda göstərilən proqramı başqa üsulla yazmaq olar. İndi yazacağımız nümunə bu fərqi izah edəcək. PHP sintaksisi ilə heç vaxt qarşılaşmayanlar üçün bu daha maraqlı görsənəcək.

<body>
Hello, world!
</body>

Bəli, burda həqiqətən də heç bir PHP operatoru yoxdur və “proqram” faylının daxili statik mətndən ibarətdir. Belə çıxır ki, adi HTML mətni də PHP tərəfindən normal emal olunur? Bəli, bu belədir. Ancaq gəlin, daha mürəkkəb nümunəyə baxaq:

<!DOCTYPE html>
<html lang='az'>
    <head>
        <title>Sadə PHP skript</title>
        <meta charset='utf-8'>
    </head>
<body>
    <p>
        <?php 
        //bu günkü tarixi "gün.ay il" formatında hesablayaq
        $date = date("d.m y"); 
        //bu andakı saatı hesablayaq
        $time = date("h:i:s");
        # onları çap edək
        echo "Tarix: $date il<br />n";
        echo "Saat: $time<br />n"; 
        # Rəqəmləri çap edək
        echo "İlk 5 natural ədədlərin kvadrat və kubları:<br />n"; 
        echo "<ul>n";
        for ($i = 1; $i <= 5; $i++) { 
            echo "<li>$i kvadratı = " . ($i * $i); 
            echo ", $i kubu = " . ($i * $i * $i) . "</li>n"; 
        }
        ?>
        </ul>
    </p>
</body>
</html> 

Çox güman ki, hər hansı bir dilin sintaksisini nümunələrə baxaraq diaqram və ya sxemlərə nisbətən daha rahat “hiss etmək” olar. İrəlidə biz də bu prinsipə əsalanacağıq. Yazılmış proqramı başa düşməyə çalışaq.

Skriptin əvvəlinə diqqət yetirsək görərik ki, burda çaşdırıcı nüans var. <html>, <body> HTML teqləri burda nə iş görür? Bu həqiqətən skriptdirmi? Bax elə bu məsələdə PHP dilinin əsas üstünlüyü gizlənir: göründüyü kimi, PHP-skript adi HTML-sənəddən heç fərqlənməyə bilər.

Davam edək. Yəqin fikir verdiniz ki, skriptlər <?php teqi ilə başlayıb  ?> teqi ilə bitir. Beləliklə bu iki teq daxilindəki yazılar proqram kimi interpretasiya edilir və HTML-sənəddə görsənmir. Proqrama nəyisə çap etmək lazım gəldikdə isə echo operatorundan istifadə edilməlidir. İrəlidə onun necə işlədiyinə ətraflı baxacağıq. Beləliklə, aydın olur ki, PHP elə qurulub ki, <?php?> proqram bloklarından kənarda olan bütün yazılar olduğu kimi brauzerə ötürülür, yəni echo operatorunun nəticəsi kimi başa düşülür.

Yəqin ki, // işarəsindən sonrakı yazıların kommentariya olduğunu başa düşmüsünüz. Kommentariyalar proqramın gedişatına heç bir təsir göstərmir. Bir sətirlik kommentariyaları həmçinin, nümunədən göründüyü kimi, # işarəsi ilə də ayırmaq olar. Kommentariyalar çox sətirlik də ola bilər:

/*
kommentariya
... kommentariyanın növbəti sətri
*/

Davam edək. Növbəti sətir:

$date = date("d.m y"); 

Bu sətrin gördüyü işi izah edək. $date adlı dəyişənə date() funksiyasının qaytardığı dəyər mənimsədilir. Nəzərinizdə saxlayın ki, PHP-də mütləq şəkildə bütün dəyişənlər $ işarəsi ilə başlayır, çünki interpretasiya üçün bu daha rahatdır. Beləliklə görürük ki, PHP-də birinci olaraq dəyişənləri əvvəlcədən elan etməyə ehtiyac yoxdur (məsələn, Pascal və C dilindən fərqli olaraq), ikincisi isə onların tipi (yazı, işarə, tam ədəd və s.) heç yerdə göstərilmir. İnterpretator nəyin harda hansı tipdə olduğuna özü qərar verir. date() funksiyası haqqında qeyd etmək lazımdır ki, ona nəticənin formatını müəyyən edən bir parametr ötürülür. Bizim halımızda bunun nəticəsi məsələn, 07.11 2017 kimi olacaq.

Bütün operatorların sonunda C dilində olduğu kimi nöqtəli vergül dayanmalıdır (;). Diqqət yetirin ki, Pascal-dakı kimi yox, məhz C dilindəki kimi. Başqa sözlə, siz if-else konstruksiyasında else-dən əvvəl mütləq nöqtəli vergül yazmalı, funksiyanın başlığından sonra isə yazmamalısınız.

Növbəti sətirdə yenidən kommentariya, sonra isə əvvəlkinə bənzər digər operatoru görürük. O, $time dəyişəninə date() funksiyasını yenidən çağıraraq “saat:dəqiqə:saniyə” formatında cari saatı mənimsədir. Gələcəkdə bu faydalı funksiyanın bütün imkanları ətraflı təsfir ediləcək.

Növbəti sətirdə kommentariya, sonra isə yazı sətirlərini, tarix və saatı çap edən echo operatorları gəlir. Onlardan birinə baxaq:

echo "Tarix: $date il<br />n";

Diqqət yetirin! İstənilən dəyişənin $ işarəsi ilə başlaması onu interpretatorun yazının istənilən yerində $date əvəzinə yerləşdirməsinə imkan verir (istənilən yazının, yəni bu yazının echo-un parametri olması vacib deyil). Əslində echo konstruksiyasının parametrlərinin sayı məhtud olmadığından bu sətiri belə də yazmaq olar:

echo "Tarix:", $date, "il<br />n";

və ya yazıları birləşdirmək üçün . əməlindən istifadə etməklə belə yaza bilərik:

echo "Tarix:" . $date . "il<br />n";

Yeri gəlmişkən, yazıların konkatenasiyası üçün niyə məsələn + işarəsi yox məhz nöqtə – . istifadə edilməsi sualına sadə bir misalla cavab vermək olar:

$a = "100";
$b = "200";
echo $a + $b; // nəticə "300" 
echo $a . $b; // nəticə "100200" 

Görünür ki, + məhz rəqəmlərlə, . isə yazı ilə işləyən operator kimi istifadə edilir. Operatorların tətbiqində nyüansları növbəti mövzularda aydınlaşdırcağıq.

Dəyişənlərin yazı daxilinə birbaşa “daxil edilməsinə” aid növbəti nümunə:

$path = "/home/site/public_html"; $name = "script"; $ext = "php";
$fullPath = "$path/$name.$ext";

Belə yazılış aşağıdakı kimi yazılışdan daha “gözəl” görsənir:

$path = "/home/site/public_html"; $name = "script"; $ext = "php";
$fullPath = $path . "/" . $name . "." . $ext;

Perl terminləri ilə desək, cüt dırnaq – "" işarələri arasında yazılmış yazı daxilindəki dəyişənlər interpretasiya edilir, yəni genişlənir. PHP-də yazıları təsfir etməyin başqa üsulu da var. Bu apastrof işarələri – '' arasındakı yazılardır. Bu işarələrin daxilində dəyişənlər interpretasiya edilmir.

Beləliklə demək olar ki, skriptimizin əsas hissəsinə – ilk 5 natural ədədin kvadrat və kubunu tapan “unikal” alqoritmə çatdıq. Həmin hissə aşağıdakı kimidir:

for ($i = l; $i <= 5; $i++) { 
   echo "<li>$i kvadratı = " . ($i * $i); 
   echo ", $i kubu = " . ($i * $i * $i) . "</li>n"; 
}

Birinci sətirdə for dövr operatoru müəyyən edilib. $i sayğacdır, ona başlanğıc olaraq 1 mənimsədilib və altıya çatana qədər hər addımda vahid qədər artır, inkrementasiya edir. Sonra kvadrat və kubu çap edən blok gəlir. Biz bilərkdən bu nümunədə çap etmək əməlini bir sətirdə yox iki sətirdə yazmışıq. Burda məqsəd PHP-də də C və bənzər dillərdəki kimi bir neçə operatoru fiqurlu mötərizə daxilində qruplaşdırıb yuxarıdakı kimi bir mürəkkəb operator – tərkib operator şəklinə gətirmək mümkün olduğunu göstərməkdir.

Nəhayət, bütün bunlardan sonra PHP-in bağlayan ?> teqi, sonra səhifəni sona yetirən adi HTML-teqlər gəlir.

Yazdığımız skriptin işləməsi nəticəsində aşağıdakı kimi HTML-kod əmələ gələcək:

<!DOCTYPE html>
<html lang='az'>
<head>
    <title>Sadə PHP skript</title>
    <meta charset='utf-8'>
</head>
<body>
<p>
    Tarix: 07.11 17 il<br />
    Saat: 12:23:27<br />
    İlk 5 natural ədədlərin kvadrat və kubları:<br />
    <ul>
        <li>1 kvadratı = 1, 1 kubu = 1</li>
        <li>2 kvadratı = 4, 2 kubu = 8</li>
        <li>3 kvadratı = 9, 3 kubu = 27</li>
        <li>4 kvadratı = 16, 4 kubu = 64</li>
        <li>5 kvadratı = 25, 5 kubu = 125</li>
    </ul>
</p>
</body>
</html>

Gördüyünüz kimi, skript yazılmış hissələrin nəticələri mətnin <?php?> işarələrindən kənarda olan hissələri ilə birləşdirilib. PHP-in əsas gücü məhz buna, kodun mətnin daxilinə asanlıqla daxil edilməsinə əsaslanıb.

Skripti ayıran <?..?><?php...?> teqləri eyni hüquqa malikdir. Ancaq nəzərə almaq lazımdır ki “qısaldılmış” <?..?> teqlərinin işləməsi üçün PHP-in php.ini konfiqurasiya faylında short_open_tag  opsiyası qoşulmuş olmalıdır (susmaya görə qoşulmamış olur).  Qısaldılmış teqlər köhnəlmiş hesab edilir və onlardan istifadə etmək məsləhət görülmür.

HTML forma nədir və nə üçün lazımdır

Beləliklə gördük ki, brauzerlə skript arasında məlumat mübadiləsinin ən məşhur metodları GETPOST-dur. Ancaq bir məsələ var ki, parametrlər sətrini əllə formalaşdırmaq, onları URL-kodlaşdırmaya çevirmək çox cansıxıcıdır.  Gəlin bu məsələdə HTML dilinin işi necə asanlaşdırdığını araşdıraq.

Əvvəlcə GET metoduna baxaq. Sadə istifadəçinin ?, &, % … işarələri və s. ilə parametrləri URL-də əllə yığmaq istədiyini təsəvvür edin. Bu hətta proqramçılar üçün də çox narahat ola bilər. Xoşbəxtlikdən bu məsələnin həlli üçün HTML dilinin bütün brauzerlər tərəfindən başa düşülən rahat imkanları var.

Fərz edək ki, bizim serverdə əsas kataloqda script.php skriptimiz var və qəbul edək ki, bu skript iki parametr – nameborn parametrlərini qəbul edir və brauzerdə  http://site.com/script.php adresinə keçəndə skript aşağıdakı HTML-səhifəni hazırlayıb çap etməlidir:

<!DOCTYPE html>
<html lang="az">
<body>
Salam, name! Mən bilirəm ki, siz born tarixində anadan olmusunuz!
</body>
</html>

Aydındır ki səhifənin generasiyası zamanı name və born skriptə ötürülən uyğun qiymətlərlə əvəz ediməlidir.

Parametrlərin əllə ötürlməsi

Gəlin parametrləri birbaşa URL-də parametrlər sətrində daxil edək. Beləliklə, brauzerdə
http://site.com/script.php?name=Anar&born=09-03-1986
skriptini işə salsaq bizə lazım olan nəticədə səhifəni əldə etmiş olarıq:

<!DOCTYPE html><html lang="az"><body>
Salam, Anar! Mən bilirəm ki, siz 09-03-1986 tarixində anadan olmusunuz!
</body></html>

Diqqət yetirin ki, parametrləri ampersand (&) işarəsi ilə ayırırıq və həmçinin bərabərdir işarəsi (=) istifadə edirik. Bunun niyə belə olduğu aşağıda izah ediləcək.

Formadan istifadə edilməsi

İsitfadəçinin adını və anadan olma tarixini rahat daxil etməsi üçün nə etmək olar? Görünür ki, brauzerdə Windows-un dialoq pəncərəsinə bənzər qrafik interfeys hazırlamaq lazımdır. Bunun üçün bizə dialoqun elementləri ilə – məlumatı daxil etmək üçün xanalar və klik etdikdə serverdəki skripti işə salacaq düymə – button – ibarət HTML-səhifə lazımdır. Səhifə adını index.html qoyaq. Səhifənin HTML kodu aşağıdakı kimi olacaq:

<!DOCTYPE html>
<html lang="az">
    <head>
       <title>Forma səhifəsi</title>
       <meta charset="utf-8">
    </head>
    <body>
       <form action="script.php" method="GET">
          Adınızı daxil edin:
          <input type="text" name="name" value="Naməlum"><br>
          Anadan olma tarixini daxil edin:
          <input type="text" name="born" value="Naməlum"><br>
          <input type="submit" name="Göndər">
       </form>
    </body>
</html>

HTML-səhifəni serverə yükləyib brauzerdə açsaq aşağıdakı şəkildəki kimi səhifə açıldığını görərik:

HTML formadan istifadə

Artıq, name xanasına öz adınızı, tarix yerinə anadan olma tarixinizi yazıb Göndər düyməsinə klik etsəniz brauzer <form> teqinin action atributunda qeyd edilmiş URL-dəki skriptə – http://site.com/script.php skriptinə müraciət edəcək.

Forma <input> teqlərinə daxil edilmiş bütün parametrləri ? işarəsindən sonra bir-birindən ampersandla (&) ayıraraq skriptin ötürəcək. Xanaların adları qiymətlərindən bərabər (=) işarəsi ilə ayrılacaq. Artıq mövzunun əvvəlində niyə bu simvollardan istifadə etdiyimizi yəqin ki başa düşürsünüz.

Beləliklə brauzerin skripti işə salmaq üçün formalaşdırdığı URL aşağıdakı kimi olacaq (qəbul edilmişdir ki, formanı 23.05.1986 təvəllüdlü Tural adlı istifadəçi doldurub):
http://site.com/script.php?name=Tural&born=23-05-1989

POST metodu və formalar

İndi elə etmək lazımdır ki, məlumatlar GET-lə yox POST-la göndərilsin. Bunun üçün method=”GET”  yerinə method=”POST” yazmaq lazımdır. Digər heç bir dəyişkliyə ehtiyac yoxdur.

Qeyd etmək lazımdır ki, <form> teqində method atributu qeyd edilməyibsə, susmaya görə GET metodunun nəzərdə tutulduğu qəbul edilir.

Beləliklə artıq, istifadəçini skriptin adı, onun parametrləri və s. kimi informasiyalarla yormağa ehtiyac qalmır. Onun işi yalnız formanın xanaları, radio və ya checkbutton, link-keçidlər və s. ilə olacaq.

Yuxarıda göstərilən misallarda əslində sadəlik baxımından hər şey elə də ürəkaçan görsənmir. Belə ki, skript bir dənədir, ümumi fayllar isə iki ədəddir (forma yerləşmiş fayl və skript faylı). Bu məsələnin praktikada çox yerdə istifadə edilən sadə həll üsulu var. Skript əvvəlcə işə salınanda ona parametrlərin ötürülüb ötürülmədiyini yoxlayır. Əgər parametrlər yoxdursa skript istifadəçiyə forma yerləşdirilmiş HTML-səhifəni, parametrlər göndərilibsə gördüyü işin nəticəsini qaytarır. Bu həm də ona görə rahatdır ki, bu üsulla istifadəçidən məlumatları məsələn, adını mütləq daxil etməsini təkidlə istəmək olar. Yəni əgər istifadəçi məlumatı daxil etməyi unudarsa ona adı daxil etmək üçün olan xanının qarşısında “Zəhmət olmasa, adınızı daxil edin.” yazısı ilə elə həmən forma qaytarılacaq.

Ümumiyyətlə HTML dili ilə, xüsusi ilə də formalarla əlaqəli bütün teq – elemetnlərə nəzər salmağınız, hansının nə xüsusiyyətə malik olduğunu araşdırmağınız düzgün olar. Növbəti mövzuda HTML dilinin dərinliklərinə demək olar ki, çox az yer veriləcək və daha çox PHP skript dilində proqramlaşdırmaya aid mövzulara toxunulacaq.

POST metodu

Post metodunun mənasını tam aydınlaşdırmağa yaxınlaşırıq. Əvvəlki misalımızda GET əvəzində POST yazsaq və sonuncu başlıqdan (nn markerindən) sonra hər hansı məlumatları ötürsək nə baş verər? Bu halda server bu məlumatları olduğu kimi qəbul edib skriptə ötürəcək. Bu halda mütləq Content-length başlığını da məlumatların ölçüsünə uyğun qeyd etmək lazımdır. Məsələn:

POST /script.cgi HTTP/1.1n
Host: example.com
Content-length: 5n
n
Test!

Server başlıqların sonunu bildirən işarədən sonra məlumatların tam göndərilməsini gözləmədən sorğunu emal etməyə başlayacaq. Başqa sözlə nn işarələrinin göndərilməsindən dərhal sonra skript işə düşəcək və 5 baytlıq Test! sözünün gəlib-gəlməməsini gözləmək artıq onun işinə çevriləcək.

Sonuncu qeyd etdiyimizdən belə çıxır ki, serverə POST-la göndərilən məlumatlar (həmçinin bəzi başlıqlar) maraqlı deyil və server onları bütövlükdə skriptə ötürür. Başqa bir sual meydana çıxır. Məlumatların göndərilməsinin bitdiyini skript necə başa düşəcək? Daha doğrusu, skript brauzerdən gələn məlumatları oxumağı nə vaxt dayandıracaq? Bu məsələdə ona CONTENT_LENGTH mühit dəyişəni kömək edir. Qarşıda bu mexanizmi daha dəqiq aydınlaşdıracağıq.

Post metodu nəyə lazımdır? POST metodu əsasən böyük həcmli məlumatların ötürülməsi üçün lazımdır. Məsələn faylların Veb vasitəsilə serverə ötürülməsi, yüklənməsi və ya böyük formaların emalı zamanı mütləq POST metodundan istifadə edilir. Bundan başqa POST metodundan estetik məqsəd üçün də istifadə edirlər. İş orasındadır ki,  GET metodunun tətbiqi zamanı skriptin URL-i müəyyən qədər uzun və oxunaqsız olur. POST sorğuda isə URL dəyişməz olaraq qalır. Əvvəlki mövzularda qeyd edilmişdir ki, həm GET həm də POST metodlarında verilənlər URL formatında kodlanmış ötürülür. Bunun nə olduğunu aydınlaşdıraq.

Maraqlıdır ki, e-maildən başlayaraq Vebə kimi bütün internet servislər nə üçünsə 127-dən çox olan baytları “xoşlamırlar”. Buna görə də 0-32 və 128-256 diapazonuna daxil bütün simvollar mürəkkəb üsulla yenidən kodlaşdırılaraq URL-kodlaşdırma formasına gətirilir. Çox güman ki, bu, qədimi, demək olar ki artıq istifadə edilməyən proqramlarla işləyə bilmək qabiliyyətini saxlamaq üçün atılan xoşagəlməz addımdır. Məsələn Azərbaycan əlifbasının kiçik ə hərfi %C9%99 formasına çevrilir. Bundan əlavə boşluq – probel – işarəsi bu kodlaşdırmada “cəm işarəsi” (+) formasında göstərilir. Nəticədə verilənlərin həcmi bir neçə dəfə şişirdilmiş olur. Bütün bunları nəzərə alaraq demək olar ki, proqramlar hər an məlumatı uyğun olaraq hər iki tərəfə kodlaşdırmağa hazır olmalıdırlar.

Telnet vasitəsilə brauzerin emulyasiya edilməsi

Qeyd etmək lazımdır ki, brauzer sorğu göndərən zaman özünü telnet vasitəsilə başlıqları əllə – mətn rejimidə daxil edən istifadəçi kimi aparır. Yəni, məsələn, brauzerdə http://example.com yığmaq əvəzinə əməliyyat sisteminin əmrlər sətrində (command-line) aşağıdakı əmrləri yazıb uyğun <Enter> düyməsini vurun:

telnet example.com 80<Enter>
GET /index.html HTTP/1.0<Enter>
Host: example.com<Enter>
<Enter>

Sonuncu <Enter> düyməsini vurandan sonra qarşınızda index.html HTML-səhifəsinin kodlarının görsəndiyini görəcəksiniz. Məsləhətdir ki, göstərilən proseduru həqiqətən də yerinə yetirəsiniz. Bu, sizi HTTP protokolu haqqında fikirlər səslənəndə elə də mürəkkəb olmayan anlayış haqqında danışıldığına əmin edəcək. Göründüyü kimi, hər şey əslində təsəvvür edilən qədər mürəkkəb deyil.

İndi serverin necə işlədiyinə baxaq. Hər şey növbəti ardıcıllıqla baş verir: server sorğunun başlıqlarını oxuyur və nn simvolunu gözləyir. Bu simvolu qəbul edən kimi server ona nə göndərildiyini aydınlaşdırmağa və uyğun əməliyyatları yerinə yetirməyə başlayır.

Başlıqların köməyi ilə kodlaşdırmanın, cookies, POST metodunun  yoxlanması və s. kimi mexanizmlər yerinə yetirilir. Əgər server hər hansı başlığı başa düşmürsə onu ya nəzərə almır ya da istifadəçiyə bu barədə məlumat göndərir (bu, administratorun serveri necə konfiqurasiya etməsindən asılıdır).

Gündəlik iş zamanı belə məsələdə demək olar ki, telnet-dən heç vaxt istifadə edilmir, çünki bu üsul telnet vasitəsilə detallı şəkildə çox məlumatın daxil edilməsini tələb edir. Sistem administratoru və Veb-proqramçıların çoxu bundan daha rahat curl funksional utilitindən istifadə edir:

curl: example.com 80

Sorğunun başlıqları – headers və GET metodu

Brauzerdə adres sətrində hər hansı bir somestring sətri yığıb <Enter> vururq. Bu zaman sual yarana bilər ki, bundan sonra gedişat necə davam edir? Brauzer somestring-i serverə göndərir? Cavab: Xeyr. Məsələ bir az qəlizdir. Brauzer ona təqdim edilən sətri analiz edir, onun daxilində serverin host adını və port nömrəsini çıxarır, server:port adresinə uyğun Veb-serverlə əlaqə yaradır və ona aşağıdakına bənzər məlumat ötürür:

GET somestring HTTP/1.0n 
••• digər məlumatlar •••
nn

Burda n işarəsi sətrin dəyişdirilməsi – yeni sətir işarəsi, nn isə mütləq şəkildə iki yeni sətir simvoludur və sorğunun sonunu bildirir (daha dəqiq desək, sorğunun başlığının bitməsini). Bu işarəni göndərənə qədər server bizim müraciəti emal etməyə başlamayacaq.

Göründüyü kimi GET sətrindən sonra yeni sətir işarəsi ilə bir birindən ayrılmış başqa informativ sətirlər də gələ bilər. Adətən, bu sətirləri brauzer özü formalaşdırır. Bu sətirlər sorğunun başlıqları və ya headers adlanır və onların sayı məhtud deyil. HTTP protokolu məhz bu başlıqların formalaşdırılması və interpretasiyası qaydalırını müəyyən edir.

Beləliklə HTTP protokolu ilə yaxından tanış olmağa başlayırıq. Göründüyü kimi, o, özlüyündə server və brauzerin öz aralarında mübadilə etdikləri başlıqların toplusundan və irəlidə göstəriləcək POST-a aid bir iki razılaşmadan başqa bir şey deyil.

Serverə göndərilən başlıqların hamısı server tərəfindən emal edilmir, bəziləri mühitin dəyişənləri formasında işə salınan skriptə ötürülür. Mühitin dəyişənləri dedikdə əməliyyat sistemi (daha dəqiq proqramı işə salan proses) tərəfindən parametrlərin işə salınan proqrama xüsusi – adlandırılmış formada ötürülməsi nəzərdə tutulur. Proqram mühitin istənilən müəyyən edilmiş dəyişəninin qiymətini onun adını göstərmklə xüsusi funksiyalar vasitəsilə əldə edə bilir. Hər bir CGI-skript də bu və ya digər başlıqların qiymətini əldə etmək üçün məsələyə məhz bu cür yanaşmalıdır. Təəssüf ki, mühitin skriptə ötürülən dəyişənləri müəyyən standartlarla məhtudlaşdırılıb və bəzi dəyişənləri skript vasitəsilə heç cürə əldə etmək mümkün deyil. Belə hallarda məsələyə xüsusi yanaşmalar mövcuddur.

Əslində, daha dəqiq olsaq, server administratoru serveri elə konfiqurasiya edə bilər ki, skriptə həm də standartla icazə verilməyən dəyişənlər də ötürülə bilsin.

GET

Format: GET skriptadı?parametrlər HTTP/1.0
Mühit dəyişəni: REQUEST_URI; QUERY_STRING dəyişənində parametrlər sətri, REQUEST_METHOD dəyişənində GET açar sözü saxlanılır.

Bu başlıq serverdə sorğu edilən sənədin adresini müəyyən edir və POST metodu tətbiq edilmirsə mütləq göstərilməlidir. Bu zaman həm də skriptə ötürülən parametrlər müəyyən edilir. Əgər skriptə heç nə ötürülmürsə və ya sorğu edilən adi statik səhifədirsə sual işarəsindən sonrakı hissə və həmçinin sual işarəsi özü də göstərilmir. HTTP/1.0 yazısı əvəzinə başqa yazı da ola bilər, məsələn, HTTP/1.1. Bu halda istifadəçidən serverə ötürülən verilənlərin və digər başlıqların emalı zamanı məhz buna uyğun razılaşma nəzrə alınacaq.

POST

Format: Content-Type: application/x-www-form-urlencoded
Mühit dəyişəni: CONTENT_TYPE

Bu başlıq ötürülən məlumatın tipini müəyyən edir. Adətən bu dəyişənin dəyəri application/x-www-form-urlencoded kimi olur və bu, hərf-rəqəm və digər görsənən simvollarından başqa simvolların xüsusi üsulla kodlaşdırılacağı formatı müəyyən edir. Məlumat mübadiləsinin məhz bu cür formatı GETPOST metodlarında istifadə edilir. Bundan başqa digər, məşhur format – multipart/form-data – da mövcuddur. Bu format faylların serverə yüklənməsi zamanı istifadə edilir.

Qeyd etmək lazımdır ki, bu başlıq server tərəfindən istifadə edilmir və birbaşa işə salınan skriptə mühit dəyişəni kimi ötürülür.

HOST

Format: Host: host_adı
Mühit dəyişəni: HTTP_HOST

HTTP 1.1 protokoluna uyğun olaraq İnternetdə hər bir serverdə eyni vaxtda bir neçə host yerləşə bilər. Buna görə də brauzerin serverə hansı hosta müraciət etməyə hazırlaşdığını bildirmək üçün bir üsul olmalıdır. Host başlığı da məhz bunun üçün nəzərdə tutulub. Bu başlıqda brauzer istifadəçinin daxil etdiyi host adını göstərir.

User-Agent

Format: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0
Mühit dəyişəni: HTTP_USER_AGENT

Bu başlıq vasitəsilə istifadəçi serverə özü haqqında məlumat ötürür. Bu məlumat heç də həmişə düzgün və dəqiq olmur. Yuxarıda göstərilən misaldan brauzerin versiyası (Firefox), əməliyyat sistemi (64 bitli Windows 8.0) haqqında məlumat əldə etmək olar.

REFERER

Format: Referer: URL_adres
Mühit dəyişəni: HTTP_REFERER

Bir qayda olaraq bu başlıq brauzer tərəfindən formalaşdırılır və onun dəyəri istifadəçinin link vasitəsilə bu səhifəyə hansı səhifədən keçdiyi URL olur. Buna görə də, əgər təhlükəsizlik nöqteyi nəzərindən bu başlığın qiymətini izləyən skript yazırsınızsa nəzər almaq lazımdır ki, bu başlıq brandmauer tərəfindən kəsilə və ya məqsədyönlü olaraq dəyişdirilə bilər.

Diqqət yetirmək lazımdır ki referer sözü İngilis dilindəki referrer sözündəki kimi iki rr hərfləri ilə yazılmır. Görünür HTTP standartını müəyyən edən mütəxəssislər budan xəbərsiz olublar. Buna görə də HTTP_REFERER-dən istifadə edərkən bu səhfin görülən işdə çaşdırıcı ola biləcəyini nəzərə almaq lazımdır.

Content-length

Format: Content-length: rəqəm
Mühit dəyişəni: CONTENT_LENGTH

Bu başlıq POST metodu vasitəsilə ötürülən məlumatın onluq say sistemində uzunluğunu göstərir. GET metodundan istifadə edilərsə bu başlıq ümumiyyətlə olmur və uyğun olaraq mühit dəyişəni kimi də təyin edilmir.

Cookie

Format: Cookie: cookies_məlumatları
Mühit dəyişəni: HTTP_COOKIE

Burda URL-kodlaşdırmasında kodlaşdırılmış bütün cookies saxlanılır.

Accept

Format: Accept: text/html, text/plain, image/gif, image/jpeg
Mühit dəyişəni: HTTP_ACCEPT

Bu başlıqda brauzer hansı növ sənədləri “başa düşdüyünü” sadalayır. Son zamanlar brauzerlər bu başlığı ciddi hesab etmir və sadəcə istənilən tipi göstərən “*/*” qiymətini göndərirlər.

Yuxarıda göstərilənlərdən başqa sorğuların bir çox başlıqları da mövcuddur, ancaq onlardan proqramlaşdırma zamanı çox istifadə edilmədiyindən onlar haqqında burda məlumat verilməyib.

CGI interfeysi və HTTP protokolu

CGI (Common Gateway Interface) dedikdə Veb-serverlərin Veb-proqramların işləməsi zamanı riayət edilməli olduğu razılaşmalar toplusu nəzərdə tutulur. Hal-hazırda praktiki olaraq CGI ilə birlikdə onun daha sürətli və təhlükəsiz variantı olan FastCGI-dan istifadə edilir. Aşağıda deyiləcək mülahizələr bunların hər iki üçün doğrudur.

CGI nədir

Brauzerin adres yerində http://site.com/path/to/image.jpg kimi URL yazırıq və hər hansı HTML səhifənin və ya başqa formada məsələn, şəkil açılacağını gözləyirik. Başqa sözlə desək biz düşünürük ki, hostda /path/to/ kataloqunda image.jpg faylı yerləşdirilib və brauzerə ötürüləcək.

Əslində isə məsələ bir az fərqlidir. Burda iki hal ola bilər:

  • Server administratorunun serverdə istənilən obyektə alias yaratmaq imkanı olduğundan hostda /path/to/ yolu, eyni ilə də image.jpg faylı ümumiyyətlə mövcud olmaya bilər və ya heç bir alias yaratmadan Veb-serverdə proqram yazaraq hər belə müraciəti “tutaraq” lazımi reaksiyanı vermək olar.
  • image.jpg ümumiyyətlə qrafik fayl olmaya bilər. Bunun əvəzinə o,  bizim sorğumuz nəticəsində sürətlə işə düşüb lazımi komandaları yerinə yetirərək nəticəsini HTML və ya digər məsələn, şəkil formatında istifadəçiyə qaytaran proqram ola bilər. İstifadəçi ümumiyyətlə nəyin baş verdiyini başa düşməyəcək. Onun üçün şəkli yükləməklə hər hansı proqramı işə salmaq arasında heç bir fərq olmayacaq. Hətta demək olar ki, istifadəçi əslində nə baş verdiyini heç cürə bilə bilməz.

Sonuncu bənd daha möhtəşəm səslənir. Əgər bunun ideyasını başa düşə bildinizsə deməli, artıq ümumi olaraq CGI-ın nə olduğunu başa düşmüsünüz. Ənənəvi olaraq, CGI razılaşması ilə işləyən proqramlar skript (Ingilis dilində script) adlandırılır. Daha doğrusu bir çox halda bu proqramları Basic, Pyton və ya PHP kimi interpretator dillərində yazıldığı üçün belə adlandırırlar.

Deyilənləri ümumiləşdirsək görürük ki, xüsusi halda səhifələri “iş vaxtı” formalaşdıra bilən güclü mexanizm əldə etmiş olduq. Məsələn, deyək ki, bizə hər hansı bir sənəddə hal-hazırki tarixin yazılması lazımdır. Aydındır ki, istifadəçinin sənədi yükləyəcəyi tarix müxtəlif ola biləcəyindən bunu əvvəlcədən sənəddə yazmaq mümkün deyil. Ancaq, biz tarixi hesablayıb sənəddə yaza bilən və nəticəni istifadəçiyə ötürə bilən skript yaza bilərik. İstifadəçi öz növbəsində heç nə hiss etməyəcək.

Yuxarıda göstərilən modeldə çatışmayan bir məsələ var. Doğrudan da, fərz edək ki, bizə səhifəmizdə saat qurşağından asılı olaraq saat göstərilməsi lazımdır. Skript istifadəçinin hansı saat qurşağında olduğunu və ya istifadəçidən alınması lazım olan hər hansı məlumatı neçə əldə edəcək? Deməli, istifadəçiyə məlumatları əldə etməyə imkan verməklə yanaşı onları həmçinin serverə ötürə bilən mexanizm də olmalıdır (bizim halda Bakıya nəzərən zaman fərqini). Bu məsələni də CGI həll edə bilir.

Yadınızdadırsa əvvəlki mövzularda URL-in quruluşu haqqında danışmışdıq. Bütün bu danışılanlar onun xüsusi formasına aid idi. Əslində URL daha üzün formaya malikdir.
http://site.com/path/to/image.jpg?parameters

Göründüyü kimi, URL-in sonunda sual – ? – işarəsindən sonra əlavə parameters yazısı, sətri də mövcud ola bilər. Müəyyən dərəcədə bu, əməliyyat sistemində kommand layn – əmr sətrinə bənzəyir. Onun uzunluğu istənilən qədər ola bilər və daxilində istənilən məlumat yerləşdirilə bilər (bəzi simvolların URL formatında kodlaşdırılmasını nəzər almaq şərti ilə). Məhs bu sətir CGI-skriptə ötürülür.

Əslində parametrlər sətrinin uzunluğuna müəyyən məhtudiyyət var, ancaq bu məhtudiyyətlə praktikada çox az hallarla qarşılaşdığından onun haqqında nadir hallarda danışılır. Brauzer üçün URL çox uzun olarsa bunu çox sadə hiss etmək olur, həmin link-keçid qeyri-aktiv olur və ona “klik” etmək olmur.

Yuxarıdakı məsələyə qayıdaq. İndi istifadəçi öz saat qurşağını göstərə bilər. Bunu belə etmək olar:
http://site.com/script.cgi?time=+5&name=Tural

Belə təsfir zamanı parametrləri ampersand – “&” – işarəsi vasitəsilə ayırmaq qəbul edilmişdir. Brauzerlər formaların emalı zamanı məhz buna uyğun işlədiklərinə görə biz də irəlidə bu cür razılaşmaya uyğunlaşacağıq. Skript də öz növbəsində bu parametrlərə adekvat reaksiya verməlidir: sətri tərkibinə görə hissələrinə ayırmalı, dəyişənləri yaratmalı və s.

Skriptə göndərilən məlumatlar URL-in əmr sətrinə yerləşə bilirsə və bu üsulla göndərilirsə buna GET metod deyilir. Faktiki olaraq, hətta heç bir parametr ötürülmürsə belə (məsələn, səhifənin açılması zamanı) GET metodu tətbiq edilmiş olur. Bu metoddan başqa onun qədər çox istifadə edilən POST metodu da mövcuddur.

Virtual host

Virtual host şəbəkədə unikal IP ünvanına malik olmayan, ona xüsusi adres məsələn, DNS adı vasitəsilə qoşulması mümkün olan hostdur.

HTTP protokol geniş yayıldığına görə hal-hazırda virtual hostların sayı dayanmadan artmaqdadır. Veb-brauzer nöqteyi nəzərindən, daha doğrusu bu brauzerlərlə işləyən istifadəçilərin nöqteyi nəzərindən virtual host adi host kimidir, ancaq onlara birbaşa IP adres vasitəsilə müraciət etmək mümkün deyil.

Virtual host anlayışı təkcə Veb servis anlayışı ilə məhtudlaşmır. Bir çox digər servislərin daxilində də özünə uyğun Veb və HTTP protokolla əlaqəsi olmayan virtual host anlayışı var. SMTP (Send Mail Transfer Protocol – məktubların ötürülməsi protokolu) servisinin serveri olan sendmail daxilində də həmçinin virtual host anlayışından istifadə edilir. Bu halda “virtual host” anlayışı server işə salınmış əsas hostun sinonimidir. Məsələn, əgər syn.com microsoft.com-un sinonimidirsə [email protected] əslində elə [email protected] ilə eyni mənaya gəlir. Bu halda da qeyd etmək lazımdır ki, virtual host ayrıca IP adresə malik olmur.

Şəbəkə demonu, servis

Şəbəkə demonu (və ya servis, xidmət) serverdə işləyən, ona qoşulub müxtəlif sorğular edən istifadəçilərin müraciətlərini emal edən proqramdır.

“Şəbəkə demonu” termin kimi UNIX sistemi terminalogiyasına uyğun demon anlayışı əsasənda formalaşmış anlayışdır. Bu sistemdə demon dedikdə qurğunun daxilində fon rejimində daim işləyən proqram nəzərdə tutulur. Demonun terminalla (ekran və klaviatura) heç bir əlaqəsi yoxdur. Buna görə də demon istifadəçidən birbaşa məlumatlar əldə etmək və ya onu ekranda göstərmək imkanına malik deyil. Məhz bu imkanlarının olmamasına görə ona demon – İngilis dilində “daemon” – deyilir. İşləmə üsuluna görə demona Azərbaycan dilində “Gözlədici proqram” da deyilir.

Şəbəkə demonu isə məhz istifadəçinin müraciəti zamanı onun sorğusunu emal edən proqramdır. Şəbəkə demonuna tipik misal olaraq Veb-serveri göstərmək olar. FTP və telnet də bunlara aiddir.