Оптимизация PHP-кода (cURL и т. Д.) - PullRequest
1 голос
/ 19 декабря 2010

Я пытаюсь оптимизировать код, который я написал. В основном у меня есть 4 части, но все четыре повторяют один и тот же код. Вот код:

$finding = $db->query_read("SELECT * FROM `servers` ORDER BY `id` ASC LIMIT 0, 30 ");
 while($row=mysqli_fetch_array($finding)){
 echo "<tr class='alt2'>";

 $whmusername = "root";
 $whmhash = $row['accesshash'];

 $query = "http://$row[ip]:2086/xml-api/loadavg";
 $curl = curl_init(); # Create Curl Object
 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); # Allow certs that do not match the domain
 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); # Allow self-signed certs
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); # Return contents of transfer on curl_exec
 $header[0] = "Authorization: WHM $whmusername:" . preg_replace("'(\r|\n)'", "",
 $whmhash); # Remove newlines from the hash
 curl_setopt($curl, CURLOPT_HTTPHEADER, $header); # Set curl header
 curl_setopt($curl, CURLOPT_URL, $query); # Set your URL
 $result = curl_exec($curl); # Execute Query, assign to $result
 if ($result == false)
 {
    error_log("curl_exec threw error \"" . curl_error($curl) . "\" for $query");
 }
 curl_close($curl);


 $root = new SimpleXMLElement($result);
 $loadavg = array((string) $root->one, 
             (string) $root->five, 
             (string) $root->fifteen);

$query = "http://$row[ip]:2086/xml-api/gethostname";                
$curl = curl_init(); # Create Curl Object
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); # Allow certs that do not match the domain
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); # Allow self-signed certs
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); # Return contents of transfer on curl_exec
$header[0] = "Authorization: WHM $whmusername:" . preg_replace("'(\r|\n)'", "",
 $whmhash); # Remove newlines from the hash
curl_setopt($curl, CURLOPT_HTTPHEADER, $header); # Set curl header
curl_setopt($curl, CURLOPT_URL, $query); # Set your URL
$hostname = curl_exec($curl); # Execute Query, assign to $result
if ($hostname == false)
{
    error_log("curl_exec threw error \"" . curl_error($curl) . "\" for $query");
}
curl_close($curl);


$root = new SimpleXMLElement($hostname);
$hostname = array((string) $root->hostname);

$query = "http://$row[ip]:2086/xml-api/listaccts";                
$curl = curl_init(); # Create Curl Object
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); # Allow certs that do not match the domain
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); # Allow self-signed certs
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); # Return contents of transfer on curl_exec
$header[0] = "Authorization: WHM $whmusername:" . preg_replace("'(\r|\n)'", "",
$whmhash); # Remove newlines from the hash
curl_setopt($curl, CURLOPT_HTTPHEADER, $header); # Set curl header
curl_setopt($curl, CURLOPT_URL, $query); # Set your URL
$acct = curl_exec($curl); # Execute Query, assign to $result
if ($acct == false)
{
    error_log("curl_exec threw error \"" . curl_error($curl) . "\" for $query");
}
curl_close($curl);

$acctcnt = new SimpleXMLElement($acct);   
$acccount = count($acctcnt->acct);          

$f1="$hostname[0]";
$f2=$row['ip'];
$f3="$loadavg[0] $loadavg[1] $loadavg[2]";
$f4 = $acccount;

Да, есть несколько повторений. Как я могу оптимизировать эту часть кода?

Ответы [ 3 ]

2 голосов
/ 19 декабря 2010

Я бы порекомендовал использовать функции для разделения вашего кода, чтобы было проще следовать.Если вам удобно, вы можете использовать объектно-ориентированную методологию, чтобы поместить ее в классы.Я бы также использовал кэш кода операции (например, APC), чтобы сохранить его, перекомпилируя код каждый раз.

1 голос
/ 19 декабря 2010

Это может быть бесполезным предложением, но я все равно добавлю его.Я бы посоветовал отказаться от cURL и попытаться использовать расширение HTTP .У него гораздо менее сложный и чрезмерно процедурный API-интерфейс, чем у библиотеки cURL (которая на самом деле является многопротокольным инструментом и просто выполняет HTTP в качестве побочной работы.)стоит просить.В частности, он предоставляет более простой HttpRequestPool API для выдачи нескольких запросов.И на этот раз проще повторно использовать код, если вы расширяете базовые классы, но написание функций-оболочек (что было бы целесообразно в вашем случае) также проще (повторное использование экземпляров объектов запроса).использует cURL, но по крайней мере вы свободны от настройки параметров на разумные значения по умолчанию.Вы не можете ничего сделать, чтобы ускорить обработку и время запроса.Но нет никакой разницы между HTTP-библиотеками в PHP в любом случае (вам не нужно использовать скомпилированные расширения для скорости).Таким образом, вы также можете легко использовать PEAR HTTP_Request2 или Zend_HTTP, которые также предоставляют гораздо более разборчивые API.

1 голос
/ 19 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...