php - 旧版 Symfony 项目:PHP 警告:session_start():会话 ID 太长或包含非法字符
问题描述
我正在尝试在带有 Ubuntu 18.x 的 Vagrant Box 中部署旧版 Symfony 1.4(实际上是通过 FriendsOfSymfony1 [1] 获得的 Symfon 1.5)项目。我的 PHP 版本是 7.2.x(参见 [2])一切正常,站点加载,但我收到此错误(并且无法完成对旧站点的登录):
[Fri Feb 07 14:51:53.880189 2020] [php7:warn] [pid 2831] [client 10.0.2.2:63895] PHP 警告:session_start():会话 id 太长或包含非法字符,有效字符为 az , AZ, 0-9 和 '-,' 在 /home/vagrant/swdev/lib/vendor/lexpress/symfony1/lib/storage/sfSessionStorage.class.php 第 95 行,引用:http://127.0.0.1: 8080/frontend_dev.php/registration/
[Fri Feb 07 14:51:53.880478 2020] [php7:warn] [pid 2831] [client 10.0.2.2:63895] PHP 警告:session_start():读取会话数据失败:文件(路径:/var/lib/ php/sessions) 在第 95 行的 /home/vagrant/swdev/lib/vendor/lexpress/symfony1/lib/storage/sfSessionStorage.class.php,参考:http: //127.0.0.1 :8080/frontend_dev.php/registration /
这里已经有讨论了:会话id太长或者包含非法字符,有效字符是az、AZ、0-9和'-,'但是并没有解决我的问题。
相关的代码片段(第 95 行)在这里:
设置 的代码session_id
在同一个文件中,从第 52 行开始:
public function initialize($options = null)
{
$cookieDefaults = session_get_cookie_params();
$options = array_merge(array(
'session_name' => 'symfony',
'session_id' => null, // <=============== HERE
'auto_start' => true,
'session_cookie_lifetime' => $cookieDefaults['lifetime'],
'session_cookie_path' => $cookieDefaults['path'],
'session_cookie_domain' => $cookieDefaults['domain'],
'session_cookie_secure' => $cookieDefaults['secure'],
'session_cookie_httponly' => isset($cookieDefaults['httponly']) ? $cookieDefaults['httponly'] : false,
'session_cache_limiter' => null,
), $options);
// initialize parent
parent::initialize($options);
此链接提到这是一个 PHP 7.1 问题(我有 PHP 7.2!?),并且您不能使用null
as session_id
(就像上面的代码一样)。所以我改变了
'session_id' => null,
至
'session_id' => '',
然后我通过清除缓存./symfony cc
,然后重新启动apache,但仍然:我得到PHP警告重新会话ID。
Memcached 相关?
也许相关:查看遗留代码,我意识到会话存储是在我的factories.yml
文件中定义的,如下所示:
(snip)
storage:
class: sfCacheSessionStorage
param:
session_name: prx
cache:
class: sfMemcacheCache #[required] define the cache strategy
param:
servers: # Array of servers
localserver:
host: localhost # hostname or IP of mamcache server
port: 11211 # default memcache port
(snip)
Memcached 已安装并正在运行:
vagrant@ubuntu-bionic:~/swdev$ ps aux | grep -i memc
memcache 1002 0.0 0.3 424764 3036 ? Ssl 13:50 0:01 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1 -P /var/run/memcached/memcached.pid
vagrant 3289 0.0 0.1 13136 1108 pts/0 S+ 15:42 0:00 grep --color=auto -i memc
脚注
[1] 我使用的是来自 FriendsOfSymfony1 的更新,而不是 Symfony 1.4
https://github.com/FriendsOfSymfony1/symfony1
[2] PHP版本
PHP 7.2.24-0ubuntu0.18.04.2
解决方案
问题不是 FOS 代码,而是调用它的代码。您可以看到它将 FOS 阵列与您的$options
阵列合并。请检查堆栈跟踪以获取此方法的调用,并查看$options
参数来自何处。在那里解决它将解决ID太长的问题。
编辑:我使用您正在使用的 PHP 7.2 进行了一些检查,我猜应该对那里的代码进行一些 PR 并将代码更改为:
$options = array_merge([
'name' => 'symfony',
/**
* Cannot be set becasue is not an session option
* @see: https://www.php.net/manual/en/session.configuration.php
*/
//'session_id' => null,
/**
* Cannot be set becasue of PERDIR
* @see: https://www.php.net/manual/en/configuration.changes.modes.php
*/
//'auto_start' => '0',
'cookie_lifetime' => $cookieDefaults['lifetime'],
'cookie_path' => $cookieDefaults['path'],
'cookie_domain' => $cookieDefaults['domain'],
'cookie_secure' => $cookieDefaults['secure'],
'cookie_httponly' => isset($cookieDefaults['httponly']) ? $cookieDefaults['httponly'] : false,
/**
* Only allows specified string values, defaults to nocache, not null
*/
'cache_limiter' => 'nocache',
], $options);
推荐阅读
- crystal-reports - 水晶报表语言中的列表比较行为
- .net - SQL 函数的表类型输入的 Null、Empty 或默认值
- html - 字体样式:斜体更改 Chrome 上的输入大小?
- python - Pandas 相当于 sql 的月份日期时间
- javascript - 如何检查函数是否执行任何操作?
- javascript - enableWhiteboard() 函数在 Circuit SDK 中收到带有 SERVICE_EXCEPTION 错误的响应
- assembly - X86:寻址方式——寄存器值变化
- enums - 如何传递枚举变量以匹配作为函数参数?
- javascript - 无法使用带有 babel loader 的 web-pack 编译 JSX
- html - 图像地图圈将只允许点击图像的顶线和底线