旧版Symfony项目:PHP警告:session_start():会话id太长或包含非法字符
我正试图在Ubuntu18.x的一个流浪者盒子中部署一个遗留的symfony1.4(实际上是通过FriendsOfSymfony1[1]部署的symfon1.5)项目。我的PHP版本是7.2.x(请参见[2]),一切正常,站点加载,但我收到了此错误(无法完成登录到旧站点): [Fri Feb 07 14:51:53.8801892020][php7:warn][pid 2831][client 10.0.2.2:63895]PHP警告:session_start():会话id太长或包含非法字符,有效字符为a-z、a-z、0-9和“-”,在/home/vagrant/swdev/lib/vendor/lexpress/symfony1/lib/storage/sfSessionStorage.class.PHP第95行,请参考: [Fri Feb 07 14:51:53.880478 2020][php7:warn][pid 2831][client 10.0.2.2:63895]PHP警告:session_start():无法读取第95行/home/vagrant/swdev/lib/vendor/lexpress/symfony1/lib/storage/sfSessionStorage.class.PHP中的会话数据:文件(路径:/var/lib/PHP/sessions),请参考: 这里已经有一个讨论:但它并不能解决我的问题 相关代码段(第95行)如下所示: 设置会话id的代码位于同一文件中,第52行之后:旧版Symfony项目:PHP警告:session_start():会话id太长或包含非法字符,php,symfony,Php,Symfony,我正试图在Ubuntu18.x的一个流浪者盒子中部署一个遗留的symfony1.4(实际上是通过FriendsOfSymfony1[1]部署的symfon1.5)项目。我的PHP版本是7.2.x(请参见[2]),一切正常,站点加载,但我收到了此错误(无法完成登录到旧站点): [Fri Feb 07 14:51:53.8801892020][php7:warn][pid 2831][client 10.0.2.2:63895]PHP警告:session_start():会话id太长或包含非法字符,
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);
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] 我使用的不是Symfony 1.4,而是FriendsOfSymfony1的更新
[2] PHP版本
PHP 7.2.24-0ubuntu0.18.04.2
问题不在于FOS代码,而在于调用它的代码。 您可以看到它将FOS阵列与您的
$options
阵列合并。
请检查stacktrace以获取此方法的调用,并查看$options
参数的来源。
在那里解决它将解决ID过长的问题
编辑:我使用您正在使用的PHP7.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);
删除浏览器cookie(来自[1]的提示)似乎可以解决问题。但现在我有另一个错误[2]。但这是另一个问题
[1] 看
[2] 下一个错误
[Fri Feb 07 18:22:01.701138 2020][php7:warn][pid 3200][client 10.0.2.2:59612]PHP警告:ini_set():会话处于活动状态。此时无法在第257行的/home/vagrant/swdev/lib/vendor/lexpress/symfony1/lib/user/sfBasicSecurityUser.class.php中更改会话模块的ini设置
然后尝试登录到我的旧版应用程序,我得到以下错误日志:
[Fri Feb 07 18:22:10.272147 2020][php7:warn][pid 3610][client 10.0.2.2:59628]PHP警告:ini_set():会话处于活动状态。此时无法在第257行的/home/vagrant/swdev/lib/vendor/lexpress/symfony1/lib/user/sfBasicSecurityUser.class.php中更改会话模块的ini设置,请参考:
[Fri Feb 07 18:22:10.360800 2020][php7:warn][pid 3610][client 10.0.2.2:59628]PHP警告:ini_set():会话处于活动状态。此时无法在第257行的/home/vagrant/swdev/lib/vendor/lexpress/symfony1/lib/user/sfBasicSecurityUser.class.php中更改会话模块的ini设置,请参考:
[Fri Feb 07 18:22:10.826885 2020][php7:warn][pid 3521][client 10.0.2.2:59629]PHP警告:ini_set():会话处于活动状态。此时无法在第257行的/home/vagrant/swdev/lib/vendor/lexpress/symfony1/lib/user/sfBasicSecurityUser.class.php中更改会话模块的ini设置,请参考:
[Fri Feb 07 18:22:11.717016 2020][php7:notice][pid 3521][client 10.0.2.2:59629]结果缓存驱动程序未初始化,请参阅:
好的,我意识到在合并之前,
session\u id
是null
。因此,我在合并后检查它是否为null
,如果是:我将它设置为空字符串。但我还是得到了PHP警告。显然,该警告排除了合法字符的空格。所以我使用了破折号作为默认值。没有成功,请您通过pastebin在这一行的正上方共享$this->options
的var_dump?我还原了我的更改(将会话id
设置为空字符串)并创建了vardump:是的,这个错误是有意义的,因为数组合并仅使用空会话id值,如果它还不存在的话。这意味着,会话没有提前启动,此时自动启动也不会有任何帮助。我猜您的核心问题在这里是飘忽不定的,因为我看到它可能无法访问映像中配置的路径,请参阅描述该问题的页面:
$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);