页面加载

时间:2017-08-07 20:07:40

标签: php session session-variables session-cookies

我已经看过这里和其他地方的所有内容,似乎没有任何效果!

问题在于:

  • 在页面加载时,在调用session_start()时,我会被分配一个PHP会话ID。
  • 刷新页面后,我会收到一个新的会话ID,这会使$_SESSION变量变空。

PHP版本是:5.6.30-0+deb8u1

我做了一个小脚本在应用程序之外复制:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

echo '<pre>';
echo 'orig session.cookie_domain = '.ini_get('session.cookie_domain').PHP_EOL;
echo 'orig session.cookie_secure = '.ini_get('session.cookie_secure').PHP_EOL;
ini_set('session.cookie_domain', '.mydomain.com');
ini_set('session.cookie_secure', 'Off');
echo 'new session.cookie_domain = '.ini_get('session.cookie_domain').PHP_EOL;
echo 'new session.cookie_secure = '.ini_get('session.cookie_secure').PHP_EOL;
echo '-------------'.PHP_EOL;
print_r($_COOKIE);
session_start();
print_r($_COOKIE);
setcookie(ini_get('session.name'), session_id(), 0, '/', ini_get('session.cookie_domain'), false, false);
print_r($_COOKIE);
echo '-------------'.PHP_EOL;
echo 'session id: '.session_id().PHP_EOL;
echo '-------------'.PHP_EOL;
$_SESSION[session_id()][] = date('Y-m-d H:i:s');
print_r($_SESSION);
echo '</pre>';
//phpinfo();

脚本的输出是:

orig session.cookie_domain = 
orig session.cookie_secure = 
new session.cookie_domain = .mydomain.com
new session.cookie_secure = Off
-------------
Array
(
    [__cfduid] => ddxxx
    [_ga] => GA1.2.xxxx
    [wp-settings-time-2] => 1500996194
    [_gid] => GA1.3.xxxx
)
Array
(
    [__cfduid] => ddxxx
    [_ga] => GA1.2.xxxx
    [wp-settings-time-2] => 1500996194
    [_gid] => GA1.3.xxxx
)
Array
(
    [__cfduid] => ddxxx
    [_ga] => GA1.2.xxxx
    [wp-settings-time-2] => 1500996194
    [_gid] => GA1.3.xxxx
)
-------------
session id: 7n4mm16s525mpqo99r242p90l3
-------------
Array
(
    [7n4mm16s525mpqo99r242p90l3] => Array
        (
            [0] => 2017-08-07 16:01:18
        )

)

3 个答案:

答案 0 :(得分:0)

执行此操作,以保留现有会话:

if(session_status() !== PHP_SESSION_ACTIVE) {
    session_start();
}

答案 1 :(得分:0)

经过大量研究后,它出现了Varnish缓存导致问题。问题在于Varnish在没有设置会话cookie的情况下缓存页面,在刷新页面后无效。

在服务器上禁用Varnish解决了我的问题。

对于那些希望让Varnish保持活跃但让会议开始工作的人来说,也发现了这一点:Cache-Control Header Fix

答案 2 :(得分:0)

在php文件中检查is_writable(session_save_path()):

<?php
if (!is_writable(session_save_path())) {
    echo 'Session path "'.session_save_path().'" is not writable for PHP!';
    // you need set chmod -R 777 [session save path folder]
}

希望能帮到你