Acabei de me deparar com um caso embaraçoso em que um set
em Silex Provider SessionServiceProvider continuava emitindo o seguinte erro fatal de PHP:
[14-Mar-2014 09:40:50 UTC] PHP Fatal error: Uncaught exception 'Exception' with message 'Serialization of 'Closure' is not allowed' in [no active file]:0
Stack trace:
#0 [internal function]: session_write_close()
#1 {main}
Dependendo da versão do PHP (ou seja, 5.4. *), Ele até interrompeu uma rota específica do aplicativo ou diminuiu sua velocidade enormemente, enquanto com outra versão do PHP (ou seja, 5.3. *) Ele apenas deixou uma entrada no log de erros do PHP mas por outro lado continuou trabalhando. Depois de algumas pesquisas iniciais no Google, fiquei convencido de que era um problema de PHP e APC. Ohhhhhh garoto, eu estava errado.
O verdadeiro problema aqui era uma tentativa de armazenamento de sessão de um objeto que continha uma referência (injetada via injeção de construtor) para uma SilexApplication
instância, que por sua vez referenciava vários fechamentos causando o erro fatal declarado acima. Como o objeto que causava essa confusão precisava apenas de alguns valores de configuração armazenados na instância Silex Application, a correção era injetar apenas esses valores em vez de toda a enchilada.
Outro forte conselho contra injetar um contêiner de serviço inteiro (ou seja SilexApplication
) em seus modelos ( especialmente se eles precisarem ser persistentes na sessão) e contra ser um sujeito preguiçoso. – Lição aprendida.