如何在原生PHP应用与Laravel应用之间实现Session共享
跨端口原生PHP与Laravel Session共享解决方案
核心问题集中在三个层面:Session Cookie参数不统一、存储介质未共享、Laravel默认Session逻辑和原生PHP隔离,按照以下步骤配置即可解决:
1. 统一两边Session Cookie配置
确保两个应用可以拿到同一个Session ID:
- 原生PHP端(在入口文件
session_start()之前添加配置):
// 两边Session名称必须完全一致 session_name('common_app_session'); // Cookie参数全局对齐 session_set_cookie_params([ 'lifetime' => 86400, 'path' => '/', 'domain' => '.localhost', 'secure' => false, // 上线用HTTPS时改为true 'httponly' => true, 'samesite' => 'Lax' ]); session_start();
- Laravel端(修改
.env对应配置即可):
SESSION_COOKIE=common_app_session SESSION_DOMAIN=.localhost SESSION_PATH=/ SESSION_SECURE_COOKIE=false SESSION_HTTP_ONLY=true SESSION_SAME_SITE=lax
2. 统一Session存储介质
两边必须读取同一份Session数据,之前的cookie、native驱动无效就是因为存储未共享,推荐两种方案:
方案A:Redis公共存储(推荐,无权限冲突性能好)
- 确保两个应用都连接同一个Redis实例,安装对应Redis扩展
- 原生PHP端添加配置(
session_start()之前):
ini_set('session.save_handler', 'redis'); ini_set('session.save_path', 'tcp://127.0.0.1:6379'); ini_set('session.serialize_handler', 'php');
- Laravel端修改
.env配置:
SESSION_DRIVER=redis REDIS_HOST=127.0.0.1 REDIS_PORT=6379
注意:要把Laravelconfig/database.php中Redis配置的prefix参数设为空,和原生PHP Redis Session的默认key前缀PHPREDIS_SESSION:对齐
方案B:本地文件共享存储(适合本地测试无需额外服务)
- 新建公共Session存储目录,比如
/home/www/common_sessions,给web服务运行用户开读写权限 - 原生PHP端添加配置(
session_start()之前):
session_save_path('/home/www/common_sessions');
- Laravel端修改
config/session.php的files参数:
'files' => '/home/www/common_sessions',
3. Laravel兼容原生Session逻辑
Laravel默认会接管Session启动,要直接读原生Session可添加全局中间件:
- 新建
app/Http/Middleware/StartNativeSession.php:
<?php namespace App\Http\Middleware; use Closure; class StartNativeSession { public function handle($request, Closure $next) { if (session_status() === PHP_SESSION_NONE) { session_start(); } return $next($request); } }
- 注册到
app/Http/Kernel.php的$middleware数组最顶部:
protected $middleware = [ \App\Http\Middleware\StartNativeSession::class, // 其余原有中间件放在后面 ];
配置完成后可直接在Laravel任意位置通过$_SESSION全局变量读写原生PHP应用的Session数据。
排查指引
- 两边Session ID不一致:检查Cookie的name、domain、secure参数是否完全对齐,本地测试可修改hosts用自定义域名(比如
test.local)避免localhost特殊浏览器规则 - Session ID一致但内容为空:检查存储介质配置是否正确,文件存储要确认两边都有目录读写权限,Redis要确认连接的是同一个实例
内容的提问来源于stack exchange,提问作者userDuR
相关产品推荐
相关产品推荐

