PHP Как я могу оптимизировать скрипт?

#php #xml #optimization #xml-parsing

#php #xml #оптимизация #xml-синтаксический анализ

Вопрос:

Этот скрипт кажется мне слишком длинным. Есть ли какой-либо способ его оптимизировать?

 function delteg($string){
$keyp=0;
$out="";
   for ($i=0; $i<strlen($string); $i  ) { 
           if ($string[$i]=="<"):
             $keyp=1;
           endif;

           if ($keyp==0):
             $out.=$string[$i];
           endif;

           if ($string[$i]==">"):
             $keyp=0;
           endif;

   }
   $out = substr($out,0,strlen($out));
   return $out;
}

$time_step = array();
$datetime = array();
$G = array();
$HHii = array();
$cloud_cover = array();
$precipitation = array();
$pressure = array();
$temperature = array();
$humidity = array();
$wind_direction = array();
$wind_velocity = array();
$falls = array();
$drops = array();
$n = 0;

$handle = fopen ("http://rp5.ua/xml/257885/en", "r");
while (!feof ($handle)) {
$buffer = fgets($handle, 4096); 

 if (strpos($buffer, "country_id")>0) ($country_id[$n]=delteg($buffer)); 
 if (strpos($buffer, "point_name")>0) ($point_name[$n]=delteg($buffer));
 if (strpos($buffer, "point_name_trim")>0) ($point_name_trim[$n]=delteg($buffer)); 
 if (strpos($buffer, "point_name2")>0) ($point_name2[$n]=delteg($buffer));
 if (strpos($buffer, "point_timestamp")>0) ($point_timestamp[$n]=delteg($buffer)); 
 if (strpos($buffer, "gmt_add")>0) ($gmt_add[$n]=delteg($buffer)); 
 if (strpos($buffer, "point_date")>0) ($point_date[$n]=delteg($buffer));
 if (strpos($buffer, "point_date_time")>0) ($point_date_time[$n]=delteg($buffer)); 
 if (strpos($buffer, "time_step")>0) ($time_step[$n]=delteg($buffer)); 
 if (strpos($buffer, "datetime")>0) ($datetime[$n]=delteg($buffer));
 if (strpos($buffer, "G")>0) ($G[$n]=delteg($buffer)); 
 if (strpos($buffer, "HHii")>0) ($HHii[$n]=delteg($buffer));
 if (strpos($buffer, "cloud_cover")>0) ($cloud_cover[$n]=delteg($buffer)); 
 if (strpos($buffer, "precipitation")>0) ($precipitation[$n]=delteg($buffer));
 if (strpos($buffer, "pressure")>0) ($pressure[$n]=delteg($buffer)); 
 if (strpos($buffer, "temperature")>0) ($temperature[$n]=delteg($buffer));
 if (strpos($buffer, "humidity")>0) ($humidity[$n]=delteg($buffer)); 
 if (strpos($buffer, "wind_direction")>0) ($wind_direction[$n]=delteg($buffer));
 if (strpos($buffer, "wind_velocity")>0) ($wind_velocity[$n]=delteg($buffer)); 
 if (strpos($buffer, "falls")>0) ($falls[$n]=delteg($buffer));
 if (strpos($buffer, "drops")>0) :($drops[$n]=delteg($buffer));
   $n  ;
 endif;

}

fclose ($handle);

for ($i=0; $i<$n; $i  ) {
     echo $country_id[$i]." - ".$point_name[$i]. " etc.....";

}
  

Комментарии:

1. вместо использования оптимизации скрипта, попробуйте объяснить, для чего он используется, и какой-нибудь пример содержимого!

Ответ №1:

Определенно. Вы должны использовать анализатор XML, такой как SimpleXML.

Пример:

 $xml = simplexml_load_file("http://rp5.ua/xml/257885/en");

foreach($xml->point as $point) {
    echo 'Point: ', $point->point_name, PHP_EOL;
    foreach($point->timestep as $step) {
        echo "t Time: ", $step->datetime, PHP_EOL;
    }
}
  

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

Ответ №2:

Ну, некоторые могут сказать, используйте одинарные кавычки для строк вместо двойных кавычек, поскольку PHP будет интерполировать строку при использовании double. У Ilia есть несколько хороших методов оптимизации для общего PHP. http://ilia.ws/archives/12-PHP-Optimization-Tricks.html

С моей точки зрения, все выглядит довольно хорошо, единственное, что я хотел бы сказать, есть ли какая-либо причина, по которой вы вызываете strlen() в объявлении цикла for, потому что было бы быстрее вызвать его, один раз присвоив номер переменной и используя это в цикле for.

О да, и используйте анализатор XML, объект XML parser с некоторыми обратными вызовами будет работать, и SimpleXML тоже хорош.

Ответ №3:

С вашим скриптом много проблем. Например:

  • вы не используете анализатор XML, а просто обрабатываете его как строку (неэффективно, в основном неправильно) — используйте, например, SimpleXML,
  • в вашем коде есть много строк, которые не нужны, потому что не изменяйте результаты вашего кода — пример решения ниже,
  • напишите свой код согласованным образом (например. используйте отступы, используйте те же обозначения для условных предложений) — на самом деле не влияет на скорость выполнения, но поможет вам с сопровождением кода,

Проблема заключается, например, здесь:

 if (strpos($buffer, "country_id")>0) ($country_id[$n]=delteg($buffer)); 
 if (strpos($buffer, "point_name")>0) ($point_name[$n]=delteg($buffer));
 if (strpos($buffer, "point_name_trim")>0) ($point_name_trim[$n]=delteg($buffer)); 
 if (strpos($buffer, "point_name2")>0) ($point_name2[$n]=delteg($buffer));
 if (strpos($buffer, "point_timestamp")>0) ($point_timestamp[$n]=delteg($buffer)); 
 if (strpos($buffer, "gmt_add")>0) ($gmt_add[$n]=delteg($buffer)); 
 if (strpos($buffer, "point_date")>0) ($point_date[$n]=delteg($buffer));
 if (strpos($buffer, "point_date_time")>0) ($point_date_time[$n]=delteg($buffer)); 
 if (strpos($buffer, "time_step")>0) ($time_step[$n]=delteg($buffer)); 
 if (strpos($buffer, "datetime")>0) ($datetime[$n]=delteg($buffer));
 if (strpos($buffer, "G")>0) ($G[$n]=delteg($buffer)); 
 if (strpos($buffer, "HHii")>0) ($HHii[$n]=delteg($buffer));
 if (strpos($buffer, "cloud_cover")>0) ($cloud_cover[$n]=delteg($buffer)); 
 if (strpos($buffer, "precipitation")>0) ($precipitation[$n]=delteg($buffer));
 if (strpos($buffer, "pressure")>0) ($pressure[$n]=delteg($buffer)); 
 if (strpos($buffer, "temperature")>0) ($temperature[$n]=delteg($buffer));
 if (strpos($buffer, "humidity")>0) ($humidity[$n]=delteg($buffer)); 
 if (strpos($buffer, "wind_direction")>0) ($wind_direction[$n]=delteg($buffer));
 if (strpos($buffer, "wind_velocity")>0) ($wind_velocity[$n]=delteg($buffer)); 
 if (strpos($buffer, "falls")>0) ($falls[$n]=delteg($buffer));
 if (strpos($buffer, "drops")>0) :($drops[$n]=delteg($buffer));
   $n  ;
 endif;
  

где вам действительно нужны только первые две строки:

 if (strpos($buffer, "country_id")>0) ($country_id[$n]=delteg($buffer)); 
if (strpos($buffer, "point_name")>0) ($point_name[$n]=delteg($buffer));
  

потому что позже вы используете только значения, сгенерированные ими.