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

时间:2018-12-30 21:48:19

标签: 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>

网站加载后,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();

这将回显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();

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

我尝试在表单操作中使用相对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

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

1 个答案:

答案 0 :(得分:0)

要使用基于cookie的会话,必须在将任何内容(包括任何HTML)输出到浏览器之前调用session_start()。即使您在此处也使用错误报告;或浏览器中显示的任何内容;是的,甚至echo 'Hi';或空白;或<?php之前的BOM,要求发送标题(以显示该消息或空白)。标头只能一次发送到浏览器,因此session_start()不能做它的事情。 (此答案是由于我的空白白屏死机错误报告了过去一天的地狱。)