PHP proqramlarının sürətləndirilməsi. Apache-ni necə sürətləndirmək olar: statik fayllara xidmət göstərmək və PHP-ni icra etmək? FastCGI niyə PHP-ni sürətləndirmir?




İstənilən internet resursunun uğurunun əsas meyarlarından biri onun işləmə sürətidir və ildən-ilə istifadəçilər bu kriteriyaya daha çox tələbkar olurlar. PHP skriptlərinin işinin optimallaşdırılması sistemin sürətini təmin edən üsullardan biridir.

Bu yazıda mən skriptlərin optimallaşdırılması ilə bağlı məsləhətlər və faktlar toplusunu ictimaiyyətə təqdim etmək istərdim. Kolleksiyanı tərtib etmək mənə xeyli vaxt apardı və bir neçə mənbəyə və şəxsi təcrübələrə əsaslanır.

Niyə sərt qaydalar deyil, məsləhətlər və faktlar toplusu? Çünki, gördüyüm kimi, “tamamilə düzgün optimallaşdırma” yoxdur. Bir çox texnika və qaydalar ziddiyyətlidir və hamısına riayət etmək mümkün deyil. Təhlükəsizliyə və rahatlığa xələl gətirmədən istifadə etmək üçün məqbul olan üsullar toplusunu seçməlisiniz. Mən tövsiyə mövqeyi tutmuşam və buna görə də sizin əməl edə biləcəyiniz və ya etmədiyiniz məsləhətlərim və faktlarım var.

Qarışıqlığın qarşısını almaq üçün bütün məsləhətləri və faktları 3 qrupa ayırdım:

  • Tətbiq məntiqi və təşkili səviyyəsində optimallaşdırma
  • Kodun optimallaşdırılması
  • Yararsız optimallaşdırma

Qruplar şərti olaraq təyin olunur və bəzi maddələr eyni anda bir neçəsinə aid edilə bilər. Rəqəmlər orta server (LAMP) üçündür. Məqalədə müxtəlif üçüncü tərəf texnologiyaları və çərçivələrinin effektivliyi ilə bağlı məsələlər müzakirə edilmir, çünki bu, ayrıca müzakirələr üçün mövzudur.

Tətbiq məntiqi və təşkili səviyyəsində optimallaşdırma

Bu optimallaşdırma qrupu ilə əlaqəli bir çox məsləhət və faktlar çox əhəmiyyətlidir və çox böyük vaxt qazancı təmin edir.

  • Kod darboğazlarını müəyyən etmək üçün daima serverdə (xdebug) və müştəridə (firebug) kodunuzu profilləşdirin
    Qeyd etmək lazımdır ki, həm server, həm də müştəri hissələri profilləşdirilməlidir, çünki bütün server xətaları serverin özündə aşkarlana bilməz.
  • Proqramda istifadə olunan istifadəçi funksiyalarının sayı heç bir şəkildə sürətə təsir etmir
    Bu, proqrama saysız-hesabsız xüsusi funksiyalardan istifadə etməyə imkan verir.
  • Fərdi funksiyalardan aktiv istifadə edin
    Müsbət təsir daxili funksiyalar əməliyyatlarının yalnız yerli dəyişənlərlə həyata keçirilməsi səbəbindən əldə edilir. Bunun təsiri xüsusi funksiya çağırışlarının qiymətindən daha böyükdür.
  • Üçüncü tərəf proqramlaşdırma dilində "kritik dərəcədə ağır" funksiyaları PHP uzantısı şəklində həyata keçirmək məsləhətdir.
    Bunun üçün üçüncü tərəf dilində proqramlaşdırma bacarıqları tələb olunur ki, bu da inkişaf vaxtını əhəmiyyətli dərəcədə artırır, lakin eyni zamanda PHP-nin imkanlarından kənar texnikalardan istifadə etməyə imkan verir.
  • Statik html faylının işlənməsi şərh edilmiş php faylından daha sürətlidir
    Müştəridə vaxt fərqi təxminən 1 saniyə ola bilər, ona görə də statik səhifələri PHP alətləri ilə yaradılan səhifələrdən aydın şəkildə ayırmağın mənası var.
  • İşlənmiş (qoşulmuş) faylın ölçüsü sürətə təsir göstərir
    Hər 2 KB emal üçün təxminən 0,001 saniyə sərf olunur. Bu fakt bizi istehsal serverinə köçürərkən skript kodunu minimuma endirməyə məcbur edir.
  • Həmişə bir dəfə tələb etmək və ya bir dəfə daxil etməkdən istifadə etməməyə çalışın
    Bu funksiyalar faylı yenidən oxumaq mümkün olduqda istifadə edilməlidir, digər hallarda tələb və daxil etməkdən istifadə etmək məsləhətdir.
  • Alqoritmi şaxələndirərkən, emal oluna bilməyən konstruksiyalar varsa və onların həcmi təxminən 4 KB və ya daha çox olarsa, o zaman daxildən istifadə etməklə onları daxil etmək daha optimaldır.
  • Müştəri haqqında göndərilən məlumatların yoxlanılmasından istifadə etmək məsləhətdir
    Bu onunla bağlıdır ki, müştəri tərəfində məlumat yoxlanılarkən yanlış məlumatlar olan sorğuların sayı kəskin şəkildə azalır. Müştəri tərəfi məlumatların yoxlanılması sistemləri əsasən JS və sərt forma elementlərindən istifadə etməklə qurulur (seçin).
  • Müştəridə verilənlər massivləri üçün böyük DOM strukturlarının qurulması məqsədəuyğundur
    Göstərilən böyük həcmli məlumatlarla işləyərkən bu, çox effektiv optimallaşdırma üsuludur. Onun mahiyyəti aşağıdakılardan qaynaqlanır: serverdə verilənlər massivi hazırlanır və müştəriyə ötürülür və JS funksiyalarına DOM strukturlarının qurulması təmin edilir. Nəticədə yük serverdən müştəriyə qismən yenidən paylanır.
  • AJAX texnologiyası üzərində qurulan sistemlər bu texnologiyadan istifadə etməyən sistemlərdən əhəmiyyətli dərəcədə sürətlidir
    Bu, çıxış həcmlərinin azalması və müştəriyə yükün yenidən bölüşdürülməsi ilə əlaqədardır. Praktikada AJAX-lı sistemlərin sürəti 2-3 dəfə yüksəkdir. Şərh: AJAX, öz növbəsində, digər optimallaşdırma metodlarının istifadəsinə, məsələn, buferlə işləməyə bir sıra məhdudiyyətlər yaradır.
  • Göndərmə sorğusu alarkən həmişə bir şey, bəlkə də boşluq qaytarın
    Əks halda, müştəriyə bir neçə kilobayt ağırlığında səhv səhifəsi göndəriləcək. Bu səhv AJAX texnologiyasından istifadə edən sistemlərdə çox yaygındır.
  • Fayldan məlumatların alınması verilənlər bazasından daha sürətlidir
    Bu, əsasən verilənlər bazasına qoşulma xərcləri ilə bağlıdır. Təəccüblüdür ki, proqramçıların böyük bir faizi bütün məlumatları verilənlər bazasında manyakca saxlayır, hətta faylları istifadə edərkən daha sürətli və daha rahatdır. Şərh: Məlumatları axtarılmayan fayllarda saxlaya bilərsiniz, əks halda verilənlər bazasından istifadə etməlisiniz.
  • Lazım olmadıqca verilənlər bazasına qoşulmayın
    Mənə məlum olmayan səbəbə görə, bir çox proqramçılar verilənlər bazasına sonradan sorğular etməsələr də, parametrləri oxumaq mərhələsində qoşulurlar. Bu, orta hesabla 0,002 saniyəyə başa gələn pis vərdişdir.
  • Az sayda eyni vaxtda aktiv müştərilər olduqda verilənlər bazasına davamlı bağlantıdan istifadə edin
    Vaxt faydası verilənlər bazasına qoşulma xərclərinin olmaması ilə bağlıdır. Vaxt fərqi təxminən 0,002 saniyədir. Şərh:Çox sayda istifadəçi varsa, davamlı bağlantılardan istifadə etmək məqsədəuyğun deyil. Davamlı əlaqələrlə işləyərkən əlaqəni dayandırmaq üçün mexanizm olmalıdır.
  • Mürəkkəb verilənlər bazası sorğularından istifadə bir neçə sadə sorğudan daha sürətlidir
    Vaxt fərqi bir çox amillərdən (məlumatların həcmi, verilənlər bazası parametrləri və s.) asılıdır və saniyənin mində, bəzən isə yüzdə biri ilə ölçülür.
  • DBMS tərəfində hesablamalardan istifadə verilənlər bazasında saxlanılan məlumatlar üçün PHP tərəfindəki hesablamalardan daha sürətlidir.
    Bu onunla bağlıdır ki, PHP tərəfində belə hesablamalar verilənlər bazasına iki sorğu tələb edir (məlumatların qəbulu və dəyişdirilməsi). Vaxt fərqi bir çox amillərdən (məlumat həcmi, verilənlər bazası parametrləri və s.) asılıdır və saniyənin mində və yüzdə biri ilə ölçülür.
  • Əgər verilənlər bazasındakı nümunə məlumatları nadir hallarda dəyişirsə və bir çox istifadəçi bu məlumatlara daxil olursa, o zaman nümunə məlumatı faylda saxlamağın mənası var.
    Məsələn, aşağıdakı sadə yanaşmadan istifadə edə bilərsiniz: verilənlər bazasından nümunə məlumatları alırıq və onu seriallaşdırılmış massiv kimi faylda saxlayırıq, sonra istənilən istifadəçi fayldakı məlumatlardan istifadə edir. Praktikada bu optimallaşdırma metodu skriptin icra sürətində dəfələrlə artımı təmin edə bilər. Şərh: Bu üsuldan istifadə edərkən, faylda saxlanılan məlumatları yaratmaq və dəyişdirmək üçün alətlər yazmalısınız.
  • Memcached ilə nadir hallarda dəyişən keş məlumatları
    Zaman qazancı olduqca əhəmiyyətli ola bilər. Şərh: Keşləmə statik məlumatlar üçün effektivdir; dinamik məlumatlar üçün təsir azalır və mənfi ola bilər.
  • Obyektlərsiz işləmək (OOP olmadan) obyektlərlə işləməkdən təxminən üç dəfə sürətlidir
    Daha çox yaddaş da istehlak olunur. Təəssüf ki, PHP tərcüməçisi OOP ilə adi funksiyalar kimi tez işləyə bilməz.
  • Massiv ölçüsü nə qədər böyükdürsə, bir o qədər yavaş işləyirlər
    Zaman itkisi yuvalanmış strukturlarla işləmək səbəbindən baş verir.

Kodun optimallaşdırılması

Bu ipuçları və faktlar əvvəlki qrupla müqayisədə sürətdə əhəmiyyətsiz artım verir, lakin bu üsulları birlikdə götürdükdə yaxşı vaxt qazandıra bilərsiniz.

  • əks-səda və çap printf-dən əhəmiyyətli dərəcədə sürətlidir
    Vaxt fərqi saniyənin mində bir hissəsinə çata bilər. Bunun səbəbi, formatlanmış məlumatları çıxarmaq üçün printf-dən istifadə edilməsi və tərcüməçinin belə məlumat üçün bütün sətri yoxlayır. printf yalnız formatlaşdırmaya ehtiyacı olan məlumatları çıxarmaq üçün istifadə olunur.
  • echo $var."text" echo "$var text"dən daha sürətlidir
    Bunun səbəbi, ikinci halda olan PHP mühərrikinin sətir daxilində dəyişənləri axtarmağa məcbur olmasıdır. Böyük miqdarda məlumat və PHP-nin köhnə versiyaları üçün vaxt fərqləri nəzərə çarpır.
  • echo "a" dəyişənləri olmayan sətirlər üçün echo "a" dan daha sürətlidir
    Bunun səbəbi ikinci halda PHP mühərrikinin dəyişənləri tapmağa çalışmasıdır. Böyük həcmli verilənlər üçün zaman fərqləri olduqca nəzərə çarpır.
  • echo "a","b" əks-səda "a"-dan daha sürətlidir."b"
    Vergüllə ayrılmış məlumatların çıxarılması nöqtə ilə müqayisədə daha sürətlidir. Bunun səbəbi ikinci halda sətir birləşməsinin baş verməsidir. Böyük həcmli verilənlər üçün zaman fərqləri olduqca nəzərə çarpır. Qeyd: bu yalnız echo funksiyası ilə işləyir, hansı ki, arqument kimi bir neçə sətir götürə bilər.
  • $return="a"; $return.="b"; echo $return; echo "a" dan daha sürətli; əks-səda "b";
    Səbəb odur ki, məlumatların çıxarılması bəzi əlavə əməliyyatlar tələb edir. Böyük həcmli verilənlər üçün zaman fərqləri olduqca nəzərə çarpır.
  • ob_start(); əks-səda "a"; əks-səda "b"; ob_end_flush(); $return="a"-dan daha sürətli; $return.="b"; echo $return;
    Bunun səbəbi bütün işlərin dəyişənlərə giriş olmadan həyata keçirilməsidir. Böyük həcmli verilənlər üçün zaman fərqləri olduqca nəzərə çarpır. Şərh:Əgər siz AJAX ilə işləyirsinizsə, bu texnika səmərəsizdir, çünki bu halda verilənləri tək sətir kimi qaytarmaq məqsədəuyğundur.
  • "Peşəkar əlavə" və ya?> a b
    Statik verilənlər (xarici kod) PHP çıxışından daha sürətli işlənir. Bu texnika professional insertion adlanır. Böyük həcmli verilənlər üçün zaman fərqləri olduqca nəzərə çarpır.
  • readfile file_get_contents-dən daha sürətlidir, file_get_contents tələb olunandan daha sürətlidir və tələb tək fayldan statik məzmun çıxarmaq üçün daxil etməkdən daha sürətlidir.
    Boş faylı oxumaq üçün tələb olunan vaxt oxumaq üçün 0,001-dən daxil etmək üçün 0,002-yə qədər dəyişir.
  • tələb şərh edilən fayllar üçün daxil etməkdən daha sürətlidir
    Şərh: alqoritmi şaxələndirərkən, şərh edilmiş fayldan istifadə etməmək mümkün olduqda, siz include istifadə etməlisiniz, çünki tələb həmişə faylı ehtiva edir.
  • əgər (...) (...) əgər (...) () keçiddən daha sürətlidirsə
    Vaxt filialların sayından asılıdır.
  • if (...) (...) if (...) () if (...) (...) ilə müqayisədə daha sürətlidirsə; əgər (...) ();
    Vaxt filialların sayından və şərtlərdən asılıdır. Mümkünsə else istifadə etməlisiniz, çünki bu, ən sürətli "şərti" konstruksiyadır.
  • if (...) (...) if (...) () if (...) () konstruksiyasının ən ümumi şərtləri filialın başında yerləşdirilməlidir.
    Tərcüməçi konstruksiyanı şərti təmin edənə qədər yuxarıdan aşağıya skan edir. Tərcüməçi şərtin təmin olunduğunu görsə, o zaman tikintinin qalan hissəsinə baxmır.
  • < x; ++$i) {...} быстрее, чем for($i = 0; $i < sizeOf($array); ++$i) {...}
    Çünki ikinci halda sizeOf əməliyyatı hər iterasiyada yerinə yetiriləcək. İcra vaxtı fərqi massiv elementlərinin sayından asılıdır.
  • x = sizeOf($massiv); üçün($i = 0; $i< x; ++$i) {...} быстрее, чем foreach($arr as $value) {...} для не ассоциативных массивов
    Vaxt fərqi əhəmiyyətlidir və massiv artdıqca artır.
  • preg_replace ereg_replace-dən daha sürətlidir, str_replace preg_replace-dən daha sürətlidir, lakin strtr str_replace-dən daha sürətlidir
    Vaxt fərqi məlumatların miqdarından asılıdır və saniyənin bir neçə mində bir hissəsinə çata bilər.
  • Simli funksiyalar normal ifadələrdən daha sürətlidir
    Bu qayda əvvəlkinin nəticəsidir.
  • Yaddaşı boşaltmaq üçün artıq lazım olmayan massiv dəyişənlərini silin.
  • Səhvlərin qarşısının alınması @ istifadə etməyin
    Səhvlərin qarşısının alınması bir sıra çox yavaş əməliyyatlar yaradır və təkrar cəhd dərəcəsi çox yüksək ola biləcəyi üçün sürət itkisi əhəmiyyətli ola bilər.
  • if (isset($str(5))) (...) if (strlen($str)>4)(...) ilə müqayisədə daha sürətlidir
    Bunun səbəbi, sətirləri idarə etmək üçün strlen funksiyası əvəzinə standart isset test əməliyyatının istifadə edilməsidir.
  • 0,5 1/2-dən daha sürətlidir
    Səbəb odur ki, ikinci halda bölgü əməliyyatı aparılır.
  • bir funksiyadan dəyişənin dəyərini qaytararkən, qaytarma qlobaldan daha sürətli olur
    Çünki ikinci halda qlobal dəyişən yaradılır.
  • $row["id"] $row-dan daha sürətlidir
    Birinci seçim 7 qat daha sürətlidir.
  • $_SERVER['REQUEST_TIME'] skriptin nə vaxt işləməli olduğunu müəyyən etmək üçün time() funksiyasından daha sürətlidir
  • əgər ($var===null) (...) if (is_null($var)) (...) ilə müqayisədə daha sürətlidirsə
    Səbəb birinci halda funksiyadan istifadənin olmamasıdır.
  • ++i i++-dan daha sürətli, --i i-dən daha sürətlidir--
    Buna PHP nüvəsinin xüsusiyyətləri səbəb olur. Vaxt fərqi 0,000001-dən azdır, lakin bu prosedurları minlərlə dəfə təkrarlasanız, bu optimallaşdırmaya daha yaxından baxın.
  • Başlanılan dəyişənin artımı i=0; ++i; başlatılmamış ++i-dən daha sürətli
    Vaxt fərqi təxminən 0,000001 saniyədir, lakin mümkün təkrarlama tezliyinə görə bu faktı xatırlamaq lazımdır.
  • Təqaüdə çıxmış dəyişənlərdən istifadə yenilərini elan etməkdən daha sürətlidir
    Və ya başqa cür ifadə edim: Lazımsız dəyişənlər yaratmayın.
  • Yerli dəyişənlərlə işləmək qlobal dəyişənlərlə müqayisədə təxminən 2 dəfə sürətlidir
    Vaxt fərqi 0,000001 saniyədən az olsa da, təkrarlama tezliyi yüksək olduğundan, yerli dəyişənlərlə işləməyə çalışmaq lazımdır.
  • Bir dəyişənə birbaşa daxil olmaq, bu dəyişənin bir neçə dəfə müəyyən edildiyi funksiyanı çağırmaqdan daha sürətlidir
    Funksiyaya zəng etmək, dəyişəni çağırmaqdan təxminən üç dəfə çox vaxt aparır.

Yararsız optimallaşdırma

Təcrübədə bir sıra optimallaşdırma üsulları skriptin icra sürətinə böyük təsir göstərmir (vaxt artımı 0,000001 saniyədən azdır). Buna baxmayaraq, belə optimallaşdırma tez-tez mübahisə mövzusudur. Bu “faydasız” faktları ona görə təqdim etdim ki, gələcəkdə kod yazarkən onlara xüsusi diqqət yetirməyəsiniz.

  • əks-səda çapdan daha sürətlidir
  • include("mütləq yol") daxildən ("nisbi yol") daha sürətlidir
  • sizeOf saymaqdan daha sürətlidir
  • foreach ($arr as $key => $value) (...) sıfırlamadan ($arr) daha sürətlidir; assosiativ massivlər üçün isə (list($açar, $dəyər) = hər ($arr)) (...)
  • Şərh edilməmiş kod şərh edilmiş koddan daha sürətlidir, çünki faylı oxumaq üçün əlavə vaxt lazımdır
    Optimallaşdırma naminə şərhlərin həcmini azaltmaq çox axmaqlıqdır, sadəcə işləyən (“döyüş”) skriptlərdə minimuma endirmə aparmaq lazımdır.
  • Qısa adları olan dəyişənlər uzun adları olan dəyişənlərdən daha sürətlidir
    Bu, işlənən kodun miqdarının azalması ilə əlaqədardır. Əvvəlki bənddə olduğu kimi, sadəcə işləyən (“döyüş”) skriptlərdə minimuma endirmə aparmaq lazımdır.
  • Nişanlardan istifadə edərək kodu işarələmək boşluqlardan istifadə etməkdən daha sürətlidir
    Əvvəlki nöqtəyə bənzər.

Nəhayət, bir daha xatırlatmaq istərdim ki, verdiyim məsləhətlər və faktlar mütləq deyil və onların tətbiqinin əhəmiyyəti konkret vəziyyətdən asılıdır. Yadda saxlamaq lazımdır ki, skript optimallaşdırması bütün optimallaşdırma prosedurunun yalnız kiçik bir hissəsidir və yuxarıda göstərilən məsləhətlər olmadan çox vaxt sakit yaşamaq mümkündür.


Hər hansı bir sualınız varsa, bizim istifadə etməyi məsləhət görürük

Bu yazıda mən PHP skriptlərinin işlənməsini əhəmiyyətli dərəcədə sürətləndirə və bununla da hosterin serverini faydasız işdən azad edə biləcək bəzi məsləhətlər vermək istəyirəm...

İkiqat dırnaq əvəzinə tək dırnaq işarələrindən istifadə edin

Fakt budur ki, qoşa dırnaq içərisində olan mətn dəyişənlərin, həmçinin mnemonik əvəzetmələrin (məsələn, mətnə ​​yeni sətir simvolu daxil etmək üçün \n) olması üçün prosessor tərəfindən skan edilir.

print("Bu, tamamilə normal mətndir, lakin PHP prosessoru onu çıxarmazdan əvvəl onu dəyişənlər və mnemonik əvəzləmələr üçün skan edir. Əgər belə bir xətt kifayət qədər uzundursa, bu proses xeyli vaxt aparır.");

Mətn tək dırnaqlar içərisindədirsə, onda PHP tərcüməçisi itaətkarlıqla onu orijinal formada göstərir, hətta orada nəsə axtarmaq barədə düşünmədən. Bu, əvvəlki nümunə ilə müqayisədə daha az vaxt tələb edir.

print("PHP prosessoru tək dırnaqlar içərisində olan sətir görəndə çox sevinəcək. Bəs necə xoşbəxt olmaya bilərsən - boş iş görməyə ehtiyac yoxdur!");

Təbii ki, bu tip sətirlər təkcə funksiyalarda deyil, həm də dəyişənlərdə də istifadə oluna bilər.

$string="Bu sətri bir daha təhlil etməmək nə xoşdur!";

Dəyişənləri dırnaq içərisində qoymayın

Çox vaxt buna bənzər bir şəkil görürsən.

print("PHP prosessoru bu səhifəni emal etmək üçün $vaxt saniyə çəkdi.");

Əvvəlki məsləhətlərimi öyrənərək və PHP tərcüməçisi üçün sətirləri bir-birinə “yapışdırmağın” onları dəyişənlər üçün skan etməkdən və onları həmin dəyişənlərə uyğun gələn sətirlərlə əvəz etməkdən daha asan olduğunu bildiyimə görə, mənim əvvəlki nümunəmin belə olduğunu təxmin etmək çətin deyil. server resurslarından səmərəsiz istifadə nümunəsidir. İndi optimallaşdırılmış skriptlə serveri sevindirək.

print("Həyatdan həzz alan PHP prosessoru bu skripti ".$time." saniyə ərzində emal etdi.");

Tankda olanlar üçün: xətlər nöqtə (.) istifadə edərək birləşdirilir, yəni

print("Bu saytın ünvanı http://".$_SERVER["HTTP_HOST"]."/!");

“Bu saytın ünvanı http://argon.com.ru/!” mətnini göstərəcək.

Minimum dəyişənlərdən istifadə edin

Siz həmişə yadda saxlamalısınız ki, istənilən qlobal dəyişən skriptin bütün müddəti ərzində yaddaşda saxlanılır! Serveri ələ salmaq nümunəsi olaraq aşağıdakı kodu verəcəyəm.

Sual olunur ki, biz niyə əlavə yaddaş tutmalıyıq, serverin yükünü boşa çıxaraq?.. Bunu belə etmək daha səmərəlidir.

print("PHP prosessoru belə xətləri çıxarmaqdan həzz alır.");

Beləliklə, əgər sətir iki dəfədən az istifadə olunursa, dəyişənə həmin sətirin dəyərini təyin etmək zərərlidir.

Qısa dəyişən adlarından istifadə edin

Skript əsassız uzun adları olan dəyişənlərdən istifadə edərsə, serverdəki yük təbii olaraq artır.

$windows_xp_edition="Peşəkar";
$windows_xp_build="2600";
$windows_server2003_edition="Standart";
$windows_server2003_build="3200";

Ancaq çox lakonik adlar da verməməlisiniz - gələcəkdə təsirli ölçülü bir skripti redaktə edərkən, onun yaradıcısının anasını mehriban bir sözlə deyil, yüz dəfə xatırlayacaqsınız :)

$ifa="Peşəkar";
$ifb="2600";
$ifc="Standart";
Sifd="3200";

Ən yaxşı seçim səkkiz simvoldan çox olmayan lakonik, lakin başa düşülən adlar verməkdir.

$wxped="Peşəkar";
$wxpbld="2600";
$ws2k3ed="Standart";
Sws2k3bld="3200";

Yuvalanmış funksiyalardan istifadə edin

Bu cür şeyləri çox tez-tez görürsən.

$string=str_replace("\n"," ",$string);
$string=str_replace("\r"," ",$string);
$string=trim($string);
$string=zolaqlar($string);
$string=chop($string);
$string=substr($string,0,1024);
çap ($string);

$string))))))0.1024)))

Razıyam, dəhşətli görünür, amma məhsuldarlıqda nəzərəçarpacaq artım var! Hər dəfə dəyişənə uyğun dəyəri əvəz etməklə, sondan başlasanız, belə bir şey etmək çox asandır...

Daxili funksiyalardan istifadə edin

İcazə verin, bütün xüsusi HTML simvollarını müvafiq mnemonic əvəzetmələrlə əvəz edən skriptin sadə nümunəsini verim.



$string=str_replace("<","<",$string);
$string=str_replace(">"",">",$string);
çap ($string);

Bu kodu istifadə etsəniz, eyni şey əldə edilə bilər.

print(htmlspecialchars($string));

O, daha gözəl görünür, daha az çəkir və serverdəki yükü əhəmiyyətli dərəcədə azaldır, xüsusən də uzun sətirləri emal edərkən.

Daha bir misal. Bu skriptdən istifadə edərək mətn faylının məzmununu massivdə oxuya bilərsiniz.

$fp=fopen("database.txt", "r");
while($array=fgets($fp,1024));
fclose($fp);

Lakin PHP-də olduqca faydalı daxili fayl() funksiyası var ki, o, eyni şeyi edir, lakin daha sürətli!

fayl (“verilənlər bazası.txt”);

Nəticə: PHP funksiyaları haqqında məlumat kitabçasına bir daha nəzər salmaq üçün heç vaxt tənbəl olmayın. Əminəm ki, orada (və serverin) həyatınızı asanlaşdırmaq üçün çoxlu alətlər tapacaqsınız.

Öz funksiyalarınızdan istifadə edin

Çox vaxt eyni alqoritmdən istifadə edərək bir neçə xətti emal etmək lazımdır. Təcrübəsiz proqramçılar belə edir...

print(substr(chop(zolaqlar(trim(str_replace("\r"," ",str_replace("\n"," ", $string1))))),0,1024));
print(substr(chop(zolaqlar(trim(str_replace("\r"," ",str_replace("\n"," ", $string2))))),0,1024));

Təcrübəli olanlar isə daha sadə yolu tutacaqlar.

funksiya formatı(&$string)(

}
çap (format($string1));
çap (format($string2));

Beləliklə, serveri minimum yükləyərək eyni hərəkəti bir neçə dəfə yerinə yetirə bilərsiniz.

Lazımsız funksiyalar yaratmayın

Məsələn, kifayət qədər təcrübəli bir proqramçı ona lazım olan daxili funksiyanın mövcudluğunu unudursa və ya hətta bilmirsə, o, asanlıqla özü bir funksiyanı yaza bilər.

funksiyanı optimallaşdırmaq(&$string)(
$string=str_replace("&","&",$string);
$string=str_replace(""",""",$string);
$string=str_replace("<;","<",$string);
$string=str_replace(">"",">",$string);
}
çap (optimize et($string));

Ancaq daha sadə vasitələrlə əldə edə bilərsiniz.

çap(htmlspecialchars($string);

Lazımsız funksiyalardan istifadə etməyin

Budur səmərəsiz kodun bir nümunəsi.

çap ("Əmim");
print("ən dürüstləri qarət etdi...");

Ancaq çox asanlıqla optimallaşdırıla bilər.

print("Əmim "."ən dürüst qaydalar...");

Fərqi hiss edirsiniz? İnanın ki, bu halda hoster yalnız boşaldılmış server resurslarına görə sizə minnətdar olacaq...

Funksiyalardan ağıllı istifadə edin

Məsələn, bu skript.

print(ereg_replace("normal","bədbəxt",$string));

Normal ifadə emal alqoritmini (POSIX) aktivləşdirir, burada ümumiyyətlə tələb olunmur. Və server daha çox yüklənir. Ancaq acgöz funksiyanı resurslara daha az acgöz funksiya ilə əvəz etməklə onun taleyini asanlaşdıra bilərsiniz.

print(str_replace("bədbəxt","xoşbəxt",$string));

İşləyicini çox çəkməyin

Məlumdur ki, PHP kod teqindən kənarda olan hər şey PHP prosessoru tərəfindən işlənmir, sadəcə olaraq dəyişməz olaraq ötürülür. Bəzi insanlar bundan belə istifadə edirlər.

...səhifə başlığı...
çap ($title);
?>
…naviqasiya…

?>
...səhifənin altbilgisi...

Lakin PHP emal rejiminə daxil olmaq və çıxmaq serveri bundan istifadə edildiyindən daha çox yükləyir.

print("...səhifə başlığı...".$title."...naviqasiya...");
daxildir ("dinamik məzmun");
print("...səhifənin altbilgisi...");
?>

Ardı var

İndiyə qədər mən PHP optimallaşdırma aysberqinin yalnız kiçik bir hissəsini əhatə etmişəm. Mümkündür ki, bir məsləhətə əməl etmək məhsuldarlığın nəzərəçarpacaq dərəcədə artmasına səbəb olmayacaq, lakin proqramçı nəzakətinin bütün bu əsas qaydalarına birlikdə riayət etmək serverdəki yükü əhəmiyyətli dərəcədə azaldacaq və nüfuzunuzu artıracaqdır.

Hər hansı bir sualınız və ya təklifiniz varsa, əlaqə saxlayın.

Optimallaşdırmanızda uğurlar!

İndi, xüsusi İnternet kanalı normaya çevrildiyi zaman, səhifənin ölçüsü ilə bağlı çox narahat olmaq lazım deyil. Ancaq yenə də diqqət yetirməyə dəyər. Serverdəki yükü azaltmaq və HTTP sorğularının sayını azaltmaq istəyirsinizsə, bunun üçün bir neçə üsul var. Bu dərslik bir neçə PHP hiyləsini əhatə edəcək (keşləmə, sıxılma).

1. PHP istifadə edərək CSS fayllarının birləşdirilməsi.

Veb tərtibatçıları olaraq, daha məntiqli struktur və sonradan daha asan modifikasiya üçün üslubları çox vaxt bir neçə üslub vərəqləri arasında bölürük. Bununla belə, bu, serverə edilən sorğuların sayını artırır ki, bu da səhifənin daha yavaş yüklənməsi ilə nəticələnir. PHP-dən istifadə etməklə biz bir daşla iki quşu öldürə bilərik: birdən çox stil cədvəlinə sahib olun və hamısına daxil olmaq üçün yalnız bir sorğudan istifadə edin.

Hazırlıq

CSS fayllarını optimallaşdırmadan əvvəl işləmək üçün üslublara ehtiyacımız var. Bəzi stil faylları yaradaq:

// main.css
// Məsələn, CSS

bədən (
eni: 800px;
kənar: 0 avtomatik;
rəng: boz;
}

#sarğı (
yuxarı kənar: 30px;
fon: url(../images/cats.png);
}
// mətbəə.css
// Məsələn, CSS

bədən (
şrift ailəsi: Arial, san-serif;
şrift çəkisi: qalın;
}

güclü (
şrift ölçüsü: 120%;
}
//forms.css
// Məsələn, CSS

forma(
mövqe: nisbi;
yuxarı: 400px;
z indeksi: 99;
}

giriş(
hündürlük: 50px;
eni: 400px;
}

Bütün faylların məzmununu çıxarmaq və onları müəyyən bir ardıcıllıqla birləşdirməliyik. Bu o deməkdir ki, skriptimiz URL parametrləri vasitəsilə üslub cədvəllərinin adlarını almalı, bu faylları açmalı və onları birləşdirməlidir.

//Dəyişənlərin müəyyən edilməsi
$cssPath = "./css/";
if (isset($_GET["q"])) (
$files = $_GET["q"];
// Bir sıra faylları əldə edin


foreach ($ açarı olaraq $ fayllar => $ fayl) (
}

$cssData = "";
foreach ($fayllar $fayl kimi) (

fclose($fileHandle);
}
}
// Brauzerə deyin ki, bizim CSS faylımız var
əgər (isset($cssData)) (
echo $cssData;
) başqa (
}
?>

//Dəyişənlərin müəyyən edilməsi
// --- QEYD: YOLLARA SONRAKI SLESH LAZIMI ---
$cssPath = "./css/";
if (isset($_GET["q"])) (
$files = $_GET["q"];
// Fayllar massivi əldə edildi!

//Fayl adlarında qorxulu simvolların olmamasına əmin olaq :) .
foreach ($ açarı olaraq $ fayllar => $ fayl) (
$files[$key] = str_replace(massiv("/", "\\", "."), "", $fayl);
}

Bu kod üslublar qovluğuna gedən yolu təyin edir və faylları yoxlayır. Qovluğa gedən yolda qovluq adının əvvəlində və sonunda kəsik işarələri olmalıdır, əks halda çoxlu xətalarımız olacaq. Sonra, hər bir fayl adını yoxlayırıq və nöqtələri və/və ya kəsikləri çıxarırıq.

$cssData = "";
foreach ($fayllar $fayl kimi) (
$cssFileName = $cssPath . $fayl. ".css";
$fileHandle = fopen($cssFileName, "r");

$cssData .= "\n" . fread($fileHandle, fayl ölçüsü($cssFileName));
fclose($fileHandle);
}
}

İndi biz fayllardan ümumi stil cədvəli yaratmalıyıq. Bunun üçün biz fayllar massivindən keçən, hər bir faylı açan və onu bir faylda birləşdirən bir döngə işlədirik. "\n" nizam və təmizlik üçün yeni sətir əlavə edir. Filesize() funksiyası faylın uzunluğunu tapmaq və onu fread()-a ötürmək üçün istifadə olunur.

// Brauzerə deyin ki, bizim CSS faylımız var
başlıq("Məzmun növü: mətn/css");
əgər (isset($cssData)) (
echo $cssData;
echo "\n\n// Yaradıldı: " . tarix("r");
) başqa (
echo "// Fayllar mövcud deyil və ya fayl göstərilməyib.";
}
?>

Kodun sonuncu hissəsi bütün üslubları brauzerə ötürür. Bu o deməkdir ki, biz PHP-yə CSS məlumatlarını ötürməyimizi və PHP-nin bu barədə brauzeri məlumatlandırmalı olduğunu söyləməliyik. Biz bunu header() funksiyasından istifadə edərək edirik və Content-type: text/css təyin edirik. Sonra CSS-ni müştəriyə ötürürük. Ancaq bundan əvvəl faylda CSS üslublarının olub olmadığını yoxlayırıq. Əgər onlar mövcud deyilsə, deməli, CSS fayllarının adları ötürülməyib. Fayllarımız varsa, onları köçürür və nəsil haqqında bir mesaj əlavə edirik.

İmtahan

İndi skripti sınaqdan keçirməyin vaxtı gəldi. İçində bir qovluq və fayllar yaradın. Aşağıdakı qovluq strukturuna nəzər salın. Fərqli bir quruluşa ehtiyacınız varsa, o zaman yolları dəyişdirməyi unutmayın.

İndi bütün faylları saytın kökünə yükləyin və brauzeriniz vasitəsilə index.php faylına daxil olun. Sizi “Fayllar mövcud deyil və ya heç bir fayl göstərilməyib” (fayllar mövcud deyil və ya göstərilməyib) ifadəsi ilə qarşılamalısınız. Bu o deməkdir ki, qoşulması lazım olan faylların adlarını verməmişik. Ancaq yaxşı xəbər budur ki, hər şey səhvsiz işləyir. Brauzerdə "index.php?q=main" yazmağa cəhd edək. main.css faylının məzmunu ekranınızda görünəcək. Əgər bir neçə faylı əldə edib onları birləşdirməli olsaq, aşağıdakı sorğunu "index.php?q=main&q=forms" göndərməliyik. Gördüyünüz kimi "q="-ni istədiyimiz qədər təkrarlaya bilərik. Ən azı 50 stil cədvəlini bir faylda birləşdirə bilərsiniz.

Nəticə

Bu üsul çox faydalı ola bilər və bir çox üstünlüklərə malikdir. Bütün sayt üçün ümumi üslub cədvəlinə və məsələn, formaları olan səhifələr üçün ayrıca bir stil cədvəlinə sahib ola bilərsiniz.

Xəbərdarlıq sözü: əgər siz index.php faylını hər hansı bir qovluğa (CSS qovluğuna deyil) yerləşdirirsinizsə, o zaman index.php sizin üslub cədvəliniz kimi fon şəkillərinə nisbi yolları yazmalısınız. Brauzerin düşündüyü budur.

2. HTML və CSS-dən boş sətirlərin silinməsi

Bir çoxumuz kod yazarkən çoxlu boş sətirlərdən istifadə edirik. Yaxşı xəbər - PHP-də boş sətirlər brauzerə ötürülmür. Bununla belə, onlar HTML-ə köçürülür.

Boş xətlər az miqdarda trafik istehlak edir. Sayt trafiki yüksək olarsa, bu kiçik rəqəm əhəmiyyətli bir rəqəmə çevrilə bilər. Və burada PHP köməyimizə gələcək.

Hazırlıq

Aşağıda HTML və CSS faylları üçün kodlar verilmişdir.

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


Hey Səhifə!






Lorem Ipsum dol...



bədən (
minimum hündürlük: 800px;
fon: qara;
şrift ölçüsü: 18px;
}
#sarğı (
eni: 960px;
kənar: 20px avtomatik;
doldurma: 15px;
}
#başlıq h1 (
mətn girintisi: -99999em;
fon: url(../images/header.png);

Ekran: blok;
eni: 100%;
hündürlük: 48px;
}
#Əsas (
şrift çəkisi: qalın;
}

Bu skriptin üstünlüyü həm HTML, həm də CSS ilə eyni vaxtda işləyə bilməsidir. Skript faylı yükləyir, bütün boş sətirləri silir, yalnız 1 boşluq buraxır ki, sözlər bir bütövlükdə birləşməsin.

$fileDirectory = "";
$fayl = $_GET["q"];
$ext = $ad Partlayış;

//Hakerləri yoxlayın
die("Hakerlər...!");
) başqa (
//Gəlin başlayaq


//Düzgün ifadələrin möcüzələri

fclose($sapı);
//Çıxış məlumatları
əgər ($ext == "css") (
başlıq("Məzmun növü: mətn/css");
}
echo $newData;
}
?>

Kodun hər bir hissəsi haqqında ətraflı məlumat

Biz fayl adını alırıq və onun növünü yoxlayırıq. Sonra, bütün məlumatları çıxarın və boşluqları və boş sətirləri çıxarın. Bu üsul ən primitivdir və bütün boş sətirləri silməyəcək, lakin çoxunu idarə edəcək. Və bu kodun yalnız bir neçə sətiridir.

$fileDirectory = "";
$fayl = $_GET["q"];
$nameExplode = partlatmaq(".", $fayl);
$ext = $ad Partlayış;
$fileName = $fileDirectory . $fayl;

Bu kod lazımi dəyişənləri təyin edir. Yenə də bütün məlumatları "q" vasitəsilə ötürürük. Fayllar üçün qovluq da burada müəyyən edilir.

Əgər ($ext != "css" VƏ $ext != "htm" VƏ $ext != "html") (
//Hakerləri yoxlayın
die("Hakerlər...!");
) başqa (

Burada faylın həqiqətən CSS və ya HTML olub olmadığını yoxlayırıq.

//Gəlin başlayaq
$handle = fopen($fileName, "r");
$fileData = fread($handle, fayl ölçüsü($fileName));
//Düzgün ifadələrin möcüzələri
$newData = preg_replace("/\s+/", " ", $fileData);
fclose($sapı);
//Çıxış məlumatları
əgər ($ext == "css") (

başlıq("Məzmun növü: mətn/css");
}
echo $newData;
}
?>

Bu kod faylı açır və oxuyur - və sonra mümkün qədər çox boş yeri silir. Bu, müntəzəm ifadələrdən istifadə etməklə əldə edilir. Bütün boşluqlar, nişanlar və boş sətirlər tapılır və boşluqla əvəz olunur.

Bu işləyir?

Brauzerinizdə "index.php?q=css.css" yazsanız, bir CSS sətirini görəcəksiniz. Beləliklə, hər şey işləyir! Səhifənin mənbə kodunu açsanız, eyni şəkli görəcəksiniz. Bu üsuldan istifadə edərək, 314 simvollu CSS faylını 277 simvola endirdik. HTML faylı 528 ilə 448 simvol arasındadır. 15 sətir kod üçün pis deyil.

Nəticə

Bu, sadəcə bir neçə sətir kodla çox şey edə biləcəyimizin gözəl nümunəsidir. Google kimi saytların mənbə koduna baxsanız, praktiki olaraq boş sətirlərin olmadığını görəcəksiniz.

3. PHP skriptlərinin keşləşdirilməsi.

Yuxarıdakı nümunədən istifadə edərək skriptləriniz üçün keşləşdirməni necə quracağınızı sizə göstərəcəyəm. Məqsəd saytı sürətləndirməkdir. Məsələ çox sadədir - sayta hər dəfə daxil olanda məlumatlar yaradılmayacaq. Onlar önbellekdə saxlanılacaq.

Keşləmə əlavə etmək üçün skriptimizə üç şey əlavə etməliyik. Birincisi, biz bütün məlumatları skriptə toplamalı və bu daxil edilmiş məlumat dəstinə xas bir fayl yaratmalıyıq. İkincisi, keş faylını tapmalı və onun nə qədər yeni olduğunu yoxlamalıyıq. Üçüncüsü, biz keşlənmiş nüsxədən istifadə etməliyik və ya gələcək istifadə üçün yeni keş faylı yaratmalıyıq.

Daha ətraflı

$fileDirectory = "";
$fayl = $_GET["q"];
$nameExplode = partlatmaq(".", $fayl);
$ext = $ad Partlayış;
$fileName = $fileDirectory . $fayl;
//-- BURADA KEŞ FAYLININ ADINI YARATMAK ÜÇÜN KƏFƏRDƏN MƏLUMAT VAR --
if ($ext != "css" VƏ $ext != "htm" VƏ $ext != "html") (
//Pis adamları yoxlayın...
die("Hakerlər...!");
) başqa (

//-- BURADA KEŞLƏŞDİRİLMİŞ VERSİYANI KEÇƏB VƏ YOXLAYA BİLƏRİK --

//Gəlin işə başlayaq
$handle = fopen($fileName, "r");
$fileData = fread($handle, fayl ölçüsü($fileName));
//İndi bəzi regex sehrbazlığı üçün!
$newData = preg_replace("/\s+/", " ", $fileData);

Fclose($tutacaq);
//Məlumatların çıxarılması vaxtı.

//-- İNDİ BİZ YENİ MƏLUMATLARI TƏLƏB OLDUĞUNDA SAXLAYA BİLƏRƏK VƏ VERİLƏNİ ÇIXA BİLƏRİK --

Əgər ($ext == "css") (
başlıq("Məzmun növü: mətn/css");
}
echo $newData;
}
?>

$fileDirectory = "";
$fayl = $_GET["q"];
$nameExplode = partlatmaq(".", $fayl);
$ext = $ad Partlayış;
$fileName = $fileDirectory . $fayl;
$cacheName = "./cache/" . $name Explode. $name Explode. ".tmp";
if ($ext != "css" VƏ $ext != "htm" VƏ $ext != "html") (
//Hakerlər
çap_r($ext);
die("Hakerlər...!");
) başqa (
əgər (fayl_mövcuddur($cacheName) AND filemtime($cacheName) > (time() - 86400)) (


fclose($cacheHandle);
$isCached = DOĞRU;
) başqa (
//Gəlin başlayaq
$handle = fopen($fileName, "r");
$fileData = fread($handle, fayl ölçüsü($fileName));
//Düzgün ifadələrin möcüzələri
$newData = preg_replace("/\s+/", " ", $fileData);
fclose($sapı);
//Keşləmə


fclose($cacheHandle);
$isCached = FALSE;
}
//Çıxış məlumatları
əgər ($ext == "css") (
başlıq("Məzmun növü: mətn/css");
əgər ($isCached) (

}
) başqa (
əgər ($isCached) (
əks-səda "";

}
}
echo $newData;

İzahat

Bu skript keşi hər 24 saatdan bir yeniləmək funksiyasını əlavə etdi. Rahatdır. Tutaq ki, saytda nəyisə dəyişmisinizsə, 24 saat gözləyə və ya önbelleği təmizləyə bilərsiniz.

$cacheName = "./cache/" . $name Explode. $name Explode. ".tmp";

Bu kod parçası faylların adlarını və onların uzantılarını götürür, onları bir-birinə yapışdırır və düzgün “.tmp” uzantısı ilə keş yaddaşa əlavə edir.

Əgər (fayl_mövcuddur($cacheName) AND filemtime($cacheName) > (time() - 86400)) (
$cacheHandle = fopen($cacheName, "r");
$newData = fread($cacheHandle, fayl ölçüsü($cacheName));
fclose($cacheHandle);
$isCached = DOĞRU;
) başqa (

Burada saxlanmış keşin varlığını və onun son 24 saat ərzində yaradılıb-yaratılmadığını yoxlayırıq (dəyər saniyələrlədir - hər hansı digərinə dəyişdirilə bilər). Hər iki şərt yerinə yetirilərsə, faylı açın və skriptin nəticəsini onunla əvəz etmək üçün məzmunu çıxarın. Biz həmçinin sonda əlavə mesajları çap etmək üçün $isCached-i doğru olaraq təyin etdik.

//Qeyd edək!
$cacheHandle = fopen($cacheName, "w+");
fwrite($cacheHandle, $newData);
fclose($cacheHandle);
$isCache = FALSE;
}

Gələcək zənglərdə istifadə üçün skriptin nəticəsini keşləyirik. Biz sadəcə olaraq faylı yazma rejimində açırıq, məlumatları ora atırıq və bağlayırıq.

//Məlumatların çıxarılması vaxtı.
əgər ($ext == "css") (
başlıq("Məzmun növü: mətn/css");
əgər ($isCached) (
echo "// Keş faylından alındı.\n";
}
) başqa (
əgər ($isCached) (
əks-səda "";
}
}

Skriptin bu hissəsi işin nəticəsini görə bilək deyə bir az dəyişdirilib. Faylın məzmunu keşdən götürülübsə, bu barədə mesaj əlavə edə bilərik.

Gəlin cəhd edək

Skriptdən yenidən istifadə etsək, səhifəni təzələyənə qədər dəyişiklikləri görməyəcəyik. Aşağıda faylın keşdən götürüldüyünə dair bir yazı görəcəyik.

Nəticə

İstənilən skriptə sadə keşləməni necə tez əlavə etməyi bilmək düzgün istiqamətdə getdiyiniz deməkdir. Keşləmə ilə skript istənilən serverə yükü əhəmiyyətli dərəcədə azaldacaq.

Gəlin ümumiləşdirək

Bu dərsdə mən sizə PHP-dən istifadə edərək veb saytınızı sürətləndirməyin bir neçə rahat və sadə üsulunu göstərdim.

Böyük layihələr hazırlayarkən layihə kodunun optimallaşdırılması məsələsi tədricən yaranır: yaddaş sərfiyyatı nə dərəcədə əsaslıdır, yazılmış PHP kodunun icra sürətini necə artırmaq olar. Əvvəlcə bir çox insanlar yazılı kodun düzgünlüyü və səmərəliliyi haqqında düşünmürlər, onlar prinsipə uyğun olaraq yazır: işləyir - və bu, yaxşıdır. Baxmayaraq ki, PHP tərcüməçisi PHP kodunu icra etməkdə kifayət qədər sürətlidir və PHP-dən kənar kodun icrasını ləngidən bir çox maneələr var, PHP kodunun optimallaşdırılması da vacibdir və kodun optimallaşdırılması kodlaşdırma prosesinin əvvəlində tətbiq edilməlidir.

Əksər PHP skriptləri sadə işlər görür. Skriptin standart davranışı istifadəçidən az miqdarda məlumat yükləmək, verilənlər bazasından və ya fayldan bəzi məlumatları almaq, müvafiq HTML çıxarmaq və nəticəni müştəriyə göndərməkdir. Burada başa düşməli olduğunuz ilk şey optimallaşdırmanın nəticəsinin tam olaraq nə olmasıdır: performans, miqyaslaşdırma asanlığı, istifadə olunan server resurslarının miqdarının azaldılması, məlumat ötürmə vaxtının azaldılması və ya hamısı birlikdə. Sonuncu halda, yalnız bütün kritik sahələri tapmaq deyil, həm də onların optimallaşdırılmasını balanslaşdırmaq lazımdır.

Sizə sadə bir misal verim: 100 MB pulsuz RAM olan serverdə nəticəsi eyni olan iki skript olsun. Birinci skript maksimum performans üçün optimallaşdırılıb, 10 MB yaddaş tələb edir və onu tam oxumaqla fayldan məlumatları qəbul edir, ikincisi minimum yaddaş sərfi üçün optimallaşdırılıb, 5 MB yaddaş tələb edir və eyni fayldan məlumatları hissə-hissə qəbul edir. Bir sorğu nəticəsində birinci skript ikincidən daha sürətli yerinə yetiriləcək, lakin eyni zamanda ondan çox sorğu olarsa, ikinci skriptin sürəti daha yüksək olacaq. Bu niyə baş verir? Birinci skriptdə darboğaz yaddaş resurslarının istifadəsi, ikincidə isə I/O sisteminin xüsusiyyətləridir. Birinci skript bütün mövcud RAM-ı istehlak etdikdən sonra sistem virtual yaddaşdan istifadəyə keçəcək və eyni I/O sistemi bu sxemin əlavə darboğazına çevriləcək.

Əlbəttə ki, bu nümunə çox sadələşdirilmişdir və RAM-dan başqa digər darboğazlar da var, lakin əsas fikir budur: bir iş üçün optimallaşdırma digərində kritik nöqtəyə çevrilə bilər. Nümunədə, aşağı yüklərdə sürətin bir qədər artması üçün optimallaşdırma nəticəsində daha yüksək yüklərdə skriptin icra sürəti əhəmiyyətli dərəcədə azaldı. Buna görə də, daha yaxşı gəlir əldə etmək üçün enerjinizi həqiqətən diqqətə layiq olan sahələri optimallaşdırmağa sərf etmək vacibdir.

Mən burada əməliyyat sisteminin optimallaşdırılmasını, server parametrlərinin optimallaşdırılmasını və s.-ni nəzərdən keçirməyəcəyəm, çünki... Əksər veb ustaları hostinqdən istifadə edir və buna görə də hər şeyi özbaşına qura bilməyəcəklər. Burada yalnız PHP kodunun optimallaşdırılması nəzərdən keçiriləcək. Qeyd etmək lazımdır ki, hər bir konkret vəziyyətdə bəzi optimallaşdırma növləri faydalı olacaq, digərləri vaxt və səy itkisinə səbəb olacaqdır. Çox vaxt kodun təkmilləşdirilməsinin faydası əhəmiyyətsiz olacaqdır. Ola bilsin ki, zaman keçdikcə PHP-də daxili dəyişikliklər uğurlu optimallaşdırmanı faydasız və ya hətta zərərli edəcək.

Aşağıda PHP 5 versiyası üçün əsas performans addımları verilmişdir:

RAM istehlakını optimallaşdırmaq üçün tədbirlər:

  1. Funksiyalarınızın nəticələrini təhlil edin. Funksiyanı yazmazdan əvvəl standart ekvivalentinin olub olmadığını yoxlayın.
  2. Böyük massivlər və ya obyektlər başa çatdıqda yaddaşın boşaldılması yalnız qlobal miqyasda istifadə olunur (yaddaş yerli əhatə dairəsində avtomatik olaraq boşalacaq). Qeyd edək ki, funksiya unset() dəyişəni əhatə dairəsindən çıxarır və yalnız obyektə başqa istinadlar olmadıqda, obyektin tutduğu yaddaşı azad edir. Dəyişənə dəyər təyin edilməsi sıfır həmişə obyekti məhv edir və bu obyektə hələ də istinadların olub-olmamasından asılı olmayaraq obyektin tutduğu yaddaşı azad edir. Bu halda, dəyişən əhatə dairəsindən çıxarılmayacaq, yəni. əslində dəyişən qeyri-müəyyən (sıfır) dəyəri ehtiva edəcək və müvafiq olaraq bu dəyişənin məzmunu üçün yaddaş tutacaq (təxminən 72 bayt).
  3. OOP (obyekt yönümlü proqramlaşdırma) istifadəsinin əsaslandırılmasının təhlili. Obyekt yönümlü kod yazmazdan əvvəl özünüzə iki sual verin: "Bu, obyekt yönümlü yanaşma tələb edirmi?" və "Obyekt yönümlü kod yaza bilərəmmi?" Məsələn, bir sinif daxilində statik funksiyanın təyin edilməsi, sadəcə, bu funksiyanı ehtiva etmək üçün tələb olunan yaddaşın həcmini 10-18% artırır. Struktur olaraq sinifdən daha çox massivdən istifadə yaddaşa qənaət edir. Funksiyaları sinif metodları kimi həyata keçirməkdənsə, sadəcə olaraq ayrıca faylda yerləşdirmək daha sərfəli ola bilər.
  4. Bir sinifdə metodun statik versiyasının tətbiqi imkanlarının təhlili. Metod parametrdən istifadə etmirsə $bu, sonra açar sözdən istifadə edərək elan edilməlidir statik.

Kodun icra sürətini artırmaq üçün tədbirlər:

  1. SQL sorğularının optimallaşdırılmasının təhlili. Əksər layihələrdə ən böyük performans artımını təmin edən SQL sorğularının optimallaşdırılmasıdır.
  2. Çıxış buferləmə və müxtəlif keş modullarından istifadə performansı 25% -100% artıra bilər.
  3. Dəyişənlər, funksiyalar, sabitlər və siniflər üçün daha qısa qısa adlardan istifadə performansı 20%-ə qədər yaxşılaşdıra bilər. Eyni zamanda, əlavə kod dəstəyi haqqında unutmayın; kodu dəyişdirərkən aydın bir funksiya adı daha rahatdır.
  4. Dəyişənin mövcudluğunun yoxlanılması (funksiya isset()) onunla əlaqə saxlamazdan əvvəl. @ istifadə edərək qeyri-mövcud dəyişənə daxil olarkən yaranan xətanın qarşısını almaq böyük performans hitdir.
  5. "Tək dırnaqlar"dan istifadə kodu daha sürətli şərh etməyə imkan verir, çünki “ikiqat dırnaq” vəziyyətində dəyişənlər sətir daxilində axtarılır
  6. Döngədən "əlavə" funksiyaların çıxarılması imkanlarının təhlili. Məsələn, funksiyanı əvəz etmək saymaq() döngə başlamazdan əvvəl hesablanmış və ifadədə bu funksiyanın nəticəsini ehtiva edən dəyişənə üçün($i=0; $i bu dövrün məhsuldarlığını artıracaq. Əks halda funksiya saymaq() Döngənin hər iterasiyasında çağırılacaq və icra ediləcək.
  7. Operatordan istifadə etməklə halçoxlu konstruksiyalardan istifadə etmək əvəzinə Əgər.
  8. Massiv sahələrinə açıq girişdən istifadə. Formanın dəyişdirilməsi $array["id"] geri dönmədən 7 dəfə daha sürətli işləyir $massiv. Bundan əlavə, bu, skriptin sonrakı dəstəyi zamanı səhvlərdən qoruyur, çünki bir gün adında bir sabit ola bilər id.
  9. Döngüdə çoxölçülü massivləri emal edərkən son massivə istinadı ehtiva edən əlavə dəyişəndən istifadə. Döngəni sürətləndirmək üçün üçün($i = 0; $i< 5; $i++) $a["b"]["c"][$i] = func($i); , dövrə başlamazdan əvvəl növbəti təlimatı yazmaq mümkündür $item =p$a["b"]["c"] və döngəni bu şəkildə yenidən yazın: üçün($i = 0; $i< 5; $i++) $ref[$i] = $i; .
  10. Apache mod_gzip və mod_deflate modullarından istifadə trafiki azaltmağa və bununla da səhifə yükləmə sürətini artırmağa imkan verir.

Aşağıdakı kod optimallaşdırma addımları yalnız təkrar istifadə edildikdə performansı artırır:

  1. İstifadəsi +$iəvəzinə $i++ dövrlərdə 6% performans artımı verir.
  2. Dəyişənləri birləşdirmək üçün "ikiqat dırnaq"dan istifadə edin. Formanın təlimatı $s="$s1$s2$s3" daha sürətli şərh olunur $s=$s1.$s2.$s3. Bu ifadə yalnız üç və ya daha çox dəyişən üçün doğrudur.
  3. Təlimatlarda tam yollardan istifadə daxildirtələb edir real yolu tapmaq üçün sistemin axtarışına daha az vaxt sərf etməyə imkan verəcək.
  4. Onlara ehtiyac qalmadıqdan sonra verilənlər bazası ilə açıq əlaqələrin bağlanması. Eyni zamanda, eyni verilənlər bazasına bir neçə dəfə qoşulmamalısınız.
  5. Əvəz edilməsinin texniki-iqtisadi təhlili daxil edin()daxil_bir dəfə() haqqında tələb()tələb_bir dəfə() müvafiq olaraq.
  6. Əhəmiyyətli miqdarda statik sətirlər çıxarmaq əvəzinə, koda HTML əlavələrindən istifadə (kodun nəticələrini ehtiva etmir). Ümumiyyətlə, statik səhifənin (HTML) buraxılış sürəti PHP-də yazılmış səhifənin buraxılmasından bir neçə dəfə yüksəkdir. Ancaq burada başını götürməməlisən, çünki... Tərcüməçinin PHP emal rejiminə daxil olması və çıxması da serveri yükləyir.
  7. Funksiyaların dəyişdirilməsi imkanlarının təhlili əvvəlcədən_əvəz edinstr_dəyişdirin bəzi hallarda. Funksiya str_dəyişdirin-dən daha sürətli işləyir əvvəlcədən_əvəz edin, və eyni zamanda funksiya strtr daha sürətli funksiyalar str_dəyişdirin. Həmçinin, simli funksiyalardan istifadə etməklə strncasecmp, strpbrkstripos müntəzəm ifadələrdən istifadə etməkdən daha optimaldır. Bununla belə, bu funksiyaları yerləşdirmək əvəzinə müntəzəm ifadə funksiyalarından istifadə etməlisiniz.
  8. Açıq dəyişən başlanğıcdan istifadə. Məsələn, başlamamış dəyişənin artımı əvvəllər işə salınmış dəyişəndən 9-10 dəfə yavaşdır. Bundan əlavə, dəyişənləri açıq şəkildə başlatarkən səhvlər daha az olur.
  9. Nəticə olaraq qeyd etmək istərdim ki, dizaynın istifadəsi əks-səda, funksiya yerinə çap edin, məhsuldarlığın nəzərəçarpan artımını təmin etmir.
  • Skriptin icrasının başlama vaxtını müəyyən etmək üçün cari vaxtı qaytaran funksiyalar əvəzinə istifadə etmək üstünlük təşkil edir. $_SERVER["REQUEST_TIME"].
  • Kodun kritik hissələrini müəyyən etmək üçün profil tərtibatçısından istifadə edin.

Kod performansını optimallaşdırmadan əvvəl, verilənlər bazası üçün SQL sorğularının optimallaşdırılmasını yoxlamağı, həmçinin http sorğularını optimallaşdırmağı, js və css ölçüsünü azaltmağı, şablonları keşləşdirməyi düşünməyi və yalnız bundan sonra performans üçün kodu sınamağa başlamağı şiddətlə tövsiyə edirəm.

Yaxşı proqramlaşdırma tərzi sonradan deşikləri yamaqdansa, kod yazarkən optimallaşdırmağı nəzərdə tutur.

Mən bütün httpd.conf-u öyrəndim, yüksək yüklənmədə bir dəstə bələdçini qazdım (onlar köhnədir və "lazımsız modulları söndürün" kimi şübhəli məsləhətlərlə.
Sürət üçün Apache-də deaktiv edilməli olan ilk modullardan biri .htaccess faylları üçün dəstəkdir; bu dəstəyin özü performans əlavə etmir və bu faylların mövcudluğu daha da yüksəkdir.
1) Bütün VPS-lərdə VIP tarifi olsa belə, bəzi acınacaqlı hostinqdən daha yavaş olan sözdə “güclü” prosessor varmı?
Xeyr, bəlkə də şəxsən sizin bir növ bərbad VPS hostunuz var və ya daha pisi, “OpenVZ, biz satılan resursları satmırıq... yaxşı, bəlkə də 10 dəfə, amma daha satmırıq” kimi tarifiniz var.
2) FastCGI belə bir vəziyyətdə kömək edəcəkmi?
FastCGI PHP-nin iş rejimidir, birbaşa olaraq, performansa əhəmiyyətli dərəcədə təsir etmir, üstəlik, FCGI əməliyyatının məntiqi (Apache-FCGI və Apache-mod_php-ni müqayisə etsək) daha yavaş olacaq, çünki FastCGI üçün rozetka istifadə olunacaq. PHP tərcüməçisinin serverin "daxilində" birbaşa işləməsi əvəzinə şəbəkə rabitəsini nəzərdə tutan qarşılıqlı əlaqə ("müntəzəm" və ya unix yuvası). Düşünürəm ki, başqa bir şey sizə kömək edəcək (aşağıda təsvir etməyə çalışacağam).
3) eAccelerator (AST caching və s.) kimi xüsusiyyətlər niyə populyar deyil?
Onların niyə populyar olmadığını və belə statistikanı haradan əldə etdiyini bilmirəm... Amma bəlkə də fakt budur ki, eAccelerator mənəvi və fiziki cəhətdən köhnəlib və məsələn, belə bir bayağı məqaləyə inanırsınızsa (yox, mən t "Bitrix" kimi "şedevr" CMS ilə işləmək, bu, ağlıma gələn eAccelerator haqqında ilk qeyddir) - 5.3-dən yuxarı PHP versiyaları ilə işləmir.
Bilirəm ki, onların çoxu tərk edilib, amma bu səbəb deyil, nəticədir.
Mən bu barədə şərh verə bilmərəm, çünki nəticəsini göstərməmisiniz - dəqiq nə. Başqa sözlə, bununla nə demək istədiyinizi tam başa düşə bilmirəm.
4) Başqa nə kömək edə bilər?
Yaxşı, dərhal yaddaşdan (seçimlər bir-biri ilə əlaqəli olmaya bilər):
1. Apache-də .htaccess dəstəyindən imtina və ya ən azı onların sayının azaldılması
2. Statik verilənlərə xidmət etmək üçün Nginx-in ön server kimi quraşdırılması
3. Ümumilikdə Apache-dən tamamilə imtina və Nginx+FCGI-yə keçid (sadəcə mən Apache-ni konfiqurasiyadakı çevikliyinə və geniş imkanlarına görə həqiqətən sevirəm, başqa bir sual ondan ibarətdir ki, əslində bu çevikliyə çox az adam lazımdır və çox az adam bunu bacarıqla edə bilər. , səmərəli və tam konfiqurasiya... Bu baxımdan Nginx daha sadə olacaq). Niyə FCGI? Çünki mən Nginx-in PHP ilə qarşılıqlı əlaqəsi üçün başqa məqbul yol bilmirəm. FCGI hovuzunun qurulması məcburidir.
4. OpCache - 5.5 versiyasından bəri daxili "parıltılar" var, işə salmaq və konfiqurasiya etmək çox tövsiyə olunur. CMS ilə işlərin necə olduğunu və saytda CMS istifadə edib-etmədiyinizi bilmirəm, amma təcrübəmə görə, PHP çərçivələrinin sürəti orta hesabla 8-20 dəfə artır.
5. Alternativ olaraq HHVM
6. Yoxlayın:
a) Problemin həqiqətən PHP-də olması. Xüsusilə, bütün server qeydlərini, məsələn, sorğuların nə qədər davam etdiyini, verilənlər bazasında, onların sayını və s.
b) Disk alt sisteminin sürətinin yoxlanılması... Mən barmaqları göstərməyəcəyəm, amma bir vaxtlar bir məşhur hosterdən kifayət qədər çox sayda VPS icarəyə götürdüm və bir anda diskin orta sürətinin altsistem altsistemləri - 1,4Kbayt/san, halların təxminən 50%-də “uğursuzluqlar” (aka “blok yazmaq mümkün deyil”) baş verirdi... bu çox uzun sürmədi, lakin bir neçə aydan sonra eyni hoster "adi HDD" ilə tariflər, nədənsə "sürətli SSD" tarifləri ilə müqayisədə daha sürətli disk alt sistemi var idi... nəticə çıxara bilərik...
c) Prosessorun real sürətini yoxlayın, o, tez-tez yavaşlamışdan xeyli fərqlənir.

P.S. Sual(lar)ı daha dəqiq tərtib etsəniz, təbii ki, sizə lazım olsa, daha dəqiq tövsiyələr verə bilərəm :)

P.P.S. Problemi "baş-başa" həll etmək variantı var ki, bu, bəlkə də bir sıra hallarda ən çətin və bəlkə də ən məhsuldardır. Bu, Varnish + onun incə tənzimlənməsidir, səhifələrin əksəriyyətini keşdən (RAM) nanosaniyələrlə çıxarmağa imkan verir, bəzən dəqiqədə minlərlə sorğuya xidmət etməyə imkan verir və bu, sadəcə kodun keşləşdirilməsi və ya buna bənzər bir şey deyil. .. bu, bütün səhifələri və/yaxud server cavablarını keşləmədir. Digər şeylər arasında, o, "arxa tərəfə ümumiyyətlə toxunmamağa" imkan verir, yəni. səhifə tələb edilərkən verilənlər bazasına zənglər olmaya bilər və server tərəfində eyni PHP (və ya hər hansı digər) kodun icrası olmaya bilər. Bu, kifayət qədər incə tənzimləmə tələb edir, "CMS-də" saytlar üçün, çərçivələrdəki saytlar üçün çox uyğun deyil - bu, nəyin və necə keşləniləcəyi/keşlənilməli olduğu barədə inkişaf və düşünməyə ilkin olaraq düzgün yanaşma tələb edir. Yanlış yanaşma ilə, ən çox ehtimal olunan nəticə onun işləyəcəyidir, lakin istədiyimiz qədər tez deyil və saytın bir hissəsi hətta normal fəaliyyətini dayandıra bilər. Başqa həll yolları da var, lakin sualın kifayət qədər ümumi formalarını nəzərə alsaq, onlar haqqında danışmaq olduqca çətindir.

Oh, bəli, vacib bir detalı unutdum... Niyə “hosting” şirkətləri Apache-dən istifadə edir və ondan (tamamilə) imtina etmirlər? Daha çox, çünki Apache bəzi parametrləri .htaccess vasitəsilə istifadəçiyə həvalə etməyə imkan verir. Eyni zamanda, statik tətbiqlər üçün çox vaxt eyni Nginx-dir, başa düşdüyünüz kimi, bəzi parametrləri istifadəçiyə bu şəkildə həvalə etməyə imkan vermir, buna görə də bu vəzifələr üçün uyğun deyil və bunu edir. bu barədə "sürüşməyin" (Apache-dən fərqli olaraq, bu daxil olmaqla, biz 99% "hostinqdən" imtina etdik (Apache-nin mövcudluğu və ondan qurtula bilməməyimiz və ya onu özümüz konfiqurasiya edə bilməməyimiz və "əyləclər" nəticəsində belə bir yanaşma ilə gələn).