升级到 PHP 7 后会话无法正常工作

use*_*141 5 php session

我的主机提供商从 PHP 5.6 升级到 PHP 7.2,我注意到页面重新加载后会话变量会丢失。 我根据正在进行的测试重写了问题以提供相关信息。

基本上,我将搜索键、每页行数和其他数据存储在会话变量中,它们是在重定向到分页时定义的。但是,当我单击任何分页链接时 - 会话变量会丢失其值,简单来说 - 一旦在 pagination.php 上,会话就会停止工作。您可以通过单击类别链接 (href) 或输入搜索词并提交表单来访问 pagination.php。

以下是代码的相关部分,例如主页上的搜索表单:

session_start();
//ini_set('session.save_path', '/tmp');
//phpinfo();
//echo "path" . session_save_path();
//if (!session_start()) echo "Session not started";
echo "header session status= " . session_status();
echo "header session_id= " . session_id();

unset($_SESSION['zip']);
unset($_SESSION['keywords']);
unset($_SESSION['key1']);
unset($_SESSION['key2']);


?>
    <div id="searchBox"> 
            <form action="<?php echo $forsaleurl;?>customer/pagination.php" method="post" class="searchform">

                    <input name="searchstring" class="textbox" type="text" placeholder="search string" value="" required/>
                    <input name="postcode" class="textbox" type="text" placeholder="postcode (optional)" value=""/>
                    <input name="submit" class="submit" value="Search" type="submit" />

    </form>

            </div>
Run Code Online (Sandbox Code Playgroud)

当站点加载时,session_status = 2并且session_id有一个值。

这是创建并显示页面链接的 pagination.php 的开始:

<?php

include '../config.php';
if ($DEBUG > 0)
           {
error_reporting(E_ALL); ini_set('display_errors', 'On'); 
}

echo "page session status= " . session_status();
echo "page session_id" . session_id();
Run Code Online (Sandbox Code Playgroud)

无论您到达这里,这都会回显 session_status=1 和空白 session_id 。

这是启动会话的 config.php 的第一部分:

<?php

ob_start();
error_reporting(E_ERROR); ini_set('display_errors', 'On');
//ini_set('session.save_path', '/tmp');
//phpinfo();
echo "path" . session_save_path();

if (!session_id()) session_start();
print_r($_SESSION);

//session_start();
echo session_status();
echo "session_id" . session_id();
Run Code Online (Sandbox Code Playgroud)

这将在站点加载时显示 session_status、session_id 和会话变量,但在进入分页后不会显示。

我尝试在表单操作中使用相对 URL,但没有什么区别。

会话文件包含重定向到 / 或 index.php 或我未访问过的链接(???)。

站点 URL 是https://themarket.onl

有谁升级后遇到过这个问题吗?该网站在此之前已经完全运行,并且没有对代码进行任何更改。

这是 phpinfo() 的部分转储,不确定 session.save_path 是否不应该为空,但它似乎可以工作,并且本地 php.ini 无法更改该值。

Session Support enabled
Registered save handlers    files user
Registered serializer handlers  php_serialize php php_binary wddx
Directive   Local Value Master Value
session.auto_start  Off Off
session.cache_expire    180 180
session.cache_limiter   nocache nocache
session.cookie_domain   no value    no value
session.cookie_httponly no value    no value
session.cookie_lifetime 0   0
session.cookie_path /   /
session.cookie_secure   0   0
session.gc_divisor  1000    1000
session.gc_maxlifetime  1440    1440
session.gc_probability  1   1
session.lazy_write  On  On
session.name    PHPSESSID   PHPSESSID
session.referer_check   no value    no value
session.save_handler    files   files
session.save_path   no value    no value
session.serialize_handler   php php
session.sid_bits_per_character  4   4
session.sid_length  32  32
session.upload_progress.cleanup On  On
session.upload_progress.enabled On  On
session.upload_progress.freq    1%  1%
session.upload_progress.min_freq    1   1
session.upload_progress.name    PHP_SESSION_UPLOAD_PROGRESS PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefix  upload_progress_    upload_progress_
session.use_cookies 1   1
session.use_only_cookies    1   1
session.use_strict_mode 0   0
session.use_trans_sid   0   0
Run Code Online (Sandbox Code Playgroud)

/tmp 具有 drwxr-xr-x 权限。

Ben*_*son 2

要使用基于 cookie 的会话,必须在向浏览器输出任何内容(包括任何 HTML)之前调用 session_start()。即使像您在这里一样使用错误报告;或浏览器中显示的任何内容;是的,甚至echo 'Hi';或空格;或 , 之前的 BOM<?php要求发送标头(以显示该消息或空白)。标头只能发送到浏览器一次,因此session_start()无法执行其操作。(这个答案是由我过去一天的空白白屏死机错误报告地狱提供的。)