Версия для печати темы (https://pro1c.org.ua/index.php?s=873d9fe59769921557253283b664f8e2&showtopic=3334)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Офф-топик _ немножко php

Автор: Batchir 01.04.11, 20:04

В общем пишу сейчас загрузку в инет-магазин по стандарту КомерцМЛ из 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 04.04.11, 10:11

а если попроьбовать готовый архив разбить средствами рнр(получиться новый разбитый на части)?
или таким макаром: сначала архив нужно залить на сервер во временную папку и пссле этого уже с ним работать. тогда возможно ограничения на размер файла снимутся (это ж уже локальный файл получается).
вот ссылка (там примеры и комментарии можно найти полезные): http://pro1c.org.ua/redirect.php?http://ua2.php.net/manual/en/book.zip.php

Автор: Batchir 04.04.11, 13:29

Весь финт заключался в том что бы оставить типовость выгрузки из 1С, но решил плюнуть на это и переписал кусок разбивки файла в 1С, т.е.
не разбиваю весь архив на части, а создаю N-е число архивов удовлетворяющих по размеру веб-сервер:
ХМЛ в одном архиве, картинки в другом и уже эти файлы залетают.
Столкнулся с другой проблемой, но это уже особенности движка.
PHP Fatal error: Maximum execution time of 30 seconds exceeded
Дело в том что эти картинки потом обрабатываются отдельно и срабатывает ограничение выполнения скрипта в 30 сек.
Следовательно вижу выход только в том что бы для загрузки каждой картинки посылать отдельный запроса веб серверу.

Автор: Acid 04.04.11, 14:41

я выгрузку/загрузку делаю обычным скл-запросом (как из рнр-админ примерно) UPDATE... CREATE IF NOT EXIST...
так на много проще. в таблице ведь находится ссылка на картинку, или на имя файла с картинкой (ряд вариантов есть). запустил запрос, потом картинки в нужное место залил, и все.
а если картинки хранятся непосредственно в таблице - это не есть гуд.

Автор: Batchir 04.04.11, 15:14

Цитата(Acid @ 04.04.11, 15:41) *
я выгрузку/загрузку делаю обычным скл-запросом (как из рнр-админ примерно) UPDATE... CREATE IF NOT EXIST...
так на много проще. в таблице ведь находится ссылка на картинку, или на имя файла с картинкой (ряд вариантов есть). запустил запрос, потом картинки в нужное место залил, и все.
а если картинки хранятся непосредственно в таблице - это не есть гуд.

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

З.Ы. К тому же разве можно вот так вот без проблем напрямую подключиться к майскл-у и выполнить запрос? Думаю не каждый хостинг это разрешает из-за возможных проблем с безопастностью.

Автор: Acid 04.04.11, 15:21

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

Практически на каждом нормальном хостере рнр-админ есть. Можно хоть вручную заносить данные по таблицам. Вот на моем хостинге ограничение при загрузке на размер файла (в БД) 20М. может на других хостерах и того меньше разрешают.
А преобразование картинок это да. Тогда уж кусками выгружать.

Автор: Flexy 04.04.11, 15:21

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

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

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua