Как оптимизировать php скрипт


Для любого программиста очень важно оптимизировать свой скрипт на самой ранней стадии процесса разработки. В этой статье приведены несколько советов по оптимизации кода PHP с точки зрения разработчика.

1. Используйте встроенные функции PHP

По возможности старайтесь использовать встроенные функции PHP, а не писать свои собственные функции для достижения цели. Например, вы можете использовать range (b, k) для получения массива алфавита, начиная с b до k, если это необходимо только один раз в скрипте, а не объявлять массив с этими значениями в функции и возвращать его при вызове.

2. Используйте одиночные кавычки

Использование одинарных кавычек ('') выполняется быстрее, чем использование двойных кавычек (""), если вы хотите сохранить только строку внутри нее, избегая любых переменных. Двойные кавычки проверяют наличие переменной и добавляют немного накладных расходов.

3. Используйте = = =

Используйте «= = =» вместо «= =», поскольку первая строго проверяет замкнутый диапазон, это происходит быстрее.

4. Используйте соответствующие функции Str

str_replace быстрее, чем preg_replace, но strtr быстрее, чем str_replace в 4 раза.

5. Вычисляйте только один раз

Вычислите и присвойте значение переменной, если это значение используется много раз, а не вычисляйте его снова и снова в тех местах, где оно используется.

Например, следующий код обладает на самой лучшей производительностью:

for( $i=0; i< count($arrA); $i++){
  echo count($arrA);
}
Скрипт ниже будет работать намного быстрее:

$len = count($arrA);
for( $i=0; i<$len; $i++){
  echo $len;
}
6. Используйте ссылки на функции

Передайте ссылку на функцию, если она не влияет на вашу логику. Функция, управляющая ссылкой, быстрее, чем те, которые управляют переданным значением, поскольку здесь создается еще одна копия значения. Особенно это увеличивает время, когда значение, переданное вами, представляет собой большой массив. Например, давайте создадим функцию двумя разными способами для увеличения на 1, каждый элемент массива со значениями от 0 до 99.

<?php
  // передача по ссылке
  function  computeValue( &$param ){
  	// что-то делаем здесь
  	foreach( $param as $k => $value){
  	  $param[$k] = $value + 1;
  	}
  }
  $x = array();
  for( $i =0; $i<99; $i++){
    $x[$i] = $i;
  }
  computeValue( $x);
  // массив из 100 элементов, каждый увеличивается на 1
  print_r( $x );

?>
Вышеуказанная функция работает быстрее, чем функция ниже, хотя обе будут давать одинаковый результат (приращение каждого элемента массива на 1):

<?php
  	// передача по значению
    function  computeValue( $param ){
      // что-то делаем здесь
      foreach( $param as $k => $value){
      	$param[$k] = $value + 1;
      }
      
      return $param;
    }
    $x = array();
    for( $i =0; $i<99; $i++){
      $x[$i] = $i;
    }
	// массив из 100 элементов, каждый увеличивается на 1
    print_r(computeValue( $x));   
?>
7. Создавайте классы только тогда, когда это необходимо

Не создавайте классы и методы до тех пор, пока они не понадобятся, не используются и не используются повторно.

8. Отключите отладочные сообщения

Операции с файлами дороги. Итак, если вы написали множество пользовательских функций для регистрации ошибок и предупреждения во время процесса разработки, убедитесь, что вы удалили их, прежде чем вы запустите код в реальную работу.

9. Используйте методы кеширования

Используйте кеш, чтобы уменьшить нагрузку на операции с базой данных, а также на компиляцию скриптов. Мы можем использовать memcache для снижения нагрузки базы данных и APC для кэширования кода операций и промежуточной оптимизации кода.

10. Закройте соединение

Заведите в привычку отключать переменные и закрывать соединение с базой данных в вашем PHP-коде. Это экономит память.

11. Уменьшите количество обращений к базе

Попытайтесь уменьшить количество обращений к базе данных. Сделайте агрегирование запросов таким образом, чтобы вы вызывали базу данных меньше времени. Например:

<?php
  $con=mysqli_connect("localhost","username","somepassword","anydb");
  
  if (mysqli_connect_errno())
  {
    echo "Не удалось подключиться к MySQL" ;
	mysqli_connect_error(); 
  }

  function insertValue( $val ){
    mysqli_query($con,"INSERT INTO tableX (someInteger) VALUES ( $val )");
  }
  
  for( $i =0; $i<99; $i++){
    //  Вызов функции для выполнения запросов по одному
    insertValue( $i );
  }					
  // Закрытие соединения 		
  mysqli_close($con);

?>
Скрипт выше намного медленнее, чем приведенный ниже:

<?php
  $con=mysqli_connect("localhost","username","somepassword","anydb");
   if (mysqli_connect_errno ())
   {
  	 echo «Не удалось подключиться к MySQL»;
  	 mysqli_connect_error (); 
   }
   
   function insertValues ($ val) {
      // Создание запроса для вставки полного массива в однократное выполнение.
    $query= " INSERT INTO tableX(someInteger) VALUES .implode(',', $val)";      
    mysqli_query($con, $query);
  }
  
  $data = array();
  for( $i =0; $i<99; $i++){
    // Creating an array of data to be inserted.
    $data[ ]  =   '(" ' . $i. '")' ;
  }
  // Вставка данных в одном вызове
  insertValues( $data );
  // Закрытие соединения e
  mysqli_close($con);

?>
 
12. Использование методов в производных классах

Методы в производных классах быстрее базовых классов. Например, пусть существует функция как в базовом классе, так и в производном классе для выполнения задачи 1. Он называется «forTask1» в базовом классе и «forTask1again» в производном классе, поэтому они не будут переопределяться.

Вызов функции «forTask1again ()», которая находится в производном классе, будет работать быстрее, чем вызов функции «forTask1 ()», как это происходит из базового класса.

<?php
  class someBaseClass
  {
  	public function forTask1($string)
  	{
  		// выполнение задания 1
  	}
  	public function forTask2( )
  	{
  		// выполнение задания 2
  	}
  }
  
  class derivedClass extends someBaseClass
  {
  	public function forTask1again($string)
  	{
  		// выполняем задачу 1 так же, как и функцию в базовом классе.
  	}
  	public function forTask3($string)
  	{
  		//выполнение задания 3
  	}
  }
   // Создание экземпляра производного класса ниже.
  $objDerivedClass = new derivedClass( ); 
  
  // Вызов ниже работает медленно для task1, так как от базового класса.
  $resultTask1 = $objDerivedClass->forTask1( );
  
  // Вызов ниже работает быстрее для task1, так как
  // он от производного класса.
  $sameResultTask1 = $objDerivedClass->forTask1again();
?>
13. Используйте JSON

Используйте JSON вместо XML во время работы с веб-службами, поскольку там есть встроенные функции php, такие как json_encode () и json_decode (), которые довольно быстрые. Если вы обязаны иметь XML-форму данных, используйте регулярное выражение для его анализа вместо манипуляций с DOM.

14. Используйте isset

Используйте isset (), где когда-либо возможно, вместо использования count (), strlen (), sizeof (), чтобы проверить, больше ли 0 возвращаемое значение. Например, предположим, что у вас есть функция, которая возвращает массив со значениями или массив NULL. Если вы хотите проверить, имеет ли возвращаемый массив значениям или нет, а затем использовать следующее:

if(isset($returnValue)){
  // Что-то здесь
}
В этом случае используйте вышеуказанный блок кода, а не следующее:

if(count($returnValue) > 0){
  // Что-то здесь
}
Ну а если вам надо ускорить скрипт на PHP, оптимизировать его, расширить функциональность, или сделать любое работы по сайтам, то вы можете написать мне. Не за бесплатно, но за весьма умеренную плату вам будет оказана быстрая и квалифицированная помощь.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, php, оптимизация php кода, тюнинг php, хитрости программирования




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.



Стек Java
Помощь программиста онлайн
Что такое IPFS?