Saya memiliki tugas proses intensif yang ingin saya jalankan di latar belakang.
Pengguna mengklik halaman, skrip PHP berjalan, dan akhirnya, berdasarkan beberapa kondisi, jika diperlukan, maka ia harus menjalankan skrip shell, EG:
shell_exec('php measurePerformance.php 47 844 [email protected]');
Saat ini saya menggunakan shell_exec , tetapi ini membutuhkan skrip untuk menunggu keluaran. Apakah ada cara untuk menjalankan perintah yang saya inginkan tanpa menunggu sampai selesai?
Jawaban:
Bagaimana menambahkan.
Perhatikan ini juga menghilangkan stdio dan stderr.
sumber
> /dev/null 2>&1 &
seperti yang terlihat pada jawaban lain adalah bentuk singkat yang> /dev/null 2>/dev/null &
diberikan di sini. Ini pada dasarnya mengatakan "redirect STDERR (2) ke tempat yang sama dengan STDOUT (& 1)".Ini akan menjalankan perintah dan memutuskan sambungan dari proses yang sedang berjalan. Tentu saja, ini bisa berupa perintah apa pun yang Anda inginkan. Tapi untuk tes, Anda bisa membuat file php dengan perintah sleep (20).
sumber
nohup
dan&
?Anda juga dapat memberikan output Anda kembali ke klien secara instan dan melanjutkan pemrosesan kode PHP Anda setelahnya.
Ini adalah metode yang saya gunakan untuk panggilan Ajax yang menunggu lama yang tidak akan berpengaruh pada sisi klien:
Anda dapat menemukan penjelasan detailnya di sini: http://oytun.co/response-now-process-later
sumber
Pada Windows 2003, untuk memanggil skrip lain tanpa menunggu, saya menggunakan ini:
Ini hanya berfungsi SETELAH memberikan izin yang diubah pada
cmd.exe
- tambahkan Baca dan Jalankan untukIUSR_YOURMACHINE
(Saya juga menyetel tulis ke Tolak).sumber
Tentu, untuk
windows
Anda dapat menggunakan:catatan:
Jika Anda mendapatkan
COM
kesalahan, tambahkan ekstensi ke Andaphp.ini
dan mulai ulangapache
:sumber
Gunakan
popen
perintah PHP , misalnya:Ini akan membuat proses anak dan skrip akan dijalankan di latar belakang tanpa menunggu keluaran.
sumber
Jika keluar dari halaman web, saya sarankan untuk membuat sinyal (menjatuhkan file ke direktori, mungkin) dan meminta cron mengambil pekerjaan yang perlu dilakukan. Jika tidak, kita kemungkinan akan masuk ke wilayah penggunaan
pcntl_fork()
danexec()
dari dalam proses Apache, dan itu hanya masalah yang buruk.sumber
Itu akan berhasil tetapi Anda harus berhati-hati untuk tidak membebani server Anda karena itu akan membuat proses baru setiap kali Anda memanggil fungsi ini yang akan berjalan di latar belakang. Jika hanya satu panggilan bersamaan pada saat yang sama maka solusi ini akan melakukan pekerjaan itu.
Jika tidak maka saya akan menyarankan untuk menjalankan antrian pesan seperti misalnya beanstalkd / gearman / amazon sqs.
sumber