We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 13481
    • 97 Posts
    Hello,

    I was installing Modx for the first time in a new server environment than I have before, and I came up with this error during the install system check:

    Checking if sessions are properly configured: Failed!


    I have never had problems with this before, so I think I can rule out the common ZoneAlarm issue. I’m pretty sure the issue is that this server environment is a cluster that requires the use of database session management as opposed to file based session management. Is this something that Modx supports? If not, any thoughts on how/where to add this feature?

    Web Server:
    ----------------
    PHP version: 4.4.4
    MySQL version: 4.1.20
    Operating System and version: Linux (don’t know version)

    This is a cluster of about 20 load balanced servers.

    Browser/Client:
    -----------------
    Browser name and version: FireFox 2.0
    Operating System and version: Windows XP

    Thanks for your help,

    James

      • 22303 MODX Staff
      • 10,725 Posts
      The bad news first. Unfortunately, nothing is available for this right now, so you would need to modify quite a bit of the core to use database session management with MODx.

      Now, the good news. The next minor release of MODx, which will be 0.9.7 (this does not apply to patch releases of 0.9.5, i.e. 0.9.5.1, etc.), already includes database session management by default, and will also allow you to implement and configure your own custom session management class, per PHP standards. I’m shooting to have a preview of this 0.9.7, as an alpha release, before Christmas, but it may be after the New Year, depending on my client workloads and the amount of collaboration/contributions from the team I can get in the next couple of weeks. It gets difficult to finish anything during these darned holidays... tongue
        • 13481
        • 97 Posts
        That sounds great. BTW, I’ve been tinkering in the mean time and basically bypassed that check on the install by setting the value to check against to zero:
        In /install/index.php:
        if($_SESSION['session_test']!=0 ) {


        Modx then installed just fine so I added the session management script I use to the top to /manager/includes/config.inc.php. I added this after the database config lines:

        define('HOST',$database_server);         /* database server hostname */
        define('DATABASE','dbname');               /* database name with `` removed */
        define('DBLOGIN',$database_user);        /* database user */
        define('DBPASSWORD',$database_password); /* database password */
        define('TBLPFX',$table_prefix);
        			
        include('session_mysql.php');


        here is the contents of session_mysql.php (placed in /manager/includes/):

        <?
        /* ------------------------------------------------------------------------
         * session_mysql.php
         * ------------------------------------------------------------------------
         * PHP4 MySQL Session Handler
         * Version 1.00
         * by Ying Zhang ([email protected])
         * Last Modified: May 21 2000
         *
         * ------------------------------------------------------------------------
         * TERMS OF USAGE:
         * ------------------------------------------------------------------------
         * You are free to use this library in any way you want, no warranties are
         * expressed or implied.  This works for me, but I don't guarantee that it
         * works for you, USE AT YOUR OWN RISK.
         *
         * While not required to do so, I would appreciate it if you would retain
         * this header information.  If you make any modifications or improvements,
         * please send them via email to Ying Zhang <[email protected]>.
         *
         * ------------------------------------------------------------------------
         * DESCRIPTION:
         * ------------------------------------------------------------------------
         * This library tells the PHP4 session handler to write to a MySQL database
         * instead of creating individual files for each session.
         *
         * Create a new database in MySQL called "".TBLPFX."Sessions" like so:
         *
         * CREATE TABLE ".TBLPFX."Sessions (
         *      sesskey char(32) not null,
         *      expiry int(11) unsigned not null,
         *      value text not null,
         *      PRIMARY KEY (sesskey)
         * );
         *
         * ------------------------------------------------------------------------
         * INSTALLATION:
         * ------------------------------------------------------------------------
         * Make sure you have MySQL support compiled into PHP4.  Then copy this
         * script to a directory that is accessible by the rest of your PHP
         * scripts.
         *
         * ------------------------------------------------------------------------
         * USAGE:
         * ------------------------------------------------------------------------
         * Include this file in your scripts before you call session_start(), you
         * don't have to do anything special after that.
         */
         
        $SESS_DBHOST = HOST;       /* database server hostname */
        $SESS_DBNAME = DATABASE;   /* database name */
        $SESS_DBUSER = DBLOGIN;    /* database user */
        $SESS_DBPASS = DBPASSWORD; /* database password */
        
        $SESS_DBH = "";
        $SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
        
        function sess_open($save_path, $session_name) {
            global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;
        
            if (! $SESS_DBH = mysql_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS)) {
                echo "<li>Can't connect to $SESS_DBHOST as $SESS_DBUSER";
                echo "<li>MySQL Error: ", mysql_error();
                die;
            }
        
            if (! mysql_select_db($SESS_DBNAME, $SESS_DBH)) {
                echo "<li>Unable to select database $SESS_DBNAME";
                die;
            }
        
            return true;
        }
        
        function sess_close() {
            return true;
        }
        
        function sess_read($key) {
            global $SESS_DBH, $SESS_LIFE;
        
            $qry = "SELECT value FROM ".TBLPFX."Sessions WHERE sesskey = '$key' AND expiry > " . time();
            $qid = mysql_query($qry, $SESS_DBH);
        
            if (list($value) = mysql_fetch_row($qid)) {
                return $value;
        	}
        
            return false;
        }
        
        function sess_write($key, $val) {
            global $SESS_DBH, $SESS_LIFE;
        
            $expiry = time() + $SESS_LIFE;
            $value = addslashes($val);
        
            $qry = "INSERT INTO ".TBLPFX."Sessions VALUES ('$key', $expiry, '$value')";
            $qid = mysql_query($qry, $SESS_DBH);
        
            if (! $qid) {
                $qry = "UPDATE ".TBLPFX."Sessions SET expiry = $expiry, value = '$value' WHERE sesskey = '$key' AND expiry > " . time();
                $qid = mysql_query($qry, $SESS_DBH);
            }
        
            return $qid;
        }
        
        function sess_destroy($key) {
            global $SESS_DBH;
        
            $qry = "DELETE FROM ".TBLPFX."Sessions WHERE sesskey = '$key'";
            $qid = mysql_query($qry, $SESS_DBH);
        
            return $qid;
        }
        
        function sess_gc($maxlifetime) {
            global $SESS_DBH;
        
            $qry = "DELETE FROM ".TBLPFX."Sessions WHERE expiry < " . time();
            $qid = mysql_query($qry, $SESS_DBH);
        
            return mysql_affected_rows($SESS_DBH);
        }
        
        session_set_save_handler(
            "sess_open",
            "sess_close",
            "sess_read",
            "sess_write",
            "sess_destroy",
            "sess_gc");
        ?>



        It appears to work ok now, but I know there will be some bugs (I get one on logout). So, I’m happily awaiting your database session management functionality and will work with this hack in the mean time.

        (BTW, this fix works for me in 0.9.5 also)

        Thanks!

        James