За последние 24 часа нас посетили 22440 программистов и 999 роботов. Сейчас ищут 672 программиста ...

А можно из MySQL сделать простенький кеш ?

Тема в разделе "MySQL", создана пользователем anstrem, 16 апр 2019.

Метки:
  1. anstrem

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

    С нами с:
    13 янв 2016
    Сообщения:
    5
    Симпатии:
    0
    С некоторого внешнего сервера через API загружаются данные об условиях доставки по городам.
    Хрен его знает в чем они там приходят (библиотеку не разбирал), подозреваю JSON.
    Короче у меня в итоге в PHP получается некий объект, у которого есть один параметр - город, ну и какое то содержание внутри (много объектов, строк, полей и букв).

    $delivery_list_request = $SL->get_deliveries_tarifs($city_to_name, $weight)
    Разбирается вся эта муть внутри вот так:
    foreach ($delivery_list_request->tarifs->tarif as $tarif) {
    $delivery = array();
    $delivery["price"] = $tarif->price->__toString();
    $delivery["tarifs_type"] = $tarif->tarifs_type->__toString();
    $delivery["srok_dostavki"] = $tarif->srok_dostavki->__toString();
    $delivery["pickup_place"] = $tarif->pickup_place->__toString();
    $delivery["address"] = $tarif->address->__toString();
    $delivery["proezd_info"] = $tarif->proezd_info->__toString();
    $delivery["phone"] = $tarif->phone->__toString();
    $delivery["worktime"] = $tarif->worktime->__toString();
    $delivery["comission_percent"] = $tarif->comission_percent->__toString();
    $delivery["is_terminal"] = $tarif->is_terminal->__toString();
    ...
    ...

    Собственно сейчас меня внутреннее содержимое $delivery_list_request вообще не интересует, мне надо его сохранять как единый объект.

    Подскажите (если это возможно), могу я сделать в mysql простую таблицу с условно двумя полями City и Delivery и запихивать туда как в кеш это $delivery_list_request , чтобы обращаться в внешнему источнику скажем раз в сутки, а в промежутках извлекать содержимое из своей базы.

    Т.е. в City собственно будет город как понятно из названия, а в Delivery будет запихиваться все содержимое $delivery_list_request - вот как оно есть внутри без разбора что это за структура и из чего состоит, одним объектом. И чтобы также одним объектом его обратно можно было прочитать и в результате в $delivery_list_request оказалось тоже самое что из него до этого было положено в базу.

    Как это реализовать по простому ? Про City все понятно, вопрос какого типа поле создать под $delivery_list_request и какой командой запихнуть туда объект целиком не заморачиваясь разбором его структуры (ну и потом также извлекать) ? Такое вообще возможно ?
     
  2. anstrem

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

    С нами с:
    13 янв 2016
    Сообщения:
    5
    Симпатии:
    0
    Сорри про JSON я погорячился, там XML внутри переменной

    Типа вот такой мешанины (см. ниже)

    Можно это все не разбирая структуры запихнуть в одно поле базы как единый объект, а потом извлечь обратно в переменную при необходимости. Как заэкранировать чтобы ничего не поменялось и какой типа поля в mySQL лучше использовать - длина XML неизвестна, может быть любая.


    HTML:
    1. <answer>
    2.    <error>0</error>
    3.      <delivery>
    4.        <code>135833991800056758</code>
    5.        <delivery_date>2012-03-26</delivery_date>
    6.        <deliveries_type>Обычная</deliveries_type>
    7.        <from_city>Санкт-Петербург</from_city>
    8.        <track_number>000000001</track_number>  
    9.        <to_city>Москва</to_city>
    10.        <time_from>15:33</time_from>
    11.        <time_to>19:33</time_to>
    12.        <order_id>5555551</order_id>
    13.        <metro>Бибирево</metro>
    14.        <pickup_place/>
    15.        <address>ул. Ленина 22-11</address>
    16.        <contact_person>Василий</contact_person>
    17.        <phone>2323233232</phone>
    18.        <price>12000</price>
    19.        <ocen_price>0</ocen_price>
    20.        <additional_info>Доп. инфо!!!</additional_info>
    21.        <site_name>www.site.com</site_name>
    22.        <delivery_time>00:00</delivery_time>
    23.        <status>Новый</status>
    24.        <payment_status/>
    25.        <vozvrat_status/>
    26.        <comments/>
    27.        <errors/>
    28.        <partial_ransom>0</partial_ransom>
    29.        <delivery_price_for_customer></delivery_price_for_customer>
    30.        <return_shipping_documents>1</return_shipping_documents>
    31.        <use_from_canceled>0</use_from_canceled>
    32.        <number_of_place>1</number_of_place>
    33.        <delivery_speed>normal</delivery_speed>
    34.        <oplacheno_poluchatelem>0</oplacheno_poluchatelem>
    35.        <voozvratov_na_summu>0</voozvratov_na_summu>
    36.        <delivery_price>0</delivery_price>
    37.        <main_tarif>0</main_tarif>
    38.        <payment_for_ds>0</payment_for_ds>
    39.        <additional_pack>0</additional_pack>
    40.        <additional_weekend>0</additional_weekend>
    41.        <additional_packing_list>0</additional_packing_list>
    42.        <additional_mkad>0</additional_mkad>
    43.        <additional_barcode>0</additional_barcode>
    44.        <additional_back_region>0</additional_back_region>
    45.        <additional_documentation>0</additional_documentation>
    46.        <additional_partial_return>0</additional_partial_return>
    47.        <additional_sms>0</additional_sms>
    48.        <current_filial>Московский филиал</current_filial>
    49.        <reciver_filial>Санкт-Петербург</reciver_filial>
    50.        <reciver_filial_code>000000001</reciver_filial_code>
    51.        <current_filial_code>000000002</current_filial_code>
    52.        <delivery_partner>000000009</delivery_partner>
    53.        <customer_email>test@test.com</customer_email>
    54.        <barcodes>
    55.          <place>
    56.            <barcode>23230312000042</barcode>
    57.            <weight/>
    58.          </place>
    59.        </barcodes>
    60.        <cancel_reason/>
    61.        <sms_list>
    62.          <sms>
    63.            <phone>84950000000</phone>
    64.            <sms_status>Статус не распознан</sms_status>
    65.          </sms>
    66.        </sms_list>
    67.      </delivery>
    68.      <delivery>
    69.        <code>135833991800056753</code>
    70.        <delivery_date>2012-03-26</delivery_date>
    71.        <deliveries_type>Обычная</deliveries_type>
    72.        <from_city>Москва</from_city>
    73.        <to_city>Москва</to_city>
    74.        <track_number>000000001</track_number>  
    75.        <time_from>12:33</time_from>
    76.        <time_to>18:33</time_to>
    77.        <order_id>5555552</order_id>
    78.        <metro>Владыкино</metro>
    79.        <pickup_place/>
    80.        <address>ул. Ленина 33-44</address>
    81.        <contact_person>Иван</contact_person>
    82.        <phone>23234534545</phone>
    83.        <price>1000</price>
    84.        <goods_price>0</goods_price>
    85.        <additional_info>Доп. инфо new!!!</additional_info>
    86.        <site_name>www.site.com</site_name>  
    87.        <delivery_time>00:00</delivery_time>
    88.        <status>Новый</status>
    89.        <payment_status/>
    90.        <vozvrat_status/>
    91.        <comments/>
    92.        <errors/>
    93.        <partial_ransom>0</partial_ransom>
    94.        <delivery_price_for_customer></delivery_price_for_customer>
    95.        <return_shipping_documents>1</return_shipping_documents>
    96.        <use_from_canceled>0</use_from_canceled>    
    97.        <number_of_place>1</number_of_place>
    98.        <delivery_speed>normal</delivery_speed>
    99.        <oplacheno_poluchatelem>0</oplacheno_poluchatelem>
    100.        <voozvratov_na_summu>0</voozvratov_na_summu>
    101.        <delivery_price>0</delivery_price>
    102.        <main_tarif>0</main_tarif>
    103.        <payment_for_ds>0</payment_for_ds>
    104.        <additional_pack>0</additional_pack>
    105.        <additional_weekend>0</additional_weekend>
    106.        <additional_packing_list>0</additional_packing_list>
    107.        <additional_mkad>0</additional_mkad>
    108.        <additional_barcode>0</additional_barcode>
    109.        <additional_back_region>0</additional_back_region>
    110.        <additional_documentation>0</additional_documentation>
    111.        <additional_partial_return>0</additional_partial_return>
    112.        <additional_sms>0</additional_sms>
    113.        <current_filial>Московский филиал</current_filial>
    114.        <reciver_filial>Санкт-Петербург</reciver_filial>
    115.        <reciver_filial_code>000000001</reciver_filial_code>
    116.        <current_filial_code>000000002</current_filial_code>
    117.        <delivery_partner></delivery_partner>
    118.        <customer_email>test@test.com</customer_email>  
    119.        <barcodes>
    120.          <place>  здесь для каждого места указывается штрих код и вес.
    121.            <barcode>23230312000043</barcode>
    122.            <weight/>
    123.          </place>
    124.        </barcodes>
    125.        <cancel_reason/>
    126.        <sms_list>
    127.          <sms>
    128.            <phone>84950000001</phone>
    129.            <sms_status>Сообщение доставлено получателю</sms_status>
    130.          </sms>
    131.        </sms_list>
    132.      </delivery>
    133.    </deliveries>
    134. </answer>
     
  3. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    А смысл?
     
  4. anstrem

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

    С нами с:
    13 янв 2016
    Сообщения:
    5
    Симпатии:
    0
    Смысл не тянуть XML данные с другого сайта при каждом заходе на страницу (тысячи раз в день), а получить их версию один раз в день, а потом просто брать из своей базы - убрать межсайтовый тормоз измеряемый в секундах.
     
  5. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @anstrem, если надо хранить долго, да ещё и анализировать, то пхай в базу кож запрещает. Если кеш это кеш, то используй обычный кеш, мемкешед или редиску.
    Юзать БД в качестве кеша нет особого смысла, не забывай как правило сервер бд крутится на отдельной машине, иногда в отдельном здании, а иногда и в соседнем городе (шутка), гонять туда сюда трафик кеша конечно можно, но нужно ли?
     
  6. lastdays

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

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    Получил данные, создал файл (если он ещё не создан) с датой ( день/месяц/год ) и сохранил полученные данные.
    Если надо - получаешь данные с файла уже со своего сервера, разбираешь его и показываешь что нужно.
    Старые файлы можно удалять по крону например.

    Зачем тут в принципе mysql непонятно
     
  7. anstrem

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

    С нами с:
    13 янв 2016
    Сообщения:
    5
    Симпатии:
    0
    как правило сервер mysql находится там же где и apache с php, ИМХО это стандартная конфигурация любого виртуального хоста или VPS у любого провайдера
    предложение выше про файлы вообще дичь, надо сохранять кучу описаний доставок в привязке к городам - создавать на каждый город свой файл, потом искать их в директории ? кто вам сказал что операция создания и открытия файла это быстро, по сравнению с заливкой чтением из mysql в уже открытой базе ?

    собственно сделал уже, все работает
    на самом деле все что мне требовалось и что искал это были две команды:

    Кладем в базу в MEDIUMBLOB вот эту переменную:
    $YourSerializedData = base64_encode(serialize($all_deliveries));
    Извлекаем вот так:
    $all_deliveries = unserialize(base64_decode($YourSerializedData));
    И все...