Masalah
saya memiliki formulir yang, ketika dikirimkan, akan menjalankan kode dasar untuk memproses informasi yang dikirimkan dan memasukkannya ke dalam database untuk ditampilkan di situs web notifikasi. Selain itu, saya memiliki daftar orang yang telah mendaftar untuk menerima pemberitahuan ini melalui email dan pesan SMS. Daftar ini sepele saat ini (hanya mendorong sekitar 150), namun cukup untuk menyebabkan perlu lebih dari satu menit untuk menelusuri seluruh tabel pelanggan dan mengirim 150+ email. (Email dikirim secara individual seperti yang diminta oleh administrator sistem server email kami karena kebijakan email massal.)
Selama waktu ini, individu yang mengeposkan lansiran akan duduk di halaman terakhir formulir selama hampir satu menit tanpa penguatan positif bahwa pemberitahuan mereka sedang diposkan. Hal ini menyebabkan masalah potensial lainnya, semua itu memiliki solusi yang mungkin saya rasa kurang ideal.
Pertama, pengepos mungkin mengira server sedang lamban dan mengklik tombol 'Kirim' lagi, menyebabkan skrip dimulai kembali atau dijalankan dua kali. Saya bisa menyelesaikan ini dengan menggunakan JavaScript untuk menonaktifkan tombol dan mengganti teks untuk mengatakan sesuatu seperti 'Memproses ...', namun ini kurang dari ideal karena pengguna masih akan terjebak di halaman selama eksekusi skrip. (Selain itu, jika JavaScript dinonaktifkan, masalah ini masih ada.)
Kedua, poster mungkin menutup tab atau browser sebelum waktunya setelah mengirimkan formulir. Skrip akan terus berjalan di server hingga mencoba menulis kembali ke browser, namun jika pengguna kemudian menjelajahi halaman mana pun dalam domain kami (saat skrip masih berjalan), browser berhenti memuat halaman sampai skrip selesai . (Ini hanya terjadi ketika tab atau jendela browser ditutup dan bukan seluruh aplikasi browser.) Tetap saja, ini kurang dari ideal.
(Kemungkinan) Solusi
Saya telah memutuskan untuk membagi bagian "email" dari skrip menjadi file terpisah yang dapat saya panggil setelah pemberitahuan dikirim. Saya awalnya berpikir untuk meletakkan ini di halaman konfirmasi setelah pemberitahuan berhasil diposting. Namun, pengguna tidak akan tahu skrip ini sedang berjalan dan semua anomali tidak akan terlihat oleh mereka; Skrip ini tidak boleh gagal.
Tetapi, bagaimana jika saya dapat menjalankan skrip ini sebagai proses latar belakang? Jadi, pertanyaan saya adalah ini: Bagaimana saya dapat menjalankan skrip PHP untuk memicu sebagai layanan latar belakang dan berjalan sepenuhnya terlepas dari apa yang telah dilakukan pengguna di tingkat formulir?
EDIT: Ini tidak dapat di-cron'ed. Ini harus berjalan segera setelah formulir dikirimkan. Ini adalah pemberitahuan dengan prioritas tinggi. Selain itu, administrator sistem yang menjalankan server kami melarang crons berjalan lebih dari 5 menit.
exec()
tetapi saya tidak pernah mencoba ini.
ajax
dan memasukkan sleep()
dengan interval waktu di dalam loop (saya menggunakan foreach dalam kasus saya) untuk menjalankan proses latar belakang. Ia bekerja dengan sempurna di server saya. Tidak yakin mengenai yang lain. Saya juga menambahkan ignore_user_abort()
dan set_time_limit()
(dengan waktu akhir yang dihitung) sebelum loop untuk memastikan bahwa skrip tidak akan dihentikan oleh server yang saya gunakan, bahkan menurut pengujian saya, skrip menyelesaikan tugas tanpa ignore_user_abort()
dan set_time_limit()
.
gearman
php untuk menangani tugas latar belakang. Ini sempurna untuk menskalakan jika Anda menemukan pemrosesan waktu yang lama dan beban berat. Anda harus memeriksanya.