重定向后,PHP会话丢失

时间:2016-08-10 18:26:58

标签: php wordpress session redirect

我在wordpress.org上有一个wordpress网站。此外,还在同一位置部署了一个独立的PHP应用程序(共享相同的托管)。

独立应用程序有自己的登录页面和主页。当用户登录时,我设置了一个会话标志,指示用户已登录。但是,当我重定向到用户主页(登录后)时,$_SESSION中的所有值都将丢失。

Cookie路径设置为' /'并且session.save_path设置为' / var / lib / php5'

我检查了PHP session lost after redirect中给出的答案并验证了所有要点。

此外,我已按照此处提及的步骤https://wordpress.org/support/topic/php-_session-info-gets-lost-from-an-external-login-page-to-a-wp-installation

但这些都不起作用。

任何人都可以提出可能的问题和解决方案吗?感谢。

PHP版本:5.5.9-1ubuntu4.19

1 个答案:

答案 0 :(得分:0)

你真的不应该评论或修改wp_unregister_globals。结帐http://silvermapleweb.com/using-the-php-session-in-wordpress/,了解如何在不浪费wp_unregister_globals的情况下在Wordpress中实现会话。

我使用它并且有效:

    add_action('init', 'myStartSession', 1);
    function myStartSession() {
        if(!session_id()) {
            session_start();
        }
    }

我还会考虑将会话数据存储在数据库中而不是存储在文件中,尤其是在共享服务器环境中。该服务器上的任何其他人都可能访问您的网站会话数据并接管用户会话。

在我最近的插件中,我在Wordpress数据库中创建了一个新表来存储会话数据,然后使用set_session_save_handler来改变行为。所以我的开始会话脚本变成了这样的东西:

add_action('init', 'myStartSession', 1);
    function myStartSession() {
        if(!session_id()) {
session_set_save_handler('open_session', 'close_session', 'read_session', 'write_session', 'destroy_session', 'clean_session');
        session_start();
        }
    }

add_action( 'session_gc', 'session_gc'); 

if ( ! wp_next_scheduled( 'session_gc' ) )
{
    wp_schedule_event( time(), 'hourly', 'session_gc' );
}

function open_session()
{
    return true;
}

function close_session()
{
    return true;
}

function read_session($sessionid)
{
    global $wpdb;

    $session_table_name = $wpdb -> prefix . "sessions";

    $query = $wpdb->prepare(
                        "SELECT data FROM $session_table_name
                        WHERE id = %s",
                        $sessionid);

    $result = $wpdb -> get_var($query);

    if ($result)
    {
        return $result;
    } else
    {
        return '';
    }
}

function write_session($sessionid,$data)
{
    global $wpdb;

    $session_table_name = $wpdb -> prefix . "sessions";

    $rowsaffected = $wpdb->replace(
                            $session_table_name,
                            array(
                                    'id' => $sessionid,
                                    'data' => $data
                            ),
                            array(
                                    '%s',
                                    '%s'
                            ));

    return true;
}

function destroy_session($sessionid)
{
    global $wpdb;

    $session_table_name = $wpdb -> prefix . "sessions";

    $rowsaffected = $wpdb->delete($session_table_name,array('id' => $sessionid),array('%s'));

    $_SESSION = array();

    return true;
}

function clean_session($expire)
{
    global $wpdb;

    $session_table_name = $wpdb -> prefix . "sessions";

    $wpdb->query(
        $wpdb->prepare(
                "DELETE FROM $session_table_name
                WHERE DATE_ADD(last_accessed, INTERVAL %d SECOND) < NOW()",
                $expire
        )
    );

    return true;
}

function session_gc() {
    global $wpdb;

    $session_table_name = $wpdb -> prefix . "sessions";

    $query = "DELETE FROM $session_table_name WHERE last_accessed < date_sub(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)";
    $wpdb->query($query);

}

有关从Wordpress外部访问$ wpdb类的提示,请参阅http://www.stormyfrog.com/using-wpdb-outside-wordpress/。你可以简单地包含wp-load.php,然后我认为你会免费获得会话行为,因为我非常确定在wp-load.php之后会出现init钩子,当然这是你的缺点。将Wordpress加载到您可能不想要的页面中的开销。