Используя клиент Redis PHP, создать новый объект $connection в каждом PHP-сценарии приложения или создать один объект GLOBAL $connection?
В моем PHP-приложении я пытаюсь использовать Redis (скорее Predis, PHP-клиент для Redis) для кэширования данных, и для этого я следую этому уроку.
Теперь мне нужно будет хранить данные в кеше в одном PHP скрипте / странице. Для этого я создам объект клиента Predis. $redis
а затем использовать это $redis
объект для вызова своих функций, таких как set()
а также expire()
на нем для хранения данных в виде пар ключ-значение. Пример фрагмента приведен ниже.
Теперь проблема в том, что в другом скрипте / странице PHP мне нужно будет прочитать данные, хранящиеся в кеше. Для этого мне нужно будет вызвать такие функции, как get()
или же exists()
на $redis
объект снова
Теперь мой вопрос заключается в том, чтобы на этом втором PHP-скрипте / странице мне нужно было создать новый клиентский объект Predis, такой как $redis
упомянутый выше (тогда мне нужно будет создавать новый объект $ redis каждый раз, когда я хочу получить доступ к данным, хранящимся в кэше на новом скрипте / странице PHP), или я должен объявить первый как GLOBAL
, так что это доступно из всех сценариев / страниц PHP в моем веб-приложении? Какова правильная практика
Пример PHP первого скрипта:
<?php
require "predis/autoload.php";
PredisAutoloader::register();
try {
$redis = new PredisClient();
}
catch (Exception $e) {
die($e->getMessage());
}
// sets message to contian "Hello world"
$redis->set('message', 'Hello world');
?>
Пример PHP второго скрипта:
<?php
/* THE FOLLOWING PART WHICH CREATES A $redis
OBJECT SEEMS TO BE AN OVERDO. SHOULDN'T WE BE
USING THE SAME $redis OBJECT FROM THE ABOVE SNIPPET? */
require "predis/autoload.php";
PredisAutoloader::register();
try {
$redis = new PredisClient();
}
catch (Exception $e) {
die($e->getMessage());
}
// gets the value of message
$value = $redis->get('message');
?>
2 ответа
Ответ действительно зависит от сложности вашего веб-приложения. Один простой способ сделать это, который вы можете легко реализовать, - создать одноэлементный класс и использовать статическую переменную в этом классе.
class MyRedis {
private static $redis;
static function shared() {
if ( empty(self::$redis) ) {
try {
self::$redis = new PredisClient();
} catch (Exception $e) {
die($e->getMessage());
}
}
return self::$redis;
}
}
Теперь, когда вы хотите свой объект, вы делаете это:
$myRedisObject = MyRedis::shared();
// or
$message = MyRedis::shared()->get('message');
Он будет создан, если он еще этого не сделал.
Вам может не понадобиться делать это - вы можете запустить несколько тестов для проверки, но в соответствии с документацией Predis:
Соединения с Redis ленивы, что означает, что клиент подключается к серверу только тогда и только тогда, когда это необходимо. Несмотря на то, что рекомендуется позволить клиенту делать свои собственные вещи внутри, иногда могут возникнуть проблемы, связанные с открытием или закрытием соединения: это можно легко сделать, вызвав $client->connect() и $client->disconnect().
Это также зависит от того, сколько соединений вы устанавливаете - это может быть причиной чрезмерного проектирования, поскольку накладные расходы на соединение, хотя и реальные, довольно низкие.
Я также предполагаю, что в вашем примере оба сценария включены в один запрос. У вас может быть какой-то компонент обмена сообщениями / кеша, который хранит данные в Redis, а также делает их доступными для локальной среды сценариев, зависит только от специфики ваших требований к данным.