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