С некоторого внешнего сервера через 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 и какой командой запихнуть туда объект целиком не заморачиваясь разбором его структуры (ну и потом также извлекать) ? Такое вообще возможно ?
Сорри про JSON я погорячился, там XML внутри переменной Типа вот такой мешанины (см. ниже) Можно это все не разбирая структуры запихнуть в одно поле базы как единый объект, а потом извлечь обратно в переменную при необходимости. Как заэкранировать чтобы ничего не поменялось и какой типа поля в mySQL лучше использовать - длина XML неизвестна, может быть любая. HTML: <answer> <error>0</error> <delivery> <code>135833991800056758</code> <delivery_date>2012-03-26</delivery_date> <deliveries_type>Обычная</deliveries_type> <from_city>Санкт-Петербург</from_city> <track_number>000000001</track_number> <to_city>Москва</to_city> <time_from>15:33</time_from> <time_to>19:33</time_to> <order_id>5555551</order_id> <metro>Бибирево</metro> <pickup_place/> <address>ул. Ленина 22-11</address> <contact_person>Василий</contact_person> <phone>2323233232</phone> <price>12000</price> <ocen_price>0</ocen_price> <additional_info>Доп. инфо!!!</additional_info> <site_name>www.site.com</site_name> <delivery_time>00:00</delivery_time> <status>Новый</status> <payment_status/> <vozvrat_status/> <comments/> <errors/> <partial_ransom>0</partial_ransom> <delivery_price_for_customer></delivery_price_for_customer> <return_shipping_documents>1</return_shipping_documents> <use_from_canceled>0</use_from_canceled> <number_of_place>1</number_of_place> <delivery_speed>normal</delivery_speed> <oplacheno_poluchatelem>0</oplacheno_poluchatelem> <voozvratov_na_summu>0</voozvratov_na_summu> <delivery_price>0</delivery_price> <main_tarif>0</main_tarif> <payment_for_ds>0</payment_for_ds> <additional_pack>0</additional_pack> <additional_weekend>0</additional_weekend> <additional_packing_list>0</additional_packing_list> <additional_mkad>0</additional_mkad> <additional_barcode>0</additional_barcode> <additional_back_region>0</additional_back_region> <additional_documentation>0</additional_documentation> <additional_partial_return>0</additional_partial_return> <additional_sms>0</additional_sms> <current_filial>Московский филиал</current_filial> <reciver_filial>Санкт-Петербург</reciver_filial> <reciver_filial_code>000000001</reciver_filial_code> <current_filial_code>000000002</current_filial_code> <delivery_partner>000000009</delivery_partner> <customer_email>test@test.com</customer_email> <barcodes> <place> <barcode>23230312000042</barcode> <weight/> </place> </barcodes> <cancel_reason/> <sms_list> <sms> <phone>84950000000</phone> <sms_status>Статус не распознан</sms_status> </sms> </sms_list> </delivery> <delivery> <code>135833991800056753</code> <delivery_date>2012-03-26</delivery_date> <deliveries_type>Обычная</deliveries_type> <from_city>Москва</from_city> <to_city>Москва</to_city> <track_number>000000001</track_number> <time_from>12:33</time_from> <time_to>18:33</time_to> <order_id>5555552</order_id> <metro>Владыкино</metro> <pickup_place/> <address>ул. Ленина 33-44</address> <contact_person>Иван</contact_person> <phone>23234534545</phone> <price>1000</price> <goods_price>0</goods_price> <additional_info>Доп. инфо new!!!</additional_info> <site_name>www.site.com</site_name> <delivery_time>00:00</delivery_time> <status>Новый</status> <payment_status/> <vozvrat_status/> <comments/> <errors/> <partial_ransom>0</partial_ransom> <delivery_price_for_customer></delivery_price_for_customer> <return_shipping_documents>1</return_shipping_documents> <use_from_canceled>0</use_from_canceled> <number_of_place>1</number_of_place> <delivery_speed>normal</delivery_speed> <oplacheno_poluchatelem>0</oplacheno_poluchatelem> <voozvratov_na_summu>0</voozvratov_na_summu> <delivery_price>0</delivery_price> <main_tarif>0</main_tarif> <payment_for_ds>0</payment_for_ds> <additional_pack>0</additional_pack> <additional_weekend>0</additional_weekend> <additional_packing_list>0</additional_packing_list> <additional_mkad>0</additional_mkad> <additional_barcode>0</additional_barcode> <additional_back_region>0</additional_back_region> <additional_documentation>0</additional_documentation> <additional_partial_return>0</additional_partial_return> <additional_sms>0</additional_sms> <current_filial>Московский филиал</current_filial> <reciver_filial>Санкт-Петербург</reciver_filial> <reciver_filial_code>000000001</reciver_filial_code> <current_filial_code>000000002</current_filial_code> <delivery_partner></delivery_partner> <customer_email>test@test.com</customer_email> <barcodes> <place> здесь для каждого места указывается штрих код и вес. <barcode>23230312000043</barcode> <weight/> </place> </barcodes> <cancel_reason/> <sms_list> <sms> <phone>84950000001</phone> <sms_status>Сообщение доставлено получателю</sms_status> </sms> </sms_list> </delivery> </deliveries> </answer>
Смысл не тянуть XML данные с другого сайта при каждом заходе на страницу (тысячи раз в день), а получить их версию один раз в день, а потом просто брать из своей базы - убрать межсайтовый тормоз измеряемый в секундах.
@anstrem, если надо хранить долго, да ещё и анализировать, то пхай в базу кож запрещает. Если кеш это кеш, то используй обычный кеш, мемкешед или редиску. Юзать БД в качестве кеша нет особого смысла, не забывай как правило сервер бд крутится на отдельной машине, иногда в отдельном здании, а иногда и в соседнем городе (шутка), гонять туда сюда трафик кеша конечно можно, но нужно ли?
Получил данные, создал файл (если он ещё не создан) с датой ( день/месяц/год ) и сохранил полученные данные. Если надо - получаешь данные с файла уже со своего сервера, разбираешь его и показываешь что нужно. Старые файлы можно удалять по крону например. Зачем тут в принципе mysql непонятно
как правило сервер mysql находится там же где и apache с php, ИМХО это стандартная конфигурация любого виртуального хоста или VPS у любого провайдера предложение выше про файлы вообще дичь, надо сохранять кучу описаний доставок в привязке к городам - создавать на каждый город свой файл, потом искать их в директории ? кто вам сказал что операция создания и открытия файла это быстро, по сравнению с заливкой чтением из mysql в уже открытой базе ? собственно сделал уже, все работает на самом деле все что мне требовалось и что искал это были две команды: Кладем в базу в MEDIUMBLOB вот эту переменную: $YourSerializedData = base64_encode(serialize($all_deliveries)); Извлекаем вот так: $all_deliveries = unserialize(base64_decode($YourSerializedData)); И все...