1. Laporkan kesalahan: "Tidak dapat menukar instance PDO saat dalam transaksi"
Dengan menanyakan kode sumber Laravel, Anda dapat mengonfirmasi bahwa pengecualian dilemparkan dalam metode setPdo :
<? phppublic function setpdo ($ pdo) {if ($ this-> transactions> = 1) {lempar runimeException baru ("tidak dapat menukar instance PDO saat dalam transaksi."); } $ this-> pdo = $ pdo; mengembalikan $ this;}?> Secara harfiah, kesalahan ini terjadi karena koneksi database diaktifkan saat transaksi dihidupkan. Namun, kadang -kadang, kesalahan ini dapat terjadi bahkan jika kode tidak secara eksplisit mengganti koneksi basis data. Misalnya, ketika kesalahan terjadi ketika menjalankan pernyataan kueri, sistem akan menggunakan metode tryAgainIfCausedByLostConnection untuk menentukan apakah masalah tersebut disebabkan oleh koneksi yang hilang. Jika demikian, sistem akan terhubung kembali melalui metode reconnect . Saat menghubungkan kembali, sistem akan melakukan beberapa pekerjaan pembersihan melalui metode disconnect , dan metode setPdo dipanggil.
Setelah mengklarifikasi penyebab dan konsekuensi, Anda secara alami akan tahu cara menyelesaikan masalah: periksa situasi jaringan dan konfirmasikan penyebab kehilangan koneksi database. Ini mungkin karena ada masalah dengan perangkat tertentu, atau mungkin karena pengaturan timeout yang tidak tepat. Metode yang relatif dirty adalah menjalankan metode DB::reconnect() sebelum meminta dan menghubungkan kembali ke database.
2. Kesalahan: "Tidak Dapat Menghapus Pekerjaan: Not_found"
Masalah ini sebenarnya tidak ada hubungannya dengan Laravel, tetapi disebabkan oleh kacang antrian.
Beanstalk
Untuk mengatasi masalah ini, Anda harus terlebih dahulu memahami siklus hidup sebuah pesan: Ketika sebuah pesan ditempatkan dalam antrian, ia memasuki keadaan READY , dan pada saat yang sama, itu akan mengaitkan timer TTR(time to run) untuk menunjukkan waktu pesan diizinkan untuk dijalankan. Ketika pesan ini dikonsumsi, ia memasuki keadaan RESERVED . Setelah konsumsi, pesan akan dihapus. Jika waktu konsumsi terlalu lama, lebih lama dari TTR , sistem akan berpikir bahwa konsumen telah menutup telepon, dan kemudian mengembalikan pesan dari keadaan RESERVED ke negara READY dan menyerahkannya kepada konsumen lain untuk pemrosesan ulang. Oleh karena itu, pesan yang sama dapat diproses oleh banyak konsumen. Konsumen pertama yang telah memprosesnya dapat menghapus pesan secara normal, sementara konsumen lain akan melaporkan kesalahan yang tidak dapat dihapus saat menghapus pesan.
Solusinya sangat sederhana. Pertama, Anda perlu memastikan bahwa pengaturan TTR tidak bisa terlalu kecil; Kedua, Beanstalk sebenarnya menyediakan perintah touch khusus untuk menyelesaikan masalah waktu eksekusi yang terlalu lama. Selain itu, kadang -kadang kita mungkin perlu mengunci pada tingkat aplikasi untuk menghindari situasi di mana pesan yang sama diproses oleh banyak konsumen pada saat yang sama.
3. Laporkan kesalahan: "Tidak ada hasil kueri untuk model"
Ketika Laravel membaca dan menulis pemisahan diaktifkan, konsumen dapat menerima kesalahan serupa saat memproses pesan. Perintah antrian dengan masalah potensial kira -kira sebagai berikut:
<? phpclass foo memperluas perintah mengimplementasikan diri sendiri, harus dibebaskan {menggunakan interactswithqueue, serializeSmodels; $ bar yang dilindungi; fungsi publik __construct ($ id) {$ this-> bar = bar :: find ($ id); } handle fungsi publik () {// $ this-> bar}}?> Jelas bahwa ketika Laravel membaca dan menulis pemisahan dihidupkan, karena keterlambatan master-slave, find mungkin tidak dapat meminta data yang sesuai. Setelah kami menganalisisnya di sini, ada kemungkinan bahwa metode penulisan akan dimodifikasi dengan berikut:
<? phpclass foo memperluas perintah mengimplementasikan diri sendiri, harus dibebaskan {menggunakan interactswithqueue, serializeSmodels; $ bar yang dilindungi; fungsi publik __construct ($ id) {$ this-> bar = bar :: oncriteconnection ()-> find ($ id); } handle fungsi publik () {// $ this-> bar}}?> Dengan kata lain, kueri disematkan ke server utama melalui metode onWriteConnection Laravel, tetapi sebenarnya tidak valid. Inti dari masalahnya adalah ketika deserialisasi, sistem akan memanggil findOrFail dari server.
<? PHPPRotected Function GetRestoredPropertyValue ($ value) {return $ value instanceof ModelIdentifier? (baru $ value-> class)-> findorfail ($ value-> id): $ value;}?> Karena kita tidak dapat HACK kerangka kerja, onWriteConnection tidak masuk akal. Bahkan, lihat masalah dari perspektif yang berbeda. Selama Anda serial, pastikan untuk tidak menggunakan objek basis data sebagai atribut:
<? phpclass foo memperluas perintah mengimplementasikan diri sendiri, harus dibebaskan {menggunakan interactswithqueue, serializeSmodels; Dilindungi $ ID; fungsi publik __construct ($ id) {$ this-> id = $ id; } public function handle () {$ bar = bar :: onWriteConnection ()-> find ($ this-> id); }}?>4. Ringkasan
Di atas adalah beberapa laporan kesalahan representatif dan solusi yang saya temui saat menggunakan Laravel. Jika Anda memiliki pertanyaan, jangan ragu untuk berkomunikasi satu sama lain. Saya harap artikel ini akan membantu untuk belajar atau bekerja semua orang.