繁体   English   中英

PHP会话在重定向后丢失

[英]PHP Session Gets Lost After Redirect

我在wordpress.org上有一个wordpress网站。 还有一个独立的PHP应用程序部署在同一位置(共享相同的主机)。

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

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

我已经检查了重定向后验证所有点的PHP会话中给出的答案。

此外,我已按照此处提到的步骤进行操作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

你真的不应该评论或修改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加载到您可能不想要的页面中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM