Popraw obsługę błędów i optymalizację połączeń z Redis w różnych klasach

This commit is contained in:
2024-11-08 00:16:19 +01:00
parent fc35061406
commit e3b4ec973b
12 changed files with 101 additions and 54 deletions

BIN
autoload/.DS_Store vendored

Binary file not shown.

View File

@@ -1,30 +1,54 @@
<?
class RedisConnection {
class RedisConnection
{
private static $instance = null;
private $redis;
private function __construct() {
private function __construct()
{
global $config;
$this -> redis = new \Redis();
if ( !$this -> redis -> connect( $config['redis']['host'], $config['redis']['port'] ) ) {
throw new Exception("Nie udało się połączyć z serwerem Redis.");
$this->redis = new \Redis();
try
{
// Próba połączenia z serwerem Redis
if (!$this->redis->connect($config['redis']['host'], $config['redis']['port']))
{
// Logowanie błędu lub inna forma obsługi, zamiast rzucania wyjątku
error_log("Nie udało się połączyć z serwerem Redis.");
$this->redis = null; // Ustawienie na null, aby uniknąć błędów w przyszłości
return; // Wyjście z konstruktora, nie kontynuując autoryzacji
}
// Autentykacja za pomocą hasła
if ( !$this -> redis -> auth( $config['redis']['password'] ) ) {
// Próba autoryzacji
if (!$this->redis->auth($config['redis']['password']))
{
error_log("Autoryzacja do serwera Redis nie powiodła się.");
$this->redis = null; // Ustawienie na null, aby uniknąć błędów w przyszłości
return; // Wyjście z konstruktora
}
}
catch (\Exception $e)
{
// Obsługa innych potencjalnych wyjątków
error_log("Błąd podczas połączenia z Redis: " . $e->getMessage());
$this->redis = null; // Ustawienie na null, aby uniknąć błędów w przyszłości
}
}
public static function getInstance() {
if ( self::$instance === null ) {
public static function getInstance()
{
if (self::$instance === null)
{
self::$instance = new self();
}
return self::$instance;
}
public function getConnection() {
public function getConnection()
{
return $this->redis;
}
}
}

Binary file not shown.

View File

@@ -362,7 +362,8 @@ class ShopBasket
\S::set_session( 'ekomi-purchase', true );
$redis = \RedisConnection::getInstance() -> getConnection();
$redis -> flushAll();
if ( $redis )
$redis -> flushAll();
header( 'Location: /zamowienie/' . \front\factory\ShopOrder::order_hash( $order_id ) );
exit;

View File

@@ -112,41 +112,50 @@ class Product implements \ArrayAccess
* @param string $permutation_hash The permutation hash of the product.
* @return \shop\Product The product object.
*/
public static function getFromCache( $product_id, $lang_id, $permutation_hash = null )
public static function getFromCache($product_id, $lang_id, $permutation_hash = null)
{
// Check if Redis extension is loaded
if ( class_exists( 'Redis' ) )
if (class_exists('Redis'))
{
try
{
// Get the Redis connection instance
$redis = \RedisConnection::getInstance() -> getConnection();
$redis = \RedisConnection::getInstance()->getConnection();
// Try to retrieve the serialized product object from cache
$objectData = $redis -> get( "shop\product:$product_id:$lang_id:$permutation_hash" );
if ( !$objectData )
// Check if Redis connection is valid
if ($redis)
{
// Product not found in cache, create a new instance and store it in cache
$object = new self( $product_id, $lang_id, $permutation_hash );
$redis->setex( "shop\product:$product_id:$lang_id:$permutation_hash", 60 * 60 * 24, serialize( $object ) );
// Try to retrieve the serialized product object from cache
$objectData = $redis->get("shop\product:$product_id:$lang_id:$permutation_hash");
if (!$objectData)
{
// Product not found in cache, create a new instance and store it in cache
$object = new self($product_id, $lang_id, $permutation_hash);
$redis->setex("shop\product:$product_id:$lang_id:$permutation_hash", 60 * 60 * 24, serialize($object));
}
else
{
// Product found in cache, unserialize it
$object = unserialize($objectData);
}
}
else
{
// Product found in cache, unserialize it
$object = unserialize( $objectData );
// Redis connection failed, create a new instance
$object = new self($product_id, $lang_id, $permutation_hash);
}
}
catch ( \Exception $e )
catch (\Exception $e)
{
// Log the exception if needed
$object = new self( $product_id, $lang_id, $permutation_hash );
$object = new self($product_id, $lang_id, $permutation_hash);
}
}
else
{
// Redis extension not loaded, create a new instance
$object = new self( $product_id, $lang_id, $permutation_hash );
$object = new self($product_id, $lang_id, $permutation_hash);
}
return $object;

View File

@@ -20,16 +20,25 @@ class ProductCustomField implements \ArrayAccess
try
{
$redis = \RedisConnection::getInstance() -> getConnection();
$objectData = $redis -> get( "shop\ProductCustomField:$custom_field_id" );
if ( !$objectData )
if ( $redis )
{
$object = new self( $custom_field_id );
$redis -> setex( "shop\ProductCustomField:$custom_field_id", 60 * 60 * 24, serialize( $object ) );
$objectData = $redis -> get( "shop\ProductCustomField:$custom_field_id" );
if ( !$objectData )
{
$object = new self( $custom_field_id );
$redis -> setex( "shop\ProductCustomField:$custom_field_id", 60 * 60 * 24, serialize( $object ) );
}
else
{
$object = unserialize( $objectData );
}
}
else
{
$object = unserialize( $objectData );
// Log the error if needed
$object = new self( $custom_field_id );
}
}
catch ( \Exception $e )