1. Relate um erro: "Não é possível trocar a instância da PDO enquanto estiver dentro da transação"
Ao consultar o código -fonte do Laravel, você pode confirmar que a exceção é lançada no método setPdo :
<? Phpppublic função setpdo ($ PDO) {if ($ this-> transactions> = 1) {lança nova runtimeException ("Não é possível trocar a instância do PDO enquanto estiver dentro da transação."); } $ this-> PDO = $ PDO; retornar $ this;}?> Literalmente, esse erro ocorre porque a conexão do banco de dados é alterada quando a transação é ativada. No entanto, às vezes, esse erro pode ocorrer mesmo que o código não alterne explicitamente as conexões do banco de dados. Por exemplo, quando ocorre um erro ao executar uma declaração de consulta, o sistema usará o método tryAgainIfCausedByLostConnection para determinar se o problema é causado por uma conexão perdida. Nesse caso, o sistema se reconectará através do método reconnect . Ao se reconectar, o sistema executará algum trabalho de limpeza através do método disconnect , e setPdo é chamado.
Depois de esclarecer as causas e consequências, você saberá naturalmente como resolver o problema: verifique a situação da rede e confirme a causa da perda de conexão do banco de dados. Isso pode ocorrer porque há um problema com um determinado dispositivo, ou pode ser devido a configurações inadequadas timeout . Um método relativamente dirty é executar DB::reconnect() antes de consultar e se reconectar ao banco de dados.
2. Erro: "Não é possível excluir o trabalho: não_found"
Esse problema na verdade não tem nada a ver com o Laravel, mas é causado pelo serviço de serviço da fila.
Beanstalk
Para resolver esse problema, você precisa primeiro entender o ciclo de vida de uma mensagem: quando uma mensagem é colocada na fila, ela entra no estado READY e, ao mesmo tempo, associará um timer TTR(time to run) para indicar o tempo que a mensagem pode executar. Quando esta mensagem é consumida, ela entra no estado RESERVED . Após o consumo, a mensagem será excluída. Se o tempo de consumo for muito longo, mais longo que TTR , o sistema pensará que o consumidor pendurou e retornará a mensagem do estado RESERVED ao estado READY e entregá -lo a outro consumidor para reprocessamento. Portanto, a mesma mensagem pode ser processada por vários consumidores. O primeiro consumidor que o processou pode excluir a mensagem normalmente, enquanto os outros consumidores relatarão um erro que não pode ser excluído ao excluir a mensagem.
A solução é muito simples. Primeiro, você precisa garantir que TTR não possa ser muito pequena; Segundo, Beanstalk realmente fornece um comando touch especial para resolver o problema do tempo de execução muito longo. Além disso, às vezes podemos precisar travar o nível de aplicativo para evitar a situação em que a mesma mensagem é processada por vários consumidores ao mesmo tempo.
3. Relate um erro: "Não há resultados de consulta para o modelo"
Quando a separação de leitura e gravação do Laravel é ativada, um consumidor pode receber um erro semelhante ao processar mensagens. Um comando de fila com problemas em potencial é aproximadamente o seguinte:
<? phpclass foo estende o comando implementa o auto -manipulação, deve ser considerado {use interactSwithQueue, serializaModels; $ barra protegido; função pública __construct ($ id) {$ this-> bar = bar :: find ($ id); } função pública Handle () {// $ this-> bar}}?> É óbvio que, quando a separação de leitura e gravação do Laravel está ligada, devido ao atraso do escravo mestre, find pode não ser capaz de consultar os dados correspondentes. Depois de analisá -lo aqui, é provável que o método de escrita seja modificado para o seguinte:
<? phpclass foo estende o comando implementa o auto -manipulação, deve ser considerado {use interactSwithQueue, serializaModels; $ barra protegido; função pública __construct ($ id) {$ this-> bar = bar :: onWritEConnection ()-> find ($ id); } função pública Handle () {// $ this-> bar}}?> Ou seja, a consulta é fixada no servidor principal através do método onWriteConnection de Laravel, mas é realmente inválido. O ponto crucial do problema é que, quando a desserialização, o sistema chamará findOrFail do servidor.
<? Phpprotected Função getRestoredPropertyValue ($ valor) {return $ value Instância do ModelIdentifier? (novo $ valor-> classe)-> findorfail ($ value-> id): $ value;}?> Como não podemos HACK a estrutura, onWriteConnection não faz sentido. De fato, observe o problema de uma perspectiva diferente. Desde que você esteja serializado, certifique -se de não usar objetos de banco de dados como atributos:
<? phpclass foo estende o comando implementa o auto -manipulação, deve ser considerado {use interactSwithQueue, serializaModels; $ ID protegido; função pública __construct ($ id) {$ this-> id = $ id; } public function handle () {$ bar = bar :: owriteConnection ()-> find ($ this-> id); }}?>4. Resumo
Os acima são vários relatórios e soluções de erros representativos que encontrei ao usar o Laravel. Se você tiver alguma dúvida, sinta -se à vontade para se comunicar. Espero que este artigo seja de ajuda para estudar ou trabalhar de todos.