私のLaravel5.5アプリケーションでは、Postgresqlデータベースでselectクエリを実行するDB :: selectの呼び出しが失敗し、ApacheまたはLaravelのエラーログにエラーが表示されず、「接続がリセットされました」というメッセージが表示されます。このコードサンプルは、関数get_users_with_roles
が存在するため、期待どおりに実行されます。
public function missing_function(Request $request) {
try{
$all = DB::select('SELECT * from get_users_with_roles()', []);
}catch(Illuminate\Database\QueryException $qe){
return json_encode($qe->getMessage());
}
return json_encode($all);
}
ただし、そのSQL文字列を存在しない関数に置き換えると、次のようになります。
public function missing_function(Request $request) {
try{
$all = DB::select('SELECT * from test()', []);
}catch(Illuminate\Database\QueryException $qe){
return json_encode($qe->getMessage());
}
return json_encode($all);
}
接続がリセットされ、ログにエラーが表示されません。ネイティブのPostgresql環境でこの誤ったクエリを実行すると、次のようになります。
SELECT * from test();
明確なエラーメッセージが表示されます:
ERROR: function test() does not exist
LINE 1: select * from test()
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
この問題は一貫していないので、それは特に奇妙です。tryブロックがQueryExceptionをキャッチし、Postgresqlエラーメッセージを例外として表示することがあります。
追加してみました
php_flag xcache.cacher Off
php_flag xcache.size 0
php_flag xcache.stat Off
.htaccessファイルに移動しますが、役に立ちません。
アプリケーションでPostgresqlユーザー定義SQLおよびplpgsql関数に大きく依存しているため、DB :: selectメソッドを使用する機能が必要です。関連するSQLを作成し、プログラムでDB :: selectメソッドに渡す関数があるので、関数がない場合など、SQLにエラーが発生したときにスローされる例外をキャッチできる必要があります。
更新
この問題は、DB :: selectがSQLエラーを処理する方法にあるようです。存在するがSQLエラーをスローする関数でこれを試しました。繰り返しになりますが、PHPでtry / catchブロックを使用してこれをキャッチできるようにする代わりに、接続をリセットするだけで、LaravelログまたはApacheログのいずれにもエラーを記録しません。
この質問は何の光も当てません。そこで受け入れられた答えは、期待される行動を指します。私の環境では、QueryExceptionはスローまたはキャッチされません。
これのトリッキーな部分は、ブラウザがあらゆる形式のエラーメッセージを表示することを頑固に拒否したことです。その場合は、コマンドラインに移動して試してみるのが好きなので、変数としてのWebサーバーを削除します。
チャットから、コマンドラインに期待どおりのエラーが表示されたことがわかりましたが、正常に表示されませんでした。エラーが出力され、スクリプトが停止しました。これはハードクラッシュであり、Webサーバーに起因するものではありません。
の導入により\Throwable
、PHPが一生懸命に死ぬシナリオはますます少なくなっています。そこで、PHPの息を呑むような努力をするために、爆破する直前に何が言われたかを理解するために、register_shutdown_function
それを実装しerror_get_last
ました。
これにより、ブラウザにエラーメッセージが表示されました(今回は別のブラウザを使用)。しかし、これは再現できませんでした。この時点での洞察はキャッシングでした:composer dump-autoload
問題を修正しました!
私は何が起こったのかこれだと思います:
Eloquent
例外をスローしましたを実行することによりcomposer dump-autoload
、すべての「欠落している」クラスがオートローダーの範囲内に持ち込まれ、再試行すると、正しいコードシーケンスが発生しました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加