【问题标题】:Legacy Symfony project: PHP Warning: session_start(): The session id is too long or contains illegal characters旧版 Symfony 项目:PHP 警告:session_start():会话 ID 太长或包含非法字符
【发布时间】:2020-05-23 18:05:20
【问题描述】:

我正在尝试在带有 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 太长或包含非法字符,有效/home/vagrant/swdev/lib/vendor/lexpress/symfony1/lib/storage/sfSessionStorage.class.php 第 95 行中的字符是 az、AZ、0-9 和 '-,',引用者: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) 在 /home/vagrant/swdev/lib/vendor/lexpress/symfony1/lib/storage/sfSessionStorage.class.php 第 95 行,引用者:http://127.0.0.1:8080/frontend_dev.php/registration/

这里已经有讨论了:The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' 但是并没有解决我的问题。

相关代码sn-p(第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);

This link 提到这是一个 PHP 7.1 问题(我有 PHP 7.2!?),并且您不能将 null 用作 session_id(就像上面的代码一样)。所以我改变了

'session_id' =&gt; null,

'session_id' =&gt; '',

然后我通过./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

【问题讨论】:

    标签: php symfony


    【解决方案1】:

    删除浏览器 cookie(来自 [1] 的提示)似乎可以解决问题。但现在我有另一个错误[2]。但这是关于 SO 的另一个问题。

    [1] 见https://stackoverflow.com/a/28024487/5115219

    [2] 下一个错误

    [2020 年 2 月 7 日星期五 18:22:01.701138] [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 设置

    然后尝试登录我的旧版应用程序,我收到以下错误日志:

    [2020 年 2 月 7 日星期五 18:22:10.272147] [php7:warn] [pid 3610] [client 10.0.2.2:59628] PHP 警告:ini_set():会话处于活动状态。此时您无法在 /home/vagrant/swdev/lib/vendor/lexpress/symfony1/lib/user/sfBasicSecurityUser.class.php 的第 257 行更改会话模块的 ini 设置,referer:http://127.0.0.1:8080/frontend_dev.php/registration/

    [2020 年 2 月 7 日星期五 18:22:10.360800] [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 设置,referer:http://127.0.0.1:8080/frontend_dev.php/registration/

    [2020 年 2 月 7 日星期五 18:22:10.826885] [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 设置,引用者:http://127.0.0.1:8080/frontend_dev.php/registration/

    [Fri Feb 07 18:22:11.717016 2020] [php7:notice] [pid 3521] [client 10.0.2.2:59629] 结果缓存驱动程序未初始化,引用者:http://127.0.0.1:8080/frontend_dev.php/registration/

    【讨论】:

      【解决方案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);
      

      【讨论】:

      • 好的,我意识到在合并之前session_idnull。所以我在合并后检查它是否是null,如果是:我将它设置为一个空字符串。但我仍然收到 PHP 警告。
      • 显然警告排除了合法字符的空格。所以我使用破折号作为默认值。没有成功
      • github.com/FriendsOfSymfony1/symfony1/blob/… 你能通过 pastebin 分享$this-&gt;options 的var_dump吗?
      • 我恢复了我的更改(将session_id 设置为空字符串)并创建了vardump:pastebin.com/LsgwSRYP
      • 是的,这个错误是有道理的,因为数组合并只使用了 NULL session_id 值,如果它不存在的话。这意味着,会话没有更早开始,此时 auto_start 无论如何也无济于事。我猜您的 CORE 问题在这里是 vagrant,因为我看到它可能无法访问您图像中配置的路径,请参阅描述该问题的页面:stackoverflow.com/questions/37707905/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 2011-06-13
      • 2011-03-12
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      相关资源
      最近更新 更多