Jump to content
Sign in to follow this  
C0DENAMED

Помогите оптимизировать запрос

Recommended Posts

Доброе %время_суток%!
Занимаюсь разработкой php модуля. Нужно сделать скрипт который с помощью SOAP клиента и API вытаскивает данные от товарах, а затем поместить их в БД магазина. Проблема в том, что написанный мной скрипт не может уложиться во времени, так как затрачивает слишком много ресурсов сервера и выдает ошибки 502 или просто обрывается.
Судя по всему хостинг просто сбрасывает его. Было решено импортировать данные по таблицам, а потом склеить это в несколько .sql пакетов для импортирования через phpMyAdmin. По сути размер одной таблицы не так уж велик - около 8-10мб. Вот код скрипта. Как можно это реализовать? Проблема номер 2 это то, что есть еще более жирные таблицы.
Делаю обыкновенный bulk insert. И вывод на экран. Доходит где-то до 7-8мб и прерывается не завешившись до конца. Можно ли как-то оптимизировать скрипт?

Код:

$client = new SoapClient($wsdl_url, $params);
$category = $client->getCatalog(ALL);

echo "INSERT INTO `oc_product` (`product_id`, `model`, `sku`, `upc`, `ean`, `jan`, `isbn`, `mpn`, `location`, `quantity`, `stock_status_id`, `image`, `manufacturer_id`, `shipping`, `price`, `points`, `tax_class_id`, `date_available`, `weight`, `weight_class_id`, `length`, `width`, `height`, `length_class_id`, `subtract`, `minimum`, `sort_order`, `status`, `date_added`, `date_modified`, `viewed`) VALUES"."<br>";

foreach ($category as $row) {

    if ($row->ID == D1 OR $row->ID == E1 OR $row->ID == L1 OR $row->ID == P1 OR $row->ID == Y1) {
        continue;
    }
    else {
       $cat = $client->getItems($row->ID);
       foreach ($cat as $row) {
          echo "('". $row->No ."', '', '', '', '', '', '', '', '', 1, 7, NULL, 2, 1, '1.0000', 0, 9, '0000-00-00', '". $row->Weight ."', 0, '0.00000000', '0.00000000', '0.00000000', 1, 1, 1, 0, 1, 'NOW()', 'NOW()', 0),"."<br>";
       }
    }
}
echo ';';

Share this post


Link to post
Share on other sites

Моё мнение - нужно разбить на две части. 

Первая будет отвечать за получение данных от сайта и например сохранять их в файл, вторая будет заносить данные из файла в базу.

При больших объёмах информации работает отлично. 

 

Напишите мне в скайп, возможно быстрее помогу

Share this post


Link to post
Share on other sites

Моё мнение - нужно разбить на две части. 

Первая будет отвечать за получение данных от сайта и например сохранять их в файл, вторая будет заносить данные из файла в базу.

При больших объёмах информации работает отлично. 

 

Напишите мне в скайп, возможно быстрее помогу

Делайте INSERT DELAYED, думаю это будет быстрее, чем сохранять в промежуточные файлы и всякие SQL-пакеты.

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

Сколько уже добавлено можно вычислять через mysql_affected_rows() и хранить в сессии.

Гоняйте скрипт по кругу, например при помощи Ajax.

У вас узкое место не в SQL-запросах, а в скорости работы SOAP-сервиса.

Share this post


Link to post
Share on other sites

На самом деле автор вопроса уже сам практически разобрался.

Проблемным местом было

$category = $client->getCatalog(ALL);

Ждём завтра от него новостей и результатов

Share this post


Link to post
Share on other sites

Да была проблема в этом и ограничении скриптов по времени на хостинге.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.