Saya perlu menjalankan salinan direktori pada tindakan pengguna, tetapi direktori cukup besar, jadi saya ingin dapat melakukan tindakan seperti itu tanpa pengguna menyadari waktu yang dibutuhkan untuk menyalin selesai. Setiap saran akan sangat dihargai. Jawaban: Dengan asumsi ini berjalan pada mesin Linux, saya selalu menanganinya seperti ini:
Ini meluncurkan perintah Itu memungkinkan Anda memantau dengan mudah apa yang sedang dilakukan dan apakah prosesnya masih berjalan.
Tulis proses sebagai skrip sisi-server dalam bahasa apa pun (php / bash / perl / dll) yang berguna dan kemudian panggil dari fungsi kontrol proses di skrip php Anda. Fungsi ini mungkin mendeteksi jika standar io digunakan sebagai aliran output dan jika itu kemudian yang akan menetapkan nilai kembali .. jika tidak maka itu berakhir
Saya menguji ini dengan cepat dari baris perintah menggunakan "sleep 25s" sebagai perintah dan itu bekerja seperti pesona. ( Jawaban ditemukan di sini ) Anda mungkin ingin mencoba menambahkan ini ke perintah Anda
misalnya.
Saya hanya ingin menambahkan contoh yang sangat sederhana untuk menguji fungsi ini pada Windows: Buat dua file berikut dan simpan ke direktori web: foreground.php:
background.php:
Berikan izin IUSR untuk menulis ke direktori tempat Anda membuat file di atas Berikan izin IUSR untuk MEMBACA dan LAKUKAN C: \ Windows \ System32 \ cmd.exe Tekan foreground.php dari peramban web Berikut ini harus diterjemahkan ke browser dengan cap waktu saat ini dan sumber daya lokal # dalam array keluaran:
Anda akan melihat testoutput.php di direktori yang sama dengan file di atas disimpan, dan itu harus kosong Anda akan melihat testprocesses.php di direktori yang sama dengan file di atas disimpan, dan itu harus berisi teks berikut dengan cap waktu saat ini:
Jika Anda hanya perlu melakukan sesuatu di latar belakang tanpa halaman PHP menunggu untuk menyelesaikannya, Anda dapat menggunakan skrip PHP lain (latar belakang) yang "dipanggil" dengan perintah wget. Skrip PHP latar belakang ini akan dieksekusi dengan hak istimewa, tentu saja, seperti skrip PHP lainnya di sistem Anda. Berikut adalah contoh di Windows menggunakan wget dari paket gnuwin32. Kode latar belakang (file test-proc-bg.php) sebagai contoh ...
Skrip latar depan, yang memohon ...
Anda harus menggunakan popen / pclose agar ini berfungsi dengan baik. Opsi wget:
Berikut adalah fungsi untuk meluncurkan proses latar belakang di PHP. Akhirnya dibuat satu yang benar-benar berfungsi pada Windows juga, setelah banyak membaca dan menguji berbagai pendekatan dan parameter.
Catatan 1: Di windows, jangan gunakan Catatan 2: Kutipan ganda kosong setelah Yah saya menemukan versi yang sedikit lebih cepat dan lebih mudah digunakan
dan itu berhasil. Bisakah Anda mengatur untuk memotong proses yang terpisah, dan kemudian menjalankan salinan Anda di latar belakang? Sudah lama sejak saya melakukan PHP, tetapi fungsi pcntl-fork terlihat menjanjikan. Gunakan fungsi ini untuk menjalankan program Anda di latar belakang. Ini lintas platform dan sepenuhnya dapat disesuaikan.
Perhatikan bahwa setelah perintah dimulai, secara default fungsi ini menutup stdin dan stdout dari proses yang berjalan. Anda dapat mengarahkan proses output ke beberapa file melalui argumen $ redirectStdout dan $ redirectStderr. Catatan untuk pengguna windows:
Namun, Anda dapat melakukan ini:
Catatan untuk * nix pengguna: 1) Gunakan perintah exec shell jika Anda ingin mendapatkan PID aktual:
2) Gunakan argumen $ stdin jika Anda ingin meneruskan beberapa data ke input program Anda:
Anda dapat mencoba sistem antrian seperti Resque . Anda kemudian dapat menghasilkan pekerjaan, yang memproses informasi dan kembali dengan cepat dengan gambar "pemrosesan". Dengan pendekatan ini Anda tidak akan tahu kapan itu selesai. Solusi ini ditujukan untuk aplikasi berskala lebih besar, di mana Anda tidak ingin alat berat depan Anda melakukan pengangkatan berat, sehingga mereka dapat memproses permintaan pengguna. Karena itu mungkin atau mungkin tidak bekerja dengan data fisik seperti file dan folder, tetapi untuk memproses logika yang lebih rumit atau tugas asinkron lainnya (yaitu email pendaftaran baru) itu bagus untuk dimiliki dan sangat scalable. Solusi yang berfungsi untuk Windows dan Linux. Temukan lebih banyak di halaman github saya .
Alih-alih memulai proses latar belakang, bagaimana dengan membuat file pemicu dan memiliki penjadwal seperti cron atau autosys secara berkala menjalankan skrip yang mencari dan bertindak pada file pemicu? Pemicu bisa berisi instruksi atau bahkan perintah mentah (lebih baik lagi, buat saja skrip shell). Saya banyak menggunakan Dalam kombinasi dengan penutupan dan register_shutdown_function ()
Kemudian daftarkan penutupan ini untuk dieksekusi sebelum shutdown.
Akhirnya ketika respons dikirim ke klien Anda dapat menutup koneksi ke klien dan terus bekerja dengan proses PHP:
Penutupan akan dieksekusi setelah fast_cgi_finish_request. $ Message tidak akan terlihat kapan saja. Dan Anda dapat mendaftarkan penutupan sebanyak yang Anda inginkan, tetapi berhati-hatilah dengan waktu eksekusi skrip. Ini hanya akan berfungsi jika PHP dijalankan sebagai modul Fast CGI (benarkah itu ?!) Scripting PHP tidak seperti bahasa berkembang aplikasi desktop lainnya. Dalam bahasa aplikasi desktop kita dapat mengatur thread daemon untuk menjalankan proses latar belakang tetapi dalam PHP proses terjadi ketika pengguna meminta halaman. Namun dimungkinkan untuk mengatur pekerjaan latar belakang menggunakan fungsionalitas tugas cron server yang dijalankan oleh skrip php. Bagi kita yang menggunakan Windows , lihat ini: Referensi: http://php.net/manual/en/function.exec.php#43917
mulai Notepad.exe diminimalkan di latar belakang:
mulai perintah shell tidak terlihat di latar belakang:
mulailah MSPaint dimaksimalkan dan tunggu sampai Anda menutupnya sebelum melanjutkan skrip:
Untuk info lebih lanjut tentang metode Run (), buka: http://msdn.microsoft.com/library/en-us/script56/html/wsMthRun.asp URL yang diedit: Buka https://technet.microsoft.com/en-us/library/ee156605.aspx sebagai gantinya karena tautan di atas tidak ada lagi. Saya tahu ini adalah postingan berusia 100 tahun, tetapi bagaimanapun, saya pikir itu mungkin berguna bagi seseorang. Anda dapat meletakkan gambar yang tidak terlihat di suatu halaman di halaman yang menunjuk ke url yang perlu dijalankan di latar belakang, seperti ini:
|