1 (17.05.2013 12:42:53 отредактировано skyinfo)

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

+ открыть спойлер
<?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());

?>
Оп оп отдыхаем хорошо...

2

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

3

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

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

Оп оп отдыхаем хорошо...

4

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

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

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

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

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

 mysql_query (your_function('$string'));

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

5

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

Оп оп отдыхаем хорошо...

6 (20.05.2013 09:02:41 отредактировано marikk)

http://doc.elcat.kg/MySQL/refman-4.0-ru … -functions
Посмотрите сдесь.
По поисковикам

mysql udf

7

огромное спасибо ab

Оп оп отдыхаем хорошо...