Intereting Posts
Как может быть условный тег шаблона на основе основного цикла во вторичном цикле с новым WP_Query (), используя get_template_part () Условные аргументы для WP_Query и tax_query в зависимости от того, имеет ли значение $ somevar значение Добавление вывода запятой в while wpquery Вставка кода в HTML-представление из всплывающего окна, инициированного с визуального представления Помогите диагностировать запланированную проблему с post_post_status WordPress в подкаталоге, Multisite с использованием поддоменов Nginx Вложенные инструкции if для эха только одной строки на основе того, какой тег был отфильтрован? Предел меню, не может добавлять новые пункты меню Почему WordPress требует времени, чтобы отправить запрос на сохранение сообщения? OpenID для WordPress 3.x? Можно ли импортировать все файлы из загружаемого DIR в WP media, сохраняя пути к файлам Изменение виджетов WordPress Как определить базовый путь wordpress, когда ядро ​​wordpress не загружено Как добавить сообщение из пользовательского типа сообщения в качестве статической страницы? Есть ли способ внедрить форму Документов Google на странице без использования плагинов?

Рекомендации по использованию переходного API

Недавно я встретил API Transients в WordPress в надежде улучшить производительность плагина, который я пытаюсь написать.

В основном плагин хранит информацию о продукте из API рекламы продукта amazon в базе данных. Сведения о продукте хранятся с использованием json-кодированного представления массива.

Теперь я пытаюсь использовать API переходных процессов, чтобы всякий раз, когда администратор чистил записи базы данных, он также обновляется с использованием API переходных процессов.

То, что я сейчас делаю, это сохранение json-кодированного значения с использованием метода set_transient . Что-то вроде этого:

 $data = array( '123' => "{'title' : '', 'price' : '', 'brand' : ''}" '456' => ... ); $value = json_encode($data); set_transient('amazon_items', $value, 60 * 60); 

И затем я получаю это оттуда, используя get_transient

 $asin = '123'; $data = json_decode(get_transient('amazon_items'), true); print_r($data[$asin]); 

Это нормально или я должен просто хранить его в форме массива, поэтому я могу просто получить к нему доступ без использования json_decode ? Является ли мой вариант использования приемлемым или он чрезмерен? Могу ли я еще улучшить это? Существует ли конкретный предел того, сколько данных я могу хранить с помощью API переходных процессов? В этом конкретном случае использования я ожидаю, что это будет более 50 МБ данных.

Это нормально или я должен просто хранить его в форме массива, поэтому я могу просто получить к нему доступ без использования json_decode?

В вашем хранилище это означает, что он хранит сериализацию . Поскольку $data является массивом и не может быть сохранен как есть, но преобразован в строку.

Даже если вы обращаетесь к нему напрямую, как:

 $data = get_transient('amazon_items'); print_r( $data[0] ); 

функция get_transient значение за кулисами (подобно сериализации set_transient за кулисами), используя функцию WP maybe_unserialze которая использует функцию serialize php.

Поэтому, используя json_encode / json_decode или используя стандартный метод php-serialize, есть некоторые отличия, но производительность почти одинакова. Люди, которые сделали тесты, говорят, что json_encode немного быстрее.

Метод, который вы должны выбрать, зависит от того, что вы делаете с данными: если вы планируете манипулировать им с помощью js (или даже с другими языками, чем php), то правильный выбор – это, скорее всего, json.

Если вам нужно сериализовать php-объект, поддерживая исходный класс, вы должны использовать сериализацию php:

 $a = new MyClass; $b = json_encode($a); $c = json_decode($b); $test = is_a($c, 'MyClass'); // false $a = new MyClass; $b = serialize($a); $c = unserialize($b); $test = is_a($c, 'MyClass'); // true 

Существует ли конкретный предел того, сколько данных я могу хранить с помощью API переходных процессов?

Transient API использует {$wpdb->prefix}_options для сохранения данных. В этой таблице столбец option_value где хранятся данные, является longtext который теоретически может содержать 4Gb данных . Даже если реальное пространство меньше, 50Mb не должно создавать никаких проблем (конечно, если ваше пространство на сервере достаточно велико).

Боковые заметки

  1. Когда работа с сериализованными данными (json или php не имеет значения), вы должны знать, что запуск любого типа SQL-запроса, который их использует, почти невозможно. «Почти» есть для некоторых LIKE %..% запросов …
  2. Процесс сериализации / десериализации немного дороже, особенно для больших данных. Таким образом, это может быть (и на самом деле) полезно, но старайтесь, чтобы этот тип вызовов был менее частым, насколько это возможно, и, если возможно, после получения значения попытайтесь каким-то образом кэшировать его

Я не буду хранить 50+ мега в качестве переходного процесса. Я хотел бы как-то изучить его в файловой системе или создать свою собственную конкретную таблицу db для хранения данных.

Подумайте, что если вы сохраняете переходный процесс в базе данных, то каждый раз, когда вы его вытаскиваете, это 50 мегабайт данных, которые необходимо отправить из БД на веб-сервер для обработки. И это 50 мегабайт памяти, которые PHP должен выделить для ее хранения. И так далее. Вы используете все 50 мегабайт каждый раз? Нет? Тогда это расточительно и глупо.

Разделите свои данные. Не рассматривайте его как один-большой-блоб, вместо этого храните его в своей таблице или как свой собственный тип сообщения или что-то еще. Используйте ключи, чтобы получить доступ к ним, и только доступ к деталям, которые вам нужны. Вы увидите преимущества скорости и сможете лучше работать с этим кодом.