2016-08-10 5 views
1

У меня есть сайт WordPress, размещенный на wordpress.org. А также независимое приложение PHP, развернутое в том же месте (совместно использующее тот же хостинг).Сессия PHP потеряна после перенаправления

Независимое приложение имеет свою собственную страницу входа и домашнюю страницу. Когда пользователь входит в систему, я устанавливаю флаг сеанса, указывающий, что пользователь вошел в систему. Однако, когда я перенаправляюсь на домашнюю страницу пользователя (после входа в систему), все значения от $_SESSION теряются.

путь Cookie устанавливается в «/» и session.save_path устанавливается в «/ вар/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

+0

Есть ли путь, доступный для записи на вашем сервере? Обычный путь для сеанса - '/ tmp /', я думаю. – frz3993

+0

Межсетевые сессии Хмммм Надеюсь, что нет. Являются ли эти 2 разных домена? – RiggsFolly

+0

Вы проверили, изменились ли cookie вашего браузера? Я знаю, что вы проверили, включено ли это, но вы проверили, получил ли браузер новые куки-файлы или сохранил те же старые файлы cookie? – SOFe

ответ

0

Вы действительно не должны закомментировать или изменить wp_unregister_globals. Оформить заказ http://silvermapleweb.com/using-the-php-session-in-wordpress/ для примеров того, как выполнять сеансы в Wordpress без использования wp_unregister_globals.

Я использую это и работает лакомство:

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); 

} 

См http://www.stormyfrog.com/using-wpdb-outside-wordpress/ советы по доступу к классу $ wpdb снаружи Wordpress. Вы могли бы просто включить wp-load.php, тогда я думаю, что вы получите бесплатную сессию, так как я уверен, что начальный крючок появляется после wp-load.php, что отрицательно сказывается на том, что вы накладываете накладные расходы загрузки Wordpress на свои собственные страницы, которые вы, возможно, не захотите.

Смежные вопросы