0
- 17.04.2015 - 09:07
|
Закачивается прайс-лист с помощью curl и выполняется скрипт, который из csv закачивает прайс-лист в mysql, но т.к. число строк в прайсе большое, то получаю "Maximum execution time of 10 seconds exceeded in..." Это настраивать сервер чтобы ждал дольше или есть способ изменить процедуру закачки в корне? Например не через curl, а с помошью cron, но в таком подходе мне не нравится рассогласование по времени (что-то одно закачивает файл, скрон потом должен запуститься в тот момент, когда файл уже на сервере). В общем прошу поправить меня, где я ошибаюсь или может быть выбрал неверный подход. | | |
1
- 17.04.2015 - 09:13
| Всё-таки уточню. Настроить сервер чтобы ждал дольше это не проблема, но больше интересует как решается задача закачки больших объемов данных. | | |
2
- 17.04.2015 - 09:44
| Закачивают пачками, например по 1000 строк. | | |
3
- 17.04.2015 - 10:55
| +1 Задача норм решается например через строго последовательные асинхронные AJAX запросы к серверу. | | |
4
- 17.04.2015 - 11:43
|
Поможет set_time_limit(0); если не хочется загружать сильно сервер, то можно между циклами добавить паузу sleep ( 5 ); | | |
5
- 17.04.2015 - 22:46
|
0-Leshgan >А с помощью FTP залить прайс на Сервак НЕЗЯЯ? Тогда просто грузи через Форму: <form name="update" method="post" action="index.php?admin=update" enctype="multipart/form-data"> Обновить прайс:<input name="userfile" size=50 type="file" /> <input type="submit" value="Загрузить" /> </form> А дальше PHP: <?php if($_GET['admin']=='update')** if(file_exists($_FILES['userfile']['tmp_name']))** Обработка файла Прайса !!! ** ** ?> Ну вообщем куда и что вставлять сами разберетесь - пример рабочий, прайсы обрабатываются заливаются Спокойно! Причем прямо из Excel прайса в 35000 строк 18 метров! Проверенно МИН НЕТ! | | |
6
- 18.04.2015 - 00:20
|
1-Leshgan > уточни условия задачи, а то не понятно, может для вас 20мб тоже большие данные. Но поскольку это пхп тут пишут разные варианты http://joomlaforum.ru/index.php/topic,36283.0.html | | |
7
- 18.04.2015 - 00:44
|
5-AlexIT >читайте внимательнее вопрос 6-40KHYTbIU >задача - грузить в mysql --- пачками надо, сохранять номер последней обработанной строки и продолжать с нее, при этом использовать защиту от дублирования на всякий случай. Скрипт из браузера запускается? Можно просто выводить мета рефреш, а последние строки (номер) хранить в сессиях, или передавать в get. Если из ssh запускается, ограничение не должно срабатывать. | | |
8
- 18.04.2015 - 10:27
|
7-Фанат NASCAR >Так я Вам про что и говорю? Про Загрузку из Прайса в базу MySQL! Причем ВСЕГО прайса сразу! Сначала загружается весь файл - Стандартной процедурой Формы HTML из Браузера. А затем PHP проходит по строкам прайса и Заливает их в Базу. Никаких проблем с таймаутами НЕ БЫЛО. Скорей всего Вы что то Перемудрили! | | |
9
- 18.04.2015 - 12:09
| 8-AlexIT >я? Я не топикстартер. Вы просто с объемами не сталкивались. А я сталкивался, когда база уже в mysql 40гб весит, и импорт всю ночь шел) | | |
10
- 18.04.2015 - 12:10
| Ключевое тут - формировать запрос пачками, исполнять пачку, брать следующую и тд | | |
11
- 18.04.2015 - 13:17
|
7-Фанат NASCAR > кэп с нами! Автор, чтобы не городить "правильное" решение в вашем маленьком интернет магазине, но не увеличивать продолжительность жизни скрипта при каждом чихе, есть вы на стороне сервера можете исполнять команды и там линух, то вот пример распиливания split -l 1000 book.txt new Потом заливаете каждый файл подотдельности, можно даже параллельно если мускул позволит. | | |
12
- 18.04.2015 - 13:32
|
10-Фанат NASCAR >Я тебе в личку уже кинул Демку! Когда база 40 гиГ - глупо ее обновлять одним файлом! Всегда можно разбить на ПОДРОЗДЕЛЫ например по категориям товара это РАЗ! 2) Если ты файл в 40 гиг кидаеш на Сервер - тогда таймаут тут не причем! Ты спросил у Сервера он может его принять? И если сервер даже согласен такого монстра принять - спроси свой канал Интернета, а сможет ли он его ПЕРЕДАТЬ! Недавно был такой случай - Человек с работы не смог обновить на сайте прайс в 12 метров. А из дома тотже прайс обновил Спокойно за 5 сек! Вопрос кто ТУПИТ Сервак, Человек или Админ на работе? | | |
13
- 18.04.2015 - 13:59
|
И к стати, если файл уж такой НЕПОДЪЕМНЫЙ - лучше его лить по FTP, а потом его обрабатывать. Как это делает 1Ска с Битрексом! | | |
14
- 18.04.2015 - 17:34
|
13-AlexIT >поясню еще раз. У автора проблемы не с доставкой файла на сервер, а с конвертацией его содержимого, с импортом в mysql. Вопрос "как залить файл на сервер" не стоит. | | |
15
- 18.04.2015 - 17:35
|
Правильно - не разбивать на "подрОзделы", надеясь на то, что превышения не будет. Правильно - построить алгоритм формирования запросов "пачками", и перезапуск скрипта с новыми данными. | | |
16
- 18.04.2015 - 19:19
|
15-Фанат NASCAR >А Вы уверенны что проблема не в ЗАЛИВКЕ? Любой обработчик из файла обновляет базу по Строкам! Другого алгоритма пока еще не придумано! так как в MySQL оператор UPDATE конечно может выполнить обновление нескольких строк БАЗЫ если ему задать параметр WHERE id<10 но это для ГУРМАНОВ. А для обычных людей WHERE id=10. А оператор INSERT вообще вставляет только 1 строку без всякого id! | | |
17
- 19.04.2015 - 02:02
| ![]() | | |
18
- 19.04.2015 - 14:01
| простите) | | |
19
- 20.04.2015 - 09:11
|
Очень тронут такими дебатами, спасибо. В споре рождается истина :) Цитата:
залить можно было и по FTP как Вы советовали, это вообще не проблема. И заливаю я так же как Вы посоветовали в №5, только вызываю форму curl'ом. Вот только у меня не 35тыс записей, а 90. На 35 тоже не было проблем. Вообще-то он успевает даже все 90 залить в базу, но вываливает таймаут. Это не надежно, поэтому отказался от этого изврата. А городить разбивку в моем случае или писать что-то еще более сложное нет смысла. В общем было принято решение заливки прайса на сервер по FTP и дальнейшая его обработка по крону. В этом случае есть шанс закачать в базу старый прайс (если вдруг заливка на сервер сбойнула). Но это не столь критичный момент. Можно сделать анализ даты/времени создания файла и слать на почту уведомление, если дата/время не поменялись. Как-то так. | | |
20
- 20.04.2015 - 21:44
|
19-Leshgan >да сделайте простейшие пачки, по тому же крону. Вариантов масса, просто сохраняйте в файл обработанный номер строки, и прыгайте от него + 10000строк построчно, если не еоф. И формируйте запрос. Запрос исполнили, новую строку сохранили, вызвали php -f self асинхронно и умерли | | |
21
- 20.04.2015 - 21:54
| А перед стартом можно проверку на себя запущенного делать, $r=exec('ps ax | grep script.php') и смотреть вывод | | |
22
- 21.04.2015 - 10:38
| 20-Фанат NASCAR > зачем пачки, если запуск скрипта на сервере (на хостинге) не имеет ограничений по времени? Просто запустить то, что уже есть и пусть пашет хоть 10 минут (сейчас из браузера работает около 4-5 минут) | | |
23
- 21.04.2015 - 11:25
| wget, парсинг в оффлане... | | |
24
- 23.04.2015 - 23:06
| 22-Leshgan >потому что дальше потребуется полчаса, час, и в итоге придется собирать данные по кускам после каждого косяка. Работу надо делать хорошо и правильно. | | |
25
- 24.04.2015 - 13:01
| Смешно :) А если строго последовательные, то почему асинхронные? | | |
26
- 24.04.2015 - 13:22
| 25-zorg >чтобы не завешивать вызывалку. | | |
27
- 28.04.2015 - 11:04
|
Ребята (что почти всех касается), вы почитайте пожалуйста документацию к MySQL. Там есть функция быстрой загрузки данных из csv. Причем работает она реально быстро. У меня 800к записей загрузились за 20-30 сек. Для сравнения INSERT на этой БД выполнялись со скоростью 100-140 записей/мин. Не хочу переходить на личности, но советую особо отличившемуся (и даже прописавшему IT в своем нике) прочитать таки документацию... Грамотно эта задача решается так: прайс переводят в csv, заливают на сайт (можно даже через http, но правильнее через ssh), затем или из консоли запускается апдейт или CGI скрипт форком осуществляет заливку базы. | | |
28
- 28.04.2015 - 11:34
|
27-1isadmin > LOAD DATA INFILE? Это хорошо, наверное, когда у вас данные один к одному и не требуется никакой предобработки и проверки. | | |
29
- 28.04.2015 - 12:18
| 28-40KHYTbIU >именно так. На практике - поиск дублей, различий в данных и только потом обновление или вставка. | | |
30
- 25.05.2015 - 14:51
|
28-40KHYTbIU > хорошая штука этот LOAD DATA INFILE. Спасибо 27-1isadmin А вот на счет то я бы данные загонял в темповую таблицу. Но пока меня устраивает работа скрипта по крону на хостинге. Работает себе как часы. | |
![]() | Интернет-форум Краснодарского края и Краснодара |