17 апреля 2006 г.

Немного программизма: PHP и файлы CSV

Пришлось тут решать одну небольшую задачу, переносить номенклатуру товаров в несколько баз данных, а именно добавлять сразу много (порядка 100 тыс. позиций) в магазин, построенный на Bitrix и в магазин, построенный на Script-Shop.

Для начала, чтоб не делать одну работу дважды, организовал некую базу, из которой решил сделать экспорт в форматы для каждой из систем.

Ну, про ограничение в 65535 строк в одном листе Microsoft Excel я заранее был в курсе, неожиданностью для меня это не стало.

Максимально увеличил в php параметр выполнения скрипта, чтобы браузер не отваливался по таймауту и, совершенно неожиданно, наступил на интересные детские грабли. Каждый раз при выполнении функции fgetcsv запрашивается новый кусок памяти, причем использовать предыдущий совершенно невозможно. Т.е. в зависимости от настроек сервера и PHP, скрипт по импорту падает из-за нехватки памяти после обработки 10 или 20 тыс. строк.

Дальнейший тюнинг параметров PHP в плане увеличения доступной скрипту памяти оказался не очень эффективным, объем информациив дальнейшем может только возрастать. После консультаций на форуме PHPClub'а пришлось-таки переписать скрипт импорта.

Теперь в цикле отслеживается объем памяти, как только свободной остается совсем мало, скрипт перезапускается, в параметре ему передается номер строки, на который произошел останов... Заодно удалось избавиться от шаманства с max_execution_time и присобачить забавный индикатор выполнения (стащил, кстати, с blogspot :) ).

Что делать с частями кода у Bitrix и Shop-Script, которые будут получать на вход похожие объемы данных не смотрел еще пока.

У Bitrix попроще в смысле, что скрипт, отвечающий за импорт, может запускаться по cron'у, т.е. переделки там будут, но минимальные. Напишу на bash оболочку какую-нибудь и придумаю какой-нибудь флаг. А вот Shop-Script'у придется такую же вещь, наверное, изготовить самостоятельно - никаких заданий по cron'у у него не предусмотрено :(

В принципе, еще надо аналогичную штуку для Joomla/VirtueMart, но там в и в коде сам черт ногу сломит. Подождем более приличных версий.

CommerceML: жаль, только двое из этих трех скриптов понимают, да и спецификация этого CML недавно слегка поменялась. Можно было бы по-модному обмен данными организовать. Да и объем передаваемых данных при использовании любого xML явно будет больше, чем при использовании CSV. А оно и в настоящем виде более 6M получается.

Что-то под утро посты какие-то сумбурные, блин.