За последние 24 часа нас посетили 24622 программиста и 1695 роботов. Сейчас ищет 801 программист ...

Запись в БД кусками

Тема в разделе "MySQL", создана пользователем Freakmeister, 20 июл 2015.

  1. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Это реально? Столкнулся тут с корпоративными масштабами ответов от сервера. С сервера приходит текст размером ~2мб. В БД он не пишется, я получаю ошибку:

    Код (Text):
    1. Got a packet bigger than 'max_allowed_packet' bytes
    Можно как-то разбить INSERT на курски и записать эту строку циклом?

    //add

    Помогла PHP-функция str_split и MySQL-функция CONCAT.

    Код (PHP):
    1. // предварительная запись
    2. mysql_query("INSERT INTO `wp_loans_users_ki` SET `text`='', `worker`='$worker', user_id='{$row['id']}', `date`=UTC_TIMESTAMP()");
    3. $error = mysql_error();
    4. if ($error) {
    5.     echo 'MF-ERROR #7: '.$error;
    6.     die;
    7. }
    8. $id = mysql_insert_id();
    9.  
    10. // кодируем и пишем ответ в БД, ничего не обрезая
    11. $return = base64_encode($return);
    12. echo $return;
    13. // пишем кусками, потому что слишком длинный ответ может не влезть
    14. $return_split = str_split($return, 100000);
    15. foreach ($return_split as $key => $value) {
    16.     $value = mysql_real_escape_string($value);
    17.     mysql_query("UPDATE `wp_loans_users_ki` SET `text`=CONCAT(`text`, '$value') WHERE `id`=$id");
    18.     $error = mysql_error();
    19.     if ($error) {
    20.         mysql_query("DELETE FROM `wp_loans_users_ki` WHERE `id`=$id");
    21.         // TODO: запись $return в файл
    22.         echo 'MF-ERROR #7: '.$error;
    23.         die;
    24.     }
    25. }
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    А не лучше было MySQL настроить?
     
  3. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Хостинг... Думал, что решил проблему, ан нет. Данные обрываются при записи где-то на 10%. Я пишу в поле типа TEXT кстати, мб это не правильно, надо глянуть что там у него по максимальному значению.

    Добавлено спустя 51 минуту 51 секунду:
    Да, в LONGTEXT пишется целиком, но иногда PHP-скрипт обрывается из-за лимита по времени 30 сек.)) Даже не представляю как это можно пофиксить, кроме как сменой хостинга на VDS.
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    2 мб ответа??? А что сервер тебе возвращает?
    Может плохой вариант, но все же как костыль, может сохранять ответ в файл а путь хранить в базе? Или поиск по ответам делать надо будет?
     
  5. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Поиск по ответам делать не надо, там приходит XML, но он с крюказябрами. Так что, в файл оно криво сохраняется. Отрезать крюказябры у меня ручки трясутся, можно отрезать лишнего. Поэтому пишу в БД оригинальный ответ сервера, а отрезаю уже при выводе.

    [​IMG]
    [​IMG]
     
  6. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Эммм... какая разница куда ты сохранишь, в файл или базу? o_O В базе без кракозябр? o_O
    Может кракозябры потому что кодировка не та???
     
  7. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Хз почему, но файл потом открывается в нечитаемом виде. Может потому что там адовый набор кодировок. А запись в файл разве даст какие-то преимущества? Я же так в post_max_size какой-нибудь упрусь всё-равно.
     
  8. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Сделай читаемым. Ты же из базы когда берешь потом отображаешь нормально.

    А тебе часто требуется отображать ответ?
    А так размер базы будет расти. Селекты быстро работают?
    Дефолтное значение 8мб.
     
  9. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Постоянно, по многу раз и в несколько потоков. Эти XML это кредитная история заёмщиков, она должна выводиться при открытии их профилей. И вот сидят десятка два сотрудников и постоянно сёрфят эти профили.

    З.Ы. По поводу php.ini, мне техподдержка хостинга говорит, что я могу менять опции в .htaccess, они это не залочили. Мне этого будет достаточно, как считаете?

    Код (PHP):
    1. php_value upload_max_filesize 128M
    2. php_value post_max_size 256M
    3. php_value memory_limit 256M
    4. php_value max_execution_time 120