RedisException
MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error. RedisException thrown with message "MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error." Stacktrace: #8 RedisException in /home/deploy/EHungry-8-simon/Web/classes/Cache.class.php:69 #7 Redis:setex in /home/deploy/EHungry-8-simon/Web/classes/Cache.class.php:69 #6 Cache:Set in /home/deploy/EHungry-8-simon/Web/classes/Cache.class.php:57 #5 Cache:SetArray in /home/deploy/EHungry-8-simon/Web/classes/DbFields.php:53 #4 DbFields:getFields in /home/deploy/EHungry-8-simon/Web/classes/BaseClass.class.php:517 #3 BaseClass:getAttribute in /home/deploy/EHungry-8-simon/PHP/vendor/illuminate/database/Eloquent/Model.php:1279 #2 Illuminate\Database\Eloquent\Model:__get in /home/deploy/EHungry-8-simon/Web/classes/BaseClass.class.php:414 #1 BaseClass:__call in /home/deploy/EHungry-8-simon/PHP/Global.php:275 #0 require in /home/deploy/EHungry-8-simon/Web/index.php:17
Stack frames (9)
8
RedisException
/
home
/
deploy
/
EHungry-8-simon
/
Web
/
classes
/
Cache.class.php
69
7
Redis
setex
/
home
/
deploy
/
EHungry-8-simon
/
Web
/
classes
/
Cache.class.php
69
6
Cache
Set
/
home
/
deploy
/
EHungry-8-simon
/
Web
/
classes
/
Cache.class.php
57
5
Cache
SetArray
/
home
/
deploy
/
EHungry-8-simon
/
Web
/
classes
/
DbFields.php
53
4
DbFields
getFields
/
home
/
deploy
/
EHungry-8-simon
/
Web
/
classes
/
BaseClass.class.php
517
3
BaseClass
getAttribute
/
vendor
/
illuminate
/
database
/
Eloquent
/
Model.php
1279
2
Illuminate
\
Database
\
Eloquent
\
Model
__get
/
home
/
deploy
/
EHungry-8-simon
/
Web
/
classes
/
BaseClass.class.php
414
1
BaseClass
__call
/
Global.php
275
0
require
/
home
/
deploy
/
EHungry-8-simon
/
Web
/
index.php
17
/
home
/
deploy
/
EHungry-8-simon
/
Web
/
classes
/
Cache.class.php
  1. }
  2. public static function SetObject($key, $var, $expire = 86400) {
  3. return static::Set($key, serialize($var), $expire);
  4. }
  5. public static function SetArray($key, $var, $expire = 86400) {
  6. return static::Set($key, serialize($var), $expire);
  7. }
  8. public static function SetBoolean($key, $var, $expire = 86400) {
  9. return static::Set($key, serialize($var), $expire);
  10. }
  11. public static function Set($key, $var, $expire = 86400) {
  12. App::debugbarLog('debug', "Cache set: $key");
  13. if ($i = static::getInstance()) {
  14. $var = static::beforeSet($var);
  15. return $expire > 0?
  16. $i->setEx($key, $expire, $var) :
  17. $i->set($key, $var);
  18. }
  19. return null;
  20. }
  21. public static function Exists(...$key):?bool {
  22. if ($i = static::getInstance()) {
  23. return $i->exists($key);
  24. }
  25. return null;
  26. }
  27. public static function Expire($key, $ttl) {
  28. if ($i = static::getInstance()) {
  29. return $i->expire($key, $ttl);
  30. }
  31. return false;
  32. }
  33. /**
Arguments
  1. "MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because "
    
/
home
/
deploy
/
EHungry-8-simon
/
Web
/
classes
/
Cache.class.php
    }
 
    public static function SetObject($key, $var, $expire = 86400) {
        return static::Set($key, serialize($var), $expire);
    }
 
    public static function SetArray($key, $var, $expire = 86400) {
        return static::Set($key, serialize($var), $expire);
    }
 
    public static function SetBoolean($key, $var, $expire = 86400) {
        return static::Set($key, serialize($var), $expire);
    }
 
    public static function Set($key, $var, $expire = 86400) {
        App::debugbarLog('debug', "Cache set: $key");
        if ($i = static::getInstance()) {
            $var = static::beforeSet($var);
            return $expire > 0?
                $i->setEx($key, $expire, $var) :
                $i->set($key, $var);
        }
        return null;
    }
 
    public static function Exists(...$key):?bool {
        if ($i = static::getInstance()) {
            return $i->exists($key);
        }
        return null;
    }
 
    public static function Expire($key, $ttl) {
        if ($i = static::getInstance()) {
            return $i->expire($key, $ttl);
        }
        return false;
    }
 
    /**
Arguments
  1. "describe_hn_host_1"
    
  2. 86400
    
  3. "a:14:{s:2:"id";s:1:"N";s:11:"hn_insecure";s:1:"S";s:9:"hn_secure";s:1:"S";s:6:"active";s:1:"B";s:16:"redirect_enabled";s:1:"B";s:13:"redirect_host";s:1:"S";s:12:"redirect_uri";s:1:"S";s:11:"ssl_expires";s:1:"D";s:15:"ssl_common_name";s:1:"S";s:7:"ssl_key";s:1:"S";s:15:"ssl_certificate";s:1:"S";s:6:"ssl_ip";s:1:"S";s:11:"dns_pointed";s:1:"B";s:14:"ssl_debug_note";s:1:"S";}a:14:{s:2:"id";s:1:"N";s:11:"hn_insecure";s:1:"S";s:9:"hn_secure";s:1:"S";s:6:"active";s:1:"B";s:16:"redirect_enabled";s:1:"B";s:13:"redirect_host";s:1:"S";s:12"
    
/
home
/
deploy
/
EHungry-8-simon
/
Web
/
classes
/
Cache.class.php
                if (!@static::$redisObj->connect(static::$host, (int)static::$port)) {
                    static::$redisObj = false;
                    Splunk::log(Splunk::LOG_REDIS_CONN, ['error' => 'Error connecting']);
                } else {
                    static::$redisObj->select(static::$db);
                }
            } catch (RedisException $e) {
                static::$redisObj = false;
                Splunk::log(Splunk::LOG_REDIS_CONN, ['error' => 'Error connecting: '.$e->getMessage()]);
            }
        }
        return static::$redisObj;
    }
 
    public static function SetObject($key, $var, $expire = 86400) {
        return static::Set($key, serialize($var), $expire);
    }
 
    public static function SetArray($key, $var, $expire = 86400) {
        return static::Set($key, serialize($var), $expire);
    }
 
    public static function SetBoolean($key, $var, $expire = 86400) {
        return static::Set($key, serialize($var), $expire);
    }
 
    public static function Set($key, $var, $expire = 86400) {
        App::debugbarLog('debug', "Cache set: $key");
        if ($i = static::getInstance()) {
            $var = static::beforeSet($var);
            return $expire > 0?
                $i->setEx($key, $expire, $var) :
                $i->set($key, $var);
        }
        return null;
    }
 
    public static function Exists(...$key):?bool {
        if ($i = static::getInstance()) {
            return $i->exists($key);
Arguments
  1. "describe_hn_host_1"
    
  2. "a:14:{s:2:"id";s:1:"N";s:11:"hn_insecure";s:1:"S";s:9:"hn_secure";s:1:"S";s:6:"active";s:1:"B";s:16:"redirect_enabled";s:1:"B";s:13:"redirect_host";s:1:"S";s:12:"redirect_uri";s:1:"S";s:11:"ssl_expires";s:1:"D";s:15:"ssl_common_name";s:1:"S";s:7:"ssl_key";s:1:"S";s:15:"ssl_certificate";s:1:"S";s:6:"ssl_ip";s:1:"S";s:11:"dns_pointed";s:1:"B";s:14:"ssl_debug_note";s:1:"S";}a:14:{s:2:"id";s:1:"N";s:11:"hn_insecure";s:1:"S";s:9:"hn_secure";s:1:"S";s:6:"active";s:1:"B";s:16:"redirect_enabled";s:1:"B";s:13:"redirect_host";s:1:"S";s:12"
    
  3. 86400
    
/
home
/
deploy
/
EHungry-8-simon
/
Web
/
classes
/
DbFields.php
        $this->table = $table;
    }
 
    public function getFields($withTypes = false):array {
        //FIXME: workaround for BaseClass objects that are not present in the database. check BaseClass::NO_TABLE
        if (!$this->table) {
            return [];
        }
        if (!$this->typesCache) { //not in the local cache, let's fetch it
            $cacheKey = "describe_{$this->table}_1"; //this "1" meant "include ID" in the old code
 
            //TODO: replace with Cache::Remember
            $this->typesCache = Cache::GetArray($cacheKey);
            if (!$this->typesCache || self::SKIP_CACHE) { //not in the cache either, let's generate it
                $this->typesCache = collect(DB::select("DESCRIBE $this->table"))
                                        ->pluck('Type', 'Field')
                                        ->transform(['DbFields','simplifyType'])
                                        ->all();
 
                Cache::SetArray($cacheKey, $this->typesCache);
            }
        }
 
        if (!$this->fieldsCache && !$withTypes) {
            $this->fieldsCache = array_keys($this->typesCache);
        }
 
        return $withTypes? $this->typesCache : $this->fieldsCache;
    }
 
    /**
     * Separates all attributes into custom and pure fields (those present on the database table).
     * @param array $values
     * @return array 0 => custom fields, 1 => pure fields
     */
    public function splitCustom(array $values) {
        $tableFields = array_flip($this->getFields());
        $customFields = array_diff_key($values, $tableFields);
        $pureFields = array_intersect_key($values, $tableFields);
 
Arguments
  1. "describe_hn_host_1"
    
  2. 0 of 0
    array:14 [ "id" => "N" "hn_insecure" => "S" "hn_secure" => "S" "active" => "B" "redirect_enabled" => "B" "redirect_host" => "S" "redirect_uri" => "S" "ssl_expires" => "D" "ssl_common_name" => "S" "ssl_key" => "S" "ssl_certificate" => "S" "ssl_ip" => "S" "dns_pointed" => "B" "ssl_debug_note" => "S" ]
/
home
/
deploy
/
EHungry-8-simon
/
Web
/
classes
/
BaseClass.class.php
 
    /**
     * Sets the updated_at field, with a backport of the 5.5+ behavior for disabling that field.
     * @param mixed $value
     * @return EloquentModel
     */
    public function setUpdatedAt($value) {
        if (static::UPDATED_AT) {
            parent::setAttribute(static::UPDATED_AT, $value);
        }
        return $this;
    }
 
    public function getAttribute($key) {
        //first we check for mutated getters
        if ($getter = $this->findAnyGetMutator($key)) {
            return $this->$getter();
        }
 
        if (in_array($key, $this->fields()->getFields()) || array_key_exists($key, $this->attributes)) {
            //this is an existing database field or came from a custom query, so let's get it as an attribute
            return parent::getAttribute($key);
        } elseif (method_exists($this, $key)) {
            //this is a relationship method, skipped at getAttribute() by the last if-clause, so let's call it here
            try {
                return $this->getRelationValue($key);
            } catch (LogicException $e) {
                throw new LogicException('You probably forgot to *return* from your relation method - or accidentally triggered a relation getter where you shouldn\'t', $e->getCode(), $e);
            }
        } elseif (property_exists($this, $key)) {
            //support for legacy getter of custom props
            return $this->$key;
        } else {
            //probably a custom prop (sometimes used in legacy code), so let's get it directly from the object as usual
            //this causes a small side-effect where isset() can't be used with undeclared custom props; property_exists() should be used instead (actually, they should be declared lol)
            if (DevLevel > 0) {
                trigger_error('Custom property got from '.static::class.": $key", E_USER_NOTICE);
            }
            return $this->$key;
        }
/
home
/
deploy
/
EHungry-8-simon
/
PHP
/
vendor
/
illuminate
/
database
/
Eloquent
/
Model.php
     *
     * @param  int  $perPage
     * @return $this
     */
    public function setPerPage($perPage)
    {
        $this->perPage = $perPage;
 
        return $this;
    }
 
    /**
     * Dynamically retrieve attributes on the model.
     *
     * @param  string  $key
     * @return mixed
     */
    public function __get($key)
    {
        return $this->getAttribute($key);
    }
 
    /**
     * Dynamically set attributes on the model.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @return void
     */
    public function __set($key, $value)
    {
        $this->setAttribute($key, $value);
    }
 
    /**
     * Determine if the given attribute exists.
     *
     * @param  mixed  $offset
     * @return bool
     */
Arguments
  1. "redirect_enabled"
    
/
home
/
deploy
/
EHungry-8-simon
/
Web
/
classes
/
BaseClass.class.php
     * @param string $func
     * @param array  $args
     * @return mixed|null If setXyz() is called, it will return the final stored format. Otherwise, returns what's
     * recovered from getXyz() or whatever the resulting magic method should return.
     */
    public function __call($func, $args) {
        $action = substr($func, 0, 3);
 
        $prop = snake_case(substr($func, 3));
        //we need to extend snake_case() result to consider numbers as boundaries too..... for most cases :|
        if (!preg_match('/(^street|note|freepos_tax)\d/', $prop)) {
            $prop = preg_replace('/(.)(?=\d)/u', '$1_', $prop);
        }
 
        switch ($action) {
            case 'set':
                $this->__set($prop, $args[0]);
                return $this->__get($prop);
            case 'get':
                return $this->__get($prop);
            case 'iss':
                return isset($this->attributes[$prop]);
        }
 
        try {
            return parent::__call($func, $args);
        } catch (BadMethodCallException $e) {
            trigger_error('Invalid method called: '.get_class($this)."::$func()", E_USER_WARNING);
            return null;
        }
    }
 
    /**
     * Checks for either legacy or Laravel-style mutators (setField() or getFieldAttribute()).
     * @param string $getSet either 'get' or 'set'
     * @param string $key
     * @return string
     */
    private function findAnyMutator($getSet, $key):string {
        $base = $getSet.studly_case($key);
Arguments
  1. "redirect_enabled"
    
/
home
/
deploy
/
EHungry-8-simon
/
PHP
/
Global.php
    });
 
if (!$hnHost) {
    $status = new AccessStatus();
    $status->close_message = 'The URL you were trying to access is not valid on this server. If you feel this is in error, please contact your restaurant or online ordering provider. Sorry for any inconvenience!';
 
    //if HN_DevToLive() didn't throw up, but still we end up here, this might be just a 404 error, or an actual missing
    // SSL cert when accessing DevLevel 2 intentionally. Thus, let's include a helper message as well.
    if (DevLevel >= 2) {
        preg_match('/^(.*)\.(\d+)\.(.*)$/', $_SERVER['HTTP_HOST'], $domainPieces);
        if (sizeof($domainPieces) == 4) {
            $status->close_message .= "<br/><br/>Psst... developer! This may also be a missing SSL Cert.<br/>If there's no typo on the URL, <a href='https://order.ehungry.com.$domainPieces[2].$domainPieces[3]/rcs/?form=devtools'>generate a certificate</a> for <tt>$domainPieces[1]</tt>";
        }
    }
 
    include(App_Path.'/Web/closed.php');
    exit(0);
}
 
if ($hnHost->getRedirectEnabled()) {
    header('Location: '.$hnHost->getRedirectHost().($hnHost->getRedirectUri()==""?$_SERVER['REQUEST_URI']:$hnHost->getRedirectUri()));
}
 
if (DevLevel == 0) {
    define('HTTPS_HOST', 'https://'.$hnHost->getHnSecure()."/");
} else {
    define('HTTPS_HOST', 'https://'.HN_LiveToDev($hnHost->getHnSecure())."/");
}
 
define('HN_SECURE', $hnHost->getHnSecure());
define('APP_HOSTNAME', HTTPS_HOST);
 
///////////////////////////////////////////////////////////////////////////////
// baked in settings
 
$_REQUEST['status'] = array();
 
define('Secure', 1); //phpcs:ignore Generic.NamingConventions.UpperCaseConstantName.ConstantNotUpperCase
define('Insecure', 2); //phpcs:ignore Generic.NamingConventions.UpperCaseConstantName.ConstantNotUpperCase
 
Arguments
  1. "getRedirectEnabled"
    
  2. []
    
/
home
/
deploy
/
EHungry-8-simon
/
Web
/
index.php
<? /** @noinspection PhpIncludeInspection - to avoid marking dynamic includes */
 
//TODO create a «root»/_bootstrap.php which can be used by .psysh.php, tests/bootstrap.php and Web/index.php
require(dirname(__DIR__).'/PHP/base_consts.php');
require(dirname(__DIR__).'/PHP/autoloader.php');
initializeAutoLoader();
 
//disabled for now since we already have our own Alerts infrastructure, and it's not worth it to append another cloud provider to the startup of every freaking request; it's also not possible to catch errors this early if we depend on database checks, but we'll leave it here in case we change our mind?
//ErrorHandlers::sentryInit(); //early catch of errors and failsafe for smaller controllers, not in Sentry
 
App::startTime();
 
ErrorHandlers::register();
 
// Global.php is the core setup file for the application
App::debugbarTime('Global.php');
require(dirname(__DIR__) . '/PHP/Global.php');
App::debugbarTime('Global.php');
/** @var string $controller The main controller - defined at /PHP/Global.php */
 
App::debugbarTime('Sentry - controller');
ErrorHandlers::sentryInit($controller); //doesn't always do much - not every controller has a Sentry project
App::debugbarTime('Sentry - controller');
 
App::debugbarTime("controller: $controller");
apache_note('AppController', $controller);
if (file_exists(CORE_PATH."lib/helpers/$controller.php")) {
    require CORE_PATH."lib/helpers/$controller.php";
}
require CORE_PATH."controllers/$controller.php";
App::debugbarTime("controller: $controller");
 
Arguments
  1. "/home/deploy/EHungry-8-simon/PHP/Global.php"
    

Environment & details:

Key Value
aid
"restaurant/newgreatwallmtkisco/order/main/health-diet-menu/h2-chicken-w-mixed-vegetable"
empty
empty
empty
Key Value
loc
"en_US"
Key Value
UNIQUE_ID
"aCEU0qvuXgsdMZVfyzecfAAAAA0"
SCRIPT_URL
"/restaurant/newgreatwallmtkisco/order/main/health-diet-menu/h2-chicken-w-mixed-vegetable"
SCRIPT_URI
"http://www.springroll.com.8.simon.ehungry.net/restaurant/newgreatwallmtkisco/order/main/health-diet-menu/h2-chicken-w-mixed-vegetable"
HTTP_HOST
"www.springroll.com.8.simon.ehungry.net"
HTTP_X_REAL_IP
"3.18.213.37"
HTTP_X_FORWARDED_FOR
"3.18.213.37"
HTTP_X_CONFKEY
"Main_Domain:6462"
HTTP_SCHEME
"https"
HTTP_EHENV
"TODO"
HTTP_CONNECTION
"close"
HTTP_PRAGMA
"no-cache"
HTTP_CACHE_CONTROL
"no-cache"
HTTP_SEC_CH_UA
""Chromium";v="130", "HeadlessChrome";v="130", "Not?A_Brand";v="99""
HTTP_SEC_CH_UA_MOBILE
"?0"
HTTP_SEC_CH_UA_PLATFORM
""Windows""
HTTP_UPGRADE_INSECURE_REQUESTS
"1"
HTTP_USER_AGENT
"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)"
HTTP_ACCEPT
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"
HTTP_SEC_FETCH_SITE
"none"
HTTP_SEC_FETCH_MODE
"navigate"
HTTP_SEC_FETCH_USER
"?1"
HTTP_SEC_FETCH_DEST
"document"
HTTP_ACCEPT_ENCODING
"gzip, deflate, br, zstd"
HTTP_PRIORITY
"u=0, i"
PATH
"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
SERVER_SIGNATURE
""
SERVER_SOFTWARE
"Apache/2.4.62 () mod_wsgi/4.6.5 Python/3.7 PHP/7.2.34"
SERVER_NAME
"www.springroll.com.8.simon.ehungry.net"
SERVER_ADDR
"127.0.0.1"
SERVER_PORT
"80"
REMOTE_ADDR
"127.0.0.1"
DOCUMENT_ROOT
"/home/deploy/EHungry-8-simon/Web"
REQUEST_SCHEME
"http"
CONTEXT_PREFIX
""
CONTEXT_DOCUMENT_ROOT
"/home/deploy/EHungry-8-simon/Web"
SERVER_ADMIN
"root@localhost"
SCRIPT_FILENAME
"/home/deploy/EHungry-8-simon/Web/index.php"
REMOTE_PORT
"34344"
GATEWAY_INTERFACE
"CGI/1.1"
SERVER_PROTOCOL
"HTTP/1.0"
REQUEST_METHOD
"GET"
QUERY_STRING
"aid=restaurant/newgreatwallmtkisco/order/main/health-diet-menu/h2-chicken-w-mixed-vegetable"
REQUEST_URI
"/restaurant/newgreatwallmtkisco/order/main/health-diet-menu/h2-chicken-w-mixed-vegetable"
SCRIPT_NAME
"/restaurant/newgreatwallmtkisco/order/main/health-diet-menu/h2-chicken-w-mixed-vegetable"
PHP_SELF
"/restaurant/newgreatwallmtkisco/order/main/health-diet-menu/h2-chicken-w-mixed-vegetable"
REQUEST_TIME_FLOAT
1746998482.831
REQUEST_TIME
1746998482
empty
0. Whoops\Handler\PrettyPageHandler

Fatal error: Uncaught RedisException: MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error. in [no active file]:0 Stack trace: #0 {main} thrown in [no active file] on line 0