我的主机提供商从 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 权限。
要使用基于 cookie 的会话,必须在向浏览器输出任何内容(包括任何 HTML)之前调用 session_start()。即使像您在这里一样使用错误报告;或浏览器中显示的任何内容;是的,甚至echo 'Hi';或空格;或 , 之前的 BOM<?php要求发送标头(以显示该消息或空白)。标头只能发送到浏览器一次,因此session_start()无法执行其操作。(这个答案是由我过去一天的空白白屏死机错误报告地狱提供的。)
| 归档时间: |
|
| 查看次数: |
13490 次 |
| 最近记录: |