【问题标题】:Symfony legacy session issues, porting a massive project slowlySymfony 遗留会话问题,缓慢移植大型项目
【发布时间】:2016-12-04 19:04:21
【问题描述】:

好的,所以我们有了这个 MASSIVE 裸机 php 项目,我们想慢慢地转换成 Symfony3

这是一个不断变化和更新的项目,因此我们需要它保持透明,以确保不会扰乱使用它的人。他们根本不应该注意到差异。

所以我们决定尝试的解决方案是这样的:

  1. 将整个应用粘贴到/web
  2. 将验证器脚本保留在旧应用程序中(移植到新应用程序太复杂,然后更新旧应用程序以使用新会话系统),因为它所做的只是设置几个 $_SESSION 密钥
  3. 应用程序中没有其他地方设置任何会话变量,只有身份验证器。

问题是Legacy Bridge 和一些choice stack overflow 的配置所带来的痛苦并没有让我们得到任何结果。

  1. 使用网桥
    使用the bridge as this doc says 进行配置不会影响任何事情,只是它正在读取的会话没有添加到$_SESSION['_sf2_attributes'] assoc 或其他任何地方。

  2. 使用桥接组件
    根据描述使用PhpBridgeSessionStorage 组件的this document,配置后将输出如下:

classes.php 第 83 行中的 ContextErrorException: 警告:ini_set():会话处于活动状态。您目前无法更改会话模块的 ini 设置

当我将它与第一种方法结合使用时,它完全类似于第一种方法。它可以工作,但我在 symfony 控制器中的旧版应用程序中绝对没有看到任何会话数据集

DefaultController.php on line 16:
array:3 [▼
  "_sf2_attributes" => & []
  "_sf2_flashes" => & []
  "_sf2_meta" => & array:3 [▼
    "u" => 1469839893
    "c" => 1469836213
    "l" => "0"
  ]
]
DefaultController.php on line 17:
Session {#2519 ▼
  #storage: PhpBridgeSessionStorage {#2520 ▼
    #bags: array:2 [▼
      "attributes" => AttributeBag {#2218 ▼
        -name: "attributes"
        -storageKey: "_sf2_attributes"
        #attributes: & []
      }
      "flashes" => FlashBag {#2219 ▼
        -name: "flashes"
        -flashes: & []
        -storageKey: "_sf2_flashes"
      }
    ]
    #started: true
    #closed: false
    #saveHandler: SessionHandlerProxy {#2522 ▼
      #handler: SessionHandler {#2217}
      #wrapper: true
      #saveHandlerName: "files"
    }
    #metadataBag: MetadataBag {#2521 ▼
      -name: "__metadata"
      -storageKey: "_sf2_meta"
      #meta: & array:3 [▼
        "u" => 1469839893
        "c" => 1469836213
        "l" => "0"
      ]
      -lastUsed: 1469839892
      -updateThreshold: "0"
    }
  }
  -flashName: "flashes"
  -attributeName: "attributes"
}
  1. 使用监听器
    这个问题最流行的“解决方案”之一是this one from this SO answer

但是在设置时,在app/config/services.yml 中设置一个监听器,如下所示: services: session.legacy: class: AppBundle\Session\LegacySessionHandler tags: - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

我们收到这样的错误:

NativeSessionStorage.php 第 240 行中的 LogicException:无法注册 会话已经开始时打包。

我了解此解决方案的目的,但它给我带来了两个问题:

我觉得当kernel.request 触发并且我的类方法被调用时,该事件应该仍然会看到存储在$_SESSION 超级全局中的symfony 上下文之外的实际真实数据集。因为它应该通过 $_SESSION assoc 循环并将该数据应用于新包。

第一个问题是没有什么可设置的。在会话关联中找到的旧版应用程序中没有设置监听器必须使用的密钥

第二个问题是,由于某种原因,我被阻止注册一个新包...

  1. “F-it”方法

因为当我 var_dump$_SESSION 超级全局时,我可以在旧版应用程序中看到像 _sf2_attributes 这样的密钥,所以我决定嘿为什么不让身份验证器将其密钥转储到 _sf2_attributes 密钥而不是根!

这也不起作用。就像,完全一样。它没有出现在我的 symfony 控制器中。


我快到这里了。这是一个错误,这是设计使然吗?

【问题讨论】:

  • 您的会话 INI 设置是什么,在您的旧会话开始之后和 Symfony 启动之前,Symfony 可以看到这些设置?

标签: php session symfony


【解决方案1】:

我遇到了同样的问题,并通过在 config.yml 中添加它来解决它:

session: 
        storage_id: session.storage.native
        handler_id: session.handler.native_file
        save_path: ~

为了调试,我在两个地方使用了以下 PHP 代码:1) 在旧脚本中。 2)在symfony控制器中。

$sessPath   = ini_get('session.save_path');
$sessCookie = ini_get('session.cookie_path');
$sessName   = ini_get('session.name');

echo '<br>sessPath: ' . $sessPath;
echo '<br>sessCookie: ' . $sessCookie;
echo '<br>sessName: ' . $sessName;

我的问题是 symfony 与旧版应用程序的 session.save_path 不同。因此,symfony 代码无法访问我遗留的 $_SESSION 变量。

添加,以下行 config.yml 修复了问题:

保存路径:~

修复这个问题后,symfony 控制器代码可以直接看到所有 $_SESSION 变量:

echo "<pre>"; print_r($_SESSION); echo "</pre>";

不需要另一个stackoverflow问题中提到的“class LegacySessionHandler实现EventSubscriberInterface”解决方案。 (这个问题的第 3 部分)

【讨论】:

    猜你喜欢
    • 2020-02-05
    • 1970-01-01
    • 2011-04-27
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 2022-12-28
    • 2011-04-15
    • 1970-01-01
    相关资源
    最近更新 更多