LinuxForum.Fans
Тема

Оптимизация кода [PHP]

Автор: skyinfo 7 сообщений 3483 просмотров
#320865

Нагромоздил код))) грузит проц. на 100% , обрабатывает 25-30 тыс. строк за 1-1.5 часа.
Встал вопрос как оптимизировать код, с чего начать на что обратить внимание? буду благодарен любым советам.
Писать на связке php + mysql начал не давно....так что сильно не ругайте (за не структурированость и т.д.), код под спойлером.

Показать
text
<?php
error_reporting (-1);
set_time_limit (130);
require_once ('excel/excel_reader2.php');
require_once ('config_db.php');
$image = "data/new.png";
$dataupdate = date("Y-m-d");
$dataupdate1 = date("Y-m-d H:i:s");
$location = "xp";
$location1 = "xp1";
$margin = "0.30";
$roundish = "10";
$data = new Spreadsheet_Excel_Reader("price.xls",false,"UTF-8");
$data->setOutputEncoding('UTF-8');
//$data->read('price.xls');
//print_r($data);
mysql_connect($db_table_host, $db_user_name, $db_user_pass) or die("Не удалось подключиться к БД");
mysql_select_db($db_table_name) or die("Не удалось подключиться к Базе");
@mysql_query('set character_set_client="utf8"');
@mysql_query('set character_set_results="utf8"');
@mysql_query('set collation_connection="utf8_general_ci"');

$sql = "UPDATE av_product SET quantity = 0 WHERE location = '".mysql_real_escape_string($location)."'"; mysql_query($sql) or die('Ошибка запроса: ' . mysql_error()); $sql = "UPDATE av_product SET quantity = 0 WHERE location = '".mysql_real_escape_string($location1)."'"; mysql_query($sql) or die('Ошибка запроса: ' . mysql_error());

$cur_i = 0; for ($i = 1; $i <= $data->sheets[1]['numRows']; $i++) { if($data->sheets[1]['cells'][$i][8] != ""){ if($cur_i == 0){ $cur_i++; }else{ $sql = "SELECT * FROM av_product WHERE sku = '".$data->sheets[1]['cells'][$i][2]."'"; $cur_product_query = mysql_query($sql) or die('Query failed: ' . mysql_error()); $cur_product = mysql_fetch_array($cur_product_query); if(!is_numeric(trim($data->sheets[1]['cells'][$i][8]))) $product_count = 5; else $product_count = $data->sheets[1]['cells'][$i][8]; if($cur_product['sku'] != ""){

// обновляем товар $sql = "UPDATE av_product SET sku = '".$data->sheets[1]['cells'][$i][2]."', quantity = '".$product_count."', date_available = '".$dataupdate."', cost = '".$data->sheets[1]['cells'][$i][7]."' WHERE sku = '".$data->sheets[1]['cells'][$i][2]."'"; mysql_query($sql) or die('Ошибка запроса: ' . mysql_error());

}else{ $sql = "INSERT INTO av_product (sku, location, cost, quantity, image, date_available, date_added, margin, roundish) VALUES ('".$data->sheets[1]['cells'][$i][2]."', '".mysql_real_escape_string($location1)."', '".$data->sheets[1]['cells'][$i][7]."', '".$product_count."', '".$image."', '".$dataupdate."', '".$dataupdate1."', '".$margin."', '".$roundish."')"; mysql_query($sql) or die('Ошибка запроса: ' . mysql_error());

$last_id = mysql_insert_id();

$sql = "INSERT INTO av_product_description (product_id, language_id, name) VALUES ('".$last_id."', 1, '".mysql_real_escape_string($data->sheets[1]['cells'][$i][4])."')"; mysql_query($sql) or die('Ошибка запроса: ' . mysql_error());

//Ровняем seourl $seo = mysql_insert_id(); $query = "product_id=$seo"; $keyword = $seo; $sql = "INSERT INTO av_url_alias (query, keyword) VALUES ('".$query."', '".$keyword."')"; mysql_query($sql) or die('Ошибка запроса: ' . mysql_error());

} }

} } //Ровняем model = product_id $sql = "UPDATE av_product SET model = product_id"; mysql_query($sql) or die('Ошибка запроса: ' . mysql_error());

//Если товар "xp1" и кол-во больше нуля, то включаем товар на сайте. $sql = "UPDATE av_product SET status = 1 WHERE location = '".mysql_real_escape_string($location1)."' AND quantity > 0"; mysql_query($sql) or die('Ошибка запроса: ' . mysql_error());

//Если товар "xp1" и кол-во меньше нуля, то отключаем товар на сайте." $sql = "UPDATE av_product SET status = 0 WHERE location = '".mysql_real_escape_string($location1)."' AND quantity = 0"; mysql_query($sql) or die('Ошибка запроса: ' . mysql_error());

?>

#320934

Если можно опишите код. Какую задачу он выполняет ?

#320935

1. Перед стартом, обнуляем кол-во quantity, если $location = "xp"; или $location1 = "xp1"; если нет, то не трогаем.
2. Читаем построчно exel файл, если нашли в базе равный sku.
3. Если нашли, то обновляем.
4. Если прочитали, и не нашли, то добавляем новую запись.

Зы. если в двух словах, читаю прайс, сравниваю с базой, если есть - обновляю, если нет - добавляю. Плюс в конце, если кол-во = 0 - отключаем, если >0 включаем. Сделано, это потому, что локейшен может быть xp2, xp3, x4...

#320939

Мое предложение.

Создать в mysq функцию которая принимает вашу строку.

Функция выполняет следующее


если нашли в базе равный sku.
3. Если нашли, то обновляем.
4. Если прочитали, и не нашли, то добавляем новую запись.

А в своей программе вы просто читаете построчно файл и вызываете мускульную функцию.

text
 mysql_query (your_function('$string'));

Я конечно не профессионал в этом деле. Но по своему скромному опыту программирования скажу, что так не только быстрее но и правильнее.

#321126

с ориентируйте, может примеры какие нить или ссылки?

#321155

огромное спасибо :)

Войдите или зарегистрируйтесь, чтобы ответить.