Перейти к содержанию
C0DENAMED

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

Рекомендуемые сообщения

Доброе %время_суток%!
Занимаюсь разработкой 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 ';';

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.