PHP多页面使用session切换新服务器值为空,单页代码场景解决方案咨询
问题代码
第一页(login.php)
<?php session_start(); // $var_value =$_SESSION['orderidno']; // $var_value =$_GET['orderur']; if(isset($_POST['login'])) { $mobileNo=$_POST['mobileNo']; $passWord=$_POST['passWord']; } $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'here is my api url', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', )); $response_details = curl_exec($curl); $data_details=json_decode($response_details,TRUE); $data1_details=json_decode($response_details); curl_close($curl); $res=$data_details['ispasswordMatched']; if($res) { $_SESSION['loggedin'] = "true"; $_SESSION['loggedinnumber'] = $mobileNo; foreach($data_details['content'] as $result) { $_SESSION['vendorname'] = $result['vendorname']; $_SESSION['vendorkey'] = $result['vendorkey']; $_SESSION['userkey'] = $result['key']; //here i have been storing my api result values in session } echo "<script> location.href='userdetails.php'; </script>"; } else if($mobileNo!="") { $empty=$data_details['message']; } ?> <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>PHP HTML TABLE DATA SEARCH</title> <style> table,tr,th,td { border: 1px solid black; } div#searcharea { text-align: center; } </style> </head> <body> <form id="search_form" method="post" action="login.php" > <!--<h4>Search Customer / Customer Order</h4>--> <div> <input id="mobilenumbervalue" style="width: 88%; margin-top: 22px" type="text" name="mobileNo" placeholder="Enter the Mobile Number" pattern="[1-9]{1}[0-9]{9}" required> <input id="orderidvalue" style="width: 88%; margin-top: 22px" type="password" name="passWord" placeholder="Enter the password" required> <br> <p id="mobileError" style="color: red;"><?php echo $empty?></p> <p id="orderError" style="color: red;"><?php echo $emptyOrder?></p> </div> <div> <Button style="background: #fdd110; width: 35%; height: 39px; border: #fdd110; margin-top: 15px;" id="userdataSearchButton" type="submit" name="login" >Log In</Button> </div> </form> <script type="text/javascript"> function myFunction() { alert("work in progress"); } function required() { var empt = document.forms["form1"]["valueToSearch"].value; if (empt == "") { alert("Please input a Value"); return false; } } </script> </body> </html>
第二页(userdetails.php)
<?php session_start(); $var_value =$_SESSION['loggedin']; if($var_value!="true") { echo "the user doesn't exist"; } else { echo "the user is exists"; } ?> <!-- 此处为第二页HTML内容 -->
实现逻辑
- 第一页通过API校验用户提交的手机号和密码是否匹配,校验通过后将用户身份标识、API返回的业务数据存入session,设置
$_SESSION['loggedin'] = "true"标记登录状态,再通过JS跳转至第二页userdetails.php。 - 第二页开头调用
session_start(),通过判断$_SESSION['loggedin']是否为true验证用户登录状态,决定是否允许访问页面。
问题描述
- 第二页读取到的
$_SESSION['loggedin']值为空,其余所有session变量也均为空,无法正常完成登录校验,用户无法访问第二页。
场景说明
- 代码原部署在Godaddy Linux主机时运行完全正常,切换到新的Linux服务器后出现上述session失效问题。
- 若将PHP逻辑拆分到单独文件通过AJAX调用,session可正常读取,但现有业务代码均采用单页集成PHP、HTML、JavaScript的结构,需要适配该结构的解决方案。
解决方案
1. 移除session_start()前的所有输出
新服务器大概率默认关闭了output_buffering配置,而原Godaddy主机默认开启该配置,自动缓冲提前输出的内容不影响session cookie发送。需确保所有页面<?php session_start();之前没有任何空格、换行、HTML标签等输出,第一页代码开头的多余空格要全部删除。
2. 跳转后终止代码执行
设置session完成并输出跳转JS后,添加exit;强制终止后续代码执行,确保session数据完整写入存储:
echo "<script> location.href='userdetails.php'; </script>"; exit; // 新增这行
3. 检查session存储路径权限
新建测试文件输出phpinfo(),查找session.save_path对应的目录,确保运行PHP服务的用户(如www-data、apache)对该目录有读写权限,可执行以下命令修复(替换为实际路径和运行用户):
chown www-data:www-data /var/lib/php/sessions chmod 755 /var/lib/php/sessions
4. 统一session cookie配置
如果站点域名或路径有变更,可在session_start()前手动指定cookie作用域,避免跨路径/跨域名无法携带session cookie:
// 所有页面session_start()前添加 ini_set('session.cookie_domain', '.你的域名.com'); // 替换为实际域名,前面加.适配子域名 ini_set('session.cookie_path', '/'); session_start();
5. 检查session自动启动配置
确认php.ini中session.auto_start设置为Off,避免重复开启session导致数据丢失。
内容的提问来源于stack exchange,提问作者A. Chithrai
相关产品推荐
相关产品推荐

