Оптимизиране на РНР скрипт

Под оптимизация на скрипта в случая ще разбираме увеличаване на неговото бързодействие.

Операторът echo


Производителността на скрипта може съществено да се понижи, ако използваме често оператора echo. Какво имам предвид? Искаме да изведем на екрана:

Честита Нова година!

Желая ви здраве, обич, късмет!

Вместо да го извеждаме така (нерационално използване на ресурси):

echo “Честита Нова година!”;
echo “<br>”;
echo “Желая ви здраве, обич, късмет!”;
ще го направим по следния начин:

echo “Честита Нова година!”  .  “Желая ви здраве, обич, късмет!”;
Да предположим, че имаме променлива, съдържаща името на потребител. Необходимо е да изведем приветствие към потребителя:

$name=”Poli”;
echo “Здравей, $name!”;
или

echo “Здравей” . $name . “!”;
Вторият вариант е за предпочитане.

Дължина на променливите


Старайте се да използвате по-кратки и ясни имена на променливите. Скриптът се обработва по-бързо.

Обръщане към елементите на масив


Нека елементите на масива са:

$elements= array ['Oxygen', 'Hydrogen', 'Azot ']

Необходимо е да ги изведем. Как да го направим? Така:

echo “В състава на въздуха са включени: $elements.”;
или така

echo “В състава на въздуха са включени:” . $elements[0] . $elements[1] . $elements[2];
Вторият начин е по-добър. Скриптът ще се обработи по-бързо.

Цикли


Най-често използваните цикли в скриптовете са foeach, for и while. Цикълът foreach работи по-бавно от for и while. Избягвайте го, където е възможно.

Четене на файлове


Ще разгледаме две функции, намиращи приложение за четене на файлове: fopen() и file(). Коя от двете функции ще си свърши работата по-бързо? Когато правим експеримент, е необходимо обектите на експеримента да бъдат поставени при едни и същи условия, за да имаме право да сравняваме изходните резултати. Какво имам предвид? За да сравним бързодействието на двете функции, ще трябва да ги заставим да четат един и същи файл и да измерим времето, за което те ще го направят.
Необходимо е да съставим скрипт, който ще измерва времето за прочитане на файла първо от едната функция, а впоследствие и от другата. Ще дадем наименование на скрипта timer.php.
<?php
//timer.php

header('Content-Type: text/html; charset=utf-8');

function timer_start ()
{
$mtime = microtime ();
$start_time = $mtime;

return $start_time;
}

function timer_end ()
{
 
$mtime2 = microtime();
$end_time = $mtime2;

return $end_time;
}

$t1 = timer_start ();

//$f=fopen("/opt/lampp/htdocs/my.localhost/test-file.txt", "r") or die("Файлът не може да бъде отворен.");


$x = file("/opt/lampp/htdocs/my.localhost/test-file.txt");

$t2 = timer_end ();

$time = round(($t2 - $t1), 7);

//echo "С функцията fopen() файлът бе прочетен за" . " " . $time . " " . "секунди" . ".";

echo "С функцията file() файлът бе прочетен за" . " " . $time . " " . "секунди" . ".";

?>

Какво прави всяка една функция от скрипта?

microtime() - връща текущото време в Unix системи в милисекунди.

explode()- разделя стринг на подстринговe.

fopen()- отваря файла, в случая само за четене.

file()- чете целия файл в масив.

round()- закръгля число, в случая до шестия знак след запетаята.


Производителността на РНР зависи не само от начина, по който сме написали скрипта, а и от процесора, оперативната (RAM) памет, твърдият диск, операционната система, програмната среда (версията на РНР) на компютъра, на който сме го стартирали. Какво означава това? Това означава, че тестовете, които се правят за оптимизация на даден РНР скрипт не са универсални и е желателно всеки сам да си ги направи.
За сървъри предпочитаната операционна система трябва да е Линукс.

За теста използвах текстов файл test-file.txt с размер 12 080 байта. Резултатите от измерване на времето за изпълнение на скрипта са поместени в таблицата по-долу:

timer-php.png

Резултатите от измерванията показват, че по-бързо работи функцията fopen (). Средноаритметичната стойност на времето, необходимо за отваряне на файла с функцията fopen() е 0.0000421 s, а с функцията file()- 0.000164 s.
Но дали е така при четене на файлове с различни размери? Дали да не се използват цикли за прочитане на файловете с тези функции? Това оставям на вашето желание да експериментирате и да извършите съответните оптимизации. :)

Извикване на функции


За какво става въпрос? Ако искаме да прочетем файла test-file.txt чрез използване на цикъл, можем да напишем следния скрипт:
for ( $i=0; $i < sizeof($x); $i++){
    echo $x[$i];
}
Файлът test-file.txt съдържа 254 реда. Това означава, че цикълът ще трябва да направи 254 итерации и при всяка итерация ще се извиква функцията sizeof(). За да намалим времето за обработване на файла, ще назначим функцията към променлива. По този начин тя ще се извика само веднъж:
$n=sizeof($x);
for ( $i=0; $i<$n; $i++){
echo $x[$i];
}

Тестване на РНР скрипта за откриване на грешки


Най-честите грешки при работа на програмите са логическите грешки. Те са най-коварните. От гледна точка на синтаксиса всичко е написано правилно (интерпретатора ни помага да ги отстраним), но в логиката на написване на програмата интерпретаторът е безсилен- той просто не може да знае какво ние си мислим. На всичко отгоре някои грешки се появяват само при определени условия, а в останалите случаи всичко си работи отлично.
За отстраняване на грешки в скрипта можете да ползвате системата за автоматично тестване- SimpleTest PHP unit tester. Можете да я свалите от адрес: http://www.simpletest.org, където ще откриете и документацията за работа на програмата.

Няма коментари:

Публикуване на коментар