首页 > 解决方案 > 旧版 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 行)在这里:

https://github.com/FriendsOfSymfony1/symfony1/blob/d9e3f17e246ed90590c4e5175f1cec39f4a68254/lib/storage/sfSessionStorage.class.php#L95

设置 的代码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!?),并且您不能使用nullas 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

标签: phpsymfony

解决方案


问题不是 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);

推荐阅读