1.エラーを報告します:「トランザクション内でPDOインスタンスを交換できません」
Laravelソースコードを照会することにより、例外がsetPdoメソッドでスローされていることを確認できます。
<?phppublic function setpdo($ pdo){if($ this-> transactions> = 1){throw new runtimeException( "トランザクション内でpdoインスタンスを交換できません。"); } $ this-> pdo = $ pdo; $ this;}?>を返します文字通り、このエラーは、トランザクションがオンになっているときにデータベース接続が切り替えられるために発生します。ただし、コードがデータベース接続を明示的に切り替えない場合でも、このエラーが発生する場合があります。たとえば、クエリステートメントの実行時にエラーが発生すると、システムはtryAgainIfCausedByLostConnectionメソッドを使用して、問題が失われた接続によって引き起こされるかどうかを判断します。その場合、システムはreconnectメソッドを介して再接続します。再接続すると、システムはdisconnect方法を介していくつかのクリーニング作業を実行し、 setPdoメソッドが呼び出されます。
原因と結果を明確にした後、問題を解決する方法を自然に知っています。ネットワークの状況を確認し、データベース接続の損失の原因を確認します。これは、特定のデバイスに問題があるため、またはtimeout設定が不適切なためかもしれません。比較的dirty方法は、データベースをクエリして再接続する前に、 DB::reconnect()メソッドを実行することです。
2。エラー:「ジョブを削除できない:not_found」
この問題は実際にはLaravelとは何の関係もありませんが、キューサービスのBeanStalkによって引き起こされます。
BeanStalk
この問題を解決するには、最初にメッセージのライフサイクルを理解する必要があります。メッセージがキューに配置されると、 READY状態になり、同時にTTR(time to run)タイマーを関連付けて、メッセージの実行が許可される時間を示します。このメッセージが消費されると、 RESERVED状態に入ります。消費後、メッセージは削除されます。消費時間が長すぎてTTRよりも長い場合、システムは消費者が電話を切ったと考え、 RESERVED状態から準備READY状態にメッセージを返し、再処理のために別の消費者に引き渡します。したがって、同じメッセージが複数の消費者によって処理される場合があります。それを処理した最初の消費者はメッセージを正常に削除できますが、他の消費者はメッセージを削除するときに削除できないエラーを報告します。
ソリューションは非常にシンプルです。まず、 TTR設定が小さすぎないことを確認する必要があります。第二に、 Beanstalk実際に、実行時間が長すぎるという問題を解決するための特別なtouchコマンドを提供します。さらに、複数の消費者によって同じメッセージが処理される状況を回避するために、アプリケーションレベルでロックする必要がある場合があります。
3.エラーを報告します:「モデルのクエリ結果はありません」
Laravelの読み取りと書き込みの分離がアクティブになると、消費者はメッセージを処理するときに同様のエラーを受信する場合があります。潜在的な問題を抱えるキューコマンドは、ほぼ次のとおりです。
<?phpclass foo extendsコマンドを実装する自己扱いは、bequeued {interationswithqueue、serializesmodelsを使用する必要があります。保護された$ bar;パブリック関数__construct($ id){$ this-> bar = bar :: find($ id); } public function handle(){// $ this-> bar}}?> Master-Slaveの遅延のために、Laravelの読み取りと書き込みの分離がオンになった場合、 find対応するデータを照会できない可能性があることは明らかです。ここで分析すると、ライティング方法が次のように変更される可能性があります。
<?phpclass foo extendsコマンドを実装する自己扱いは、bequeued {interationswithqueue、serializesmodelsを使用する必要があります。保護された$ bar; public function __construct($ id){$ this-> bar = bar :: onwriteconnection() - > find($ id); } public function handle(){// $ this-> bar}}?>つまり、クエリはLaravelのonWriteConnectionメソッドを介してメインサーバーに固定されますが、実際には無効です。問題の核心は、脱出すると、システムがサーバーからfindOrFail呼び出すことです。
<?phpptortected関数getRestoredPropertyValue($ value){return $ value instance of modelidentifier? (new $ value-> class) - > findorfail($ value-> id):$ value;}?>フレームワークにHACKできないため、 onWriteConnection意味がありません。実際、別の視点から問題を見てください。シリアル化されている限り、データベースオブジェクトを属性として使用しないようにしてください。
<?phpclass foo extendsコマンドを実装する自己扱いは、bequeued {interationswithqueue、serializesmodelsを使用する必要があります。保護された$ id; public function __construct($ id){$ this-> id = $ id; } public function handle(){$ bar = bar :: onwriteconnection() - > find($ this-> id); }}?>4。概要
上記は、Laravelを使用するときに遭遇したいくつかの代表的なエラーレポートとソリューションです。ご質問がある場合は、お互いにお気軽にコミュニケーションをとってください。この記事が皆の勉強や仕事に役立つことを願っています。