Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: немножко php
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Общий раздел > Офф-топик
Batchir
В общем пишу сейчас загрузку в инет-магазин по стандарту КомерцМЛ из 1С.
Выгрузку беру стандартную (от битрикса), загрузку пишу свою, точнее дорабатываю то что удалось найти.
Сейчас с демо базой нормально работает, загружается номенклатура, цены, свойства, картинки, но когда перешел на тестирование выгрузки загрузки данных из основной БД, то файлик оказался большим и веб сервер отказался его грузить.
Сделал разбивку архива на части - эти части благополучно загрузились на сервер, но опять заткнулся - не получается собрать воедино части архива.
Когда отключаю выгрузку картинок, то тоже номально загружается (получается один полноценный архив). Вобщем дело в картинках - их много и занимают много места.
Выгружать отдельно картинки не совсем вариант, т.к. хочется оставить типовый механизм выгрузки данных на сайт.

Вобщем вот функция которая у меня делает разархивацию, если кто подскажет как можно собрать части архива на php буду благодарен
$file - файл который нужно разархивировать
$folder - каталог где лежит файл
function unzip($file,$folder=''){
    $zip = zip_open($folder.$file);
    $files = 0;
    $folders = 0;

    if ($zip) {
        while ($zip_entry = zip_read($zip)) {


            $name = $folder . zip_entry_name($zip_entry);

            $path_parts = pathinfo($name);
            # Создем отсутствующие директории
            if(!is_dir($path_parts['dirname']))
            {
                mkdir($path_parts['dirname'], 0755, true);
            }


            if (zip_entry_open($zip, $zip_entry, "r")) {
                $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));

                $file = fopen($name, "wb");
                if ($file) {
                    fwrite($file, $buf);
                    fclose($file);
                    $files++;
                } else {

                }
                zip_entry_close($zip_entry);
            }
        }
        zip_close($zip);
    } else {

    }
}


Когда идет загрузка архива по частям , то ругается на
while ($zip_entry = zip_read($zip)) {
Ошибка следующая
PHP Warning: zip_read() expects parameter 1 to be resource, integer given in /home/...../connect.php on line ....
Acid
а если попроьбовать готовый архив разбить средствами рнр(получиться новый разбитый на части)?
или таким макаром: сначала архив нужно залить на сервер во временную папку и пссле этого уже с ним работать. тогда возможно ограничения на размер файла снимутся (это ж уже локальный файл получается).
вот ссылка (там примеры и комментарии можно найти полезные): необходимо зарегистрироваться для просмотра ссылки
Batchir
Весь финт заключался в том что бы оставить типовость выгрузки из 1С, но решил плюнуть на это и переписал кусок разбивки файла в 1С, т.е.
не разбиваю весь архив на части, а создаю N-е число архивов удовлетворяющих по размеру веб-сервер:
ХМЛ в одном архиве, картинки в другом и уже эти файлы залетают.
Столкнулся с другой проблемой, но это уже особенности движка.
PHP Fatal error: Maximum execution time of 30 seconds exceeded
Дело в том что эти картинки потом обрабатываются отдельно и срабатывает ограничение выполнения скрипта в 30 сек.
Следовательно вижу выход только в том что бы для загрузки каждой картинки посылать отдельный запроса веб серверу.
Acid
я выгрузку/загрузку делаю обычным скл-запросом (как из рнр-админ примерно) UPDATE... CREATE IF NOT EXIST...
так на много проще. в таблице ведь находится ссылка на картинку, или на имя файла с картинкой (ряд вариантов есть). запустил запрос, потом картинки в нужное место залил, и все.
а если картинки хранятся непосредственно в таблице - это не есть гуд.
Batchir
Цитата(Acid @ 04.04.11, 15:41) необходимо зарегистрироваться для просмотра ссылки
я выгрузку/загрузку делаю обычным скл-запросом (как из рнр-админ примерно) UPDATE... CREATE IF NOT EXIST...
так на много проще. в таблице ведь находится ссылка на картинку, или на имя файла с картинкой (ряд вариантов есть). запустил запрос, потом картинки в нужное место залил, и все.
а если картинки хранятся непосредственно в таблице - это не есть гуд.

Да не в этом проблема вся инфа без картинок с сылками залетает на ура. Просто движок умеет конвертить картинки в разные размеры что бы выводить их красиво в разных местах. Если кидать неотформатированную фотку, то некрасиво получается.
так вот тут и проблема. Я тестирую выгрузку 5000 наименований, пока 500 картинок.
и движок одним махом пытается эти 500 картинок преобразовать в 3000 (получается 6 картинок разного размера из 1).
Вот тут и происходит затык. Уж сильно долгая это операция. Если бы 1С умела так конвертить картинки, то конечно я бы сначала всё подготовил и просто залил.
А так приходится мудрить, т.е. для каждой картинки запускать преобразование отдельным запросом.

З.Ы. К тому же разве можно вот так вот без проблем напрямую подключиться к майскл-у и выполнить запрос? Думаю не каждый хостинг это разрешает из-за возможных проблем с безопастностью.
Acid
Цитата(Batchir @ 04.04.11, 17:14) необходимо зарегистрироваться для просмотра ссылки
З.Ы. К тому же разве можно вот так вот без проблем напрямую подключиться в майскл-у и выполнить запрос? Думаю не каждый хостинг это разрешает из-за возможных проблем с безопастностью.

Практически на каждом нормальном хостере рнр-админ есть. Можно хоть вручную заносить данные по таблицам. Вот на моем хостинге ограничение при загрузке на размер файла (в БД) 20М. может на других хостерах и того меньше разрешают.
А преобразование картинок это да. Тогда уж кусками выгружать.
Flexy
Цитата(Batchir @ 04.04.11, 15:14) необходимо зарегистрироваться для просмотра ссылки
З.Ы. К тому же разве можно вот так вот без проблем напрямую подключиться к майскл-у и выполнить запрос? Думаю не каждый хостинг это разрешает из-за возможных проблем с безопастностью.

Можно попробовать залить уже готовый скрипт с нужным запросом на хостинг.А потом уже через админку MySql-я его выполнить.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.