更新:问题已解决,请参阅评论(许多问题,版本差异只是其中之一)。
我正在尝试在config.yml文件中配置Symfony2中的会话。我有以下配置:
session:
default_locale: %locale%
lifetime: 7200
auto_start: true
storage_id: session.storage.pdo
parameters:
pdo.db_options:
db_table: session
db_id_col: session_id
db_data_col: session_value
db_time_col: session_time
services:
pdo:
class: PDO
arguments:
- "mysql:dbname=%database_name%"
- %database_user%
- %database_password%
session.storage.pdo:
class: Symfony\Component\HttpFoundation\SessionStorage\PdoSessionStorage
arguments: [@pdo, %session.storage.options%, %pdo.db_options%]
它基于Symfony2的食谱http://symfony.com/doc/2.0/cookbook/configuration/pdo_session_storage.html
我创建了与给定链接完全相同的表格。
然而,它不起作用。我收到一些“空白”错误(没有错误消息,但“PDO Exception”和“Error Exception”)。我承认我对配置Symfony2或任何信息都知之甚少(这就是我使用cookbook的原因)。我失去了很多时间,并没有在互联网上看到太多关于它的文档,没有提到互联网对这种情况非常沉默的事实(将会话存储到Symfony2中的数据库表)。
我的NetBeans对最后一行“大喊大叫”:
arguments: [@pdo, %session.storage.options%, %pdo.db_options%]
“ScannerException在扫描下一个令牌时我们找到了这个无法启动任何令牌的字符@(64)”。
更新: 嗯,现在我不确定它是否与配置有关。我可以看到Symfony2的cookbook(use ...)示例实际上与Symfony2的包中的文件结构不匹配。总而言之,没有这样的文件路径,但在放入真实路径之后,它仍然不起作用。
答案 0 :(得分:4)
我和Symfony 2.5有同样的问题。事实证明我的解决方案是在php.ini中禁用session.auto_start。如果在PDO有机会控制它之前启动会话,PdoSessionStorage将不会接管。我起初忽略了这一点,因为我正在修改错误的一个(我有两个php.ini副本)。要检查这是否是您的问题,请运行以下命令:
echo ini_get('session.auto_start');
如果返回' 1'或者' true'然后一定要在你的php.ini中设置:
session.auto_start = 0
因此,作为参考,这是我使用Symfony 2.5进行设置的设置:
<强> config.yml 强>
framework:
session:
handler_id: session.handler.pdo
parameters:
pdo.db_options:
db_table: session
db_id_col: session_id
db_data_col: session_value
db_time_col: session_time
services:
session.handler.pdo:
class: Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler
arguments: ["@pdo", "%pdo.db_options%"]
pdo:
class: PDO
arguments:
dsn: "mysql:host=%database_host%;port=%database_port%;dbname=%database_name%"
user: "%database_user%"
password: "%database_password%"
calls:
- [setAttribute, [3, 2]] # \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION