旧版Symfony项目:PHP警告:session_start():会话id太长或包含非法字符

旧版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太长或包含非法字符,

我正试图在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行之后:

  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);