


Melaksanakan pengundian tugas tak segerak dengan php `sementara gelung dan` usleep`
Untuk melaksanakan pengundian negeri untuk tugas -tugas asynchronous dalam PHP, anda boleh menggunakan gelung sementara bersempena dengan fungsi usleep untuk pemeriksaan masa yang selamat. 1. Pelaksanaan Asas: Semak status tugas dengan memanggil Getjobstatus gelung, tetapkan bilangan maksimum percubaan (seperti 60 kali) dan masa selang (seperti 50ms), dan keluar dari gelung apabila tugas selesai, gagal atau tamat masa. 2. Tetapkan selang pengundian secara munasabah: disyorkan untuk menggunakan 100ms (100,000 microseconds) sebagai nilai awal untuk mengelakkan beban sistem atau terlalu lama yang mempengaruhi kelajuan tindak balas. 3. Amalan terbaik termasuk: bilangan maksimum percubaan mesti ditetapkan untuk mengelakkan gelung tak terhingga; Pengendalian kegagalan sementara seperti pengecualian rangkaian untuk mengelakkan pengundian mengganggu; Log perlu direkodkan atau penurunan pemprosesan hendaklah dicetuskan apabila tamat masa; Pengundian panjang harus dielakkan dalam permintaan web sebanyak mungkin. Jika perlu, set_time_limit dan ignore_user_abort harus dipanggil untuk melanjutkan masa pelaksanaan dan mencegah gangguan pengguna; Penyelesaian yang lebih baik adalah untuk mengembalikan ID tugas dan mengundi melalui Ajax oleh hujung depan, atau menggunakan sistem giliran seperti beratur Laravel. 4. Skenario Sampel: Dapatkan status tugas dari Redis, cek gelung sehingga siap, ralat atau tamat masa. Singkatnya, sementara Plus Usleep sesuai untuk keperluan pengundian mudah dalam skrip CLI, tetapi dalam senario di mana keseragaman tinggi atau keperluan masa nyata adalah alternatif yang lebih tinggi, lebih cekap seperti WebSocket, SSE atau beratur mesej harus dipertimbangkan. Kaedah ini mudah dan boleh dipercayai, tetapi perhatian harus dibayar kepada penggunaan sumber dan kawalan masa untuk memastikan kestabilan sistem.
Apabila berurusan dengan tugas -tugas asynchronous dalam muat naik pemprosesan seperti PHP, menghasilkan laporan, atau menunggu panggilan balik API luaran -anda sering perlu menyemak status kerja latar belakang sehingga selesai. Satu cara yang mudah untuk melaksanakannya adalah menggunakan gelung while
yang digabungkan dengan usleep
untuk mengundi terkawal. Pendekatan ini berguna dalam skrip CLI atau konteks web jangka panjang di mana anda tidak boleh bergantung pada pemberitahuan masa nyata (contohnya, webhooks).

Inilah cara untuk melakukannya dengan berkesan dan selamat.
1. Pengundian Asynchronous Asas dengan while
dan usleep
Idea teras adalah untuk berulang kali menyemak keadaan (contohnya, penyelesaian kerja) dalam gelung, berhenti di antara cek untuk mengelakkan sistem yang menggembirakan.

$ jobid = 'ABC123'; // menganggap ini lebih awal $ PollInterval = 50000; // 50ms dalam mikrosecond $ maxAttempts = 60; // max 60 percubaan = ~ 3 saat jumlah $ percubaan = 0; manakala ($ percubaan <$ maxAttempts) { $ status = getJobstatus ($ jobid); // fungsi anda untuk memeriksa status jika ($ status === 'selesai') { echo "pekerjaan siap berjaya. \ n"; rehat; } jika ($ status === 'gagal') { echo "pekerjaan gagal. \ n"; rehat; } // Tunggu sebelum tinjauan seterusnya usleep ($ pollInterval); $ percubaan; } jika ($ percubaan> = $ maxAttempts) { echo "Job Waktu Keluar. \ N"; }
Dalam contoh ini:
-
usleep(50000)
menjeda skrip selama 50 juta saat. - Kami mengehadkan bilangan percubaan untuk mengelakkan gelung tak terhingga.
- Gelung keluar apabila pekerjaan itu berjaya, gagal, atau keluar.
2. Memilih selang pengundian yang betul
Nilai yang diluluskan ke usleep()
adalah dalam mikroseconds :

-
1 second = 1,000,000 microseconds
- Selang waktu biasa:
-
50000
= 50ms -
100000
= 100ms -
500000
= 500ms
-
Terlalu pendek selang (misalnya, 10ms) boleh:
- Melampaui pangkalan data atau API
- Sumber pelayan sisa
- Had Kadar Pencetus
Terlalu lama selang (contohnya, 2 saat) boleh:
- Pengesanan kelewatan penyelesaian pekerjaan
- Menjadikan sistem merasa lambat
Cadangan: Mulakan dengan 100ms ( 100000
) untuk kebanyakan kes penggunaan.
3. Amalan terbaik dan petua keselamatan
✅ Gunakan had percubaan maksimum
Sentiasa menghalang gelung tak terhingga dengan menutup semula.
✅ Mengendalikan kegagalan sementara dengan anggun
Isu rangkaian atau kesilapan sementara tidak boleh merosakkan gelung pengundian anda.
$ status = getJobstatus ($ jobid); jika ($ status === palsu) { // misalnya, waktu tamat API usleep ($ pollInterval); $ percubaan; teruskan; }
✅ Bersihkan atau memberitahu pada waktu tamat tempoh
Jangan hanya keluar dengan senyap. Log acara atau mencetuskan sandaran.
✅ Elakkan dalam permintaan web apabila mungkin
Gelung jangka panjang dalam skrip web boleh:
- Tekan php's
max_execution_time
- Blok pelayan web
- Menyebabkan ux miskin
Alternatif yang lebih baik:
- Kembalikan ID Kerja dan biarkan pengundian frontend melalui Ajax
- Gunakan pekerja giliran (misalnya, dengan beratur Laravel atau messenger Symfony)
Tetapi jika anda mesti melakukannya dalam konteks web, meningkatkan had:
set_time_limit (30); // Benarkan sehingga 30 saat abaikan_user_abort (benar); // Teruskan walaupun pengguna menutup penyemak imbas
4. Contoh: Mengundurkan giliran pekerjaan yang disokong redis
Katakan anda menggunakan Redis untuk menyimpan status pekerjaan:
fungsi getjobstatus ($ jobid) { $ redis = redis baru (); $ redis-> Connect ('127.0.0.1', 6379); kembali $ redis-> get ("Job: $ Jobid: Status"); } $ jobid = 'task_789'; $ percubaan = 0; $ maxAttempts = 20; $ selang = 100000; // 100ms manakala ($ percubaan <$ maxAttempts) { $ status = getJobstatus ($ jobid); jika ($ status === 'selesai') { echo "kejayaan! \ n"; rehat; } jika ($ status === 'error') { echo "ralat kerja. \ n"; rehat; } usleep (selang $); $ percubaan; } jika ($ percubaan === $ maxAttempts) { echo "pekerjaan tidak selesai dalam masa. \ n"; }
Nota akhir
Walaupun while
usleep
adalah mudah dan berfungsi dengan baik dalam skrip CLI (misalnya, pekerjaan Cron atau pekerja giliran), ia tidak sesuai untuk aplikasi web masa nyata . Untuk berskala yang lebih baik, pertimbangkan:
- WebSockets (melalui Ratchet, Swoole, dll.)
- Acara Server-Sent (SSE)
- Pengundian Ajax sisi pelanggan
- Broker Mesej (Rabbitmq, Kafka)
Tetapi untuk ringan, gaya segerak yang menunggu dalam skrip latar belakang, pengundian berasaskan usleep
adalah penyelesaian praktikal dan mudah debug.
Pada asasnya, pastikan ia mudah, tetapkan had, dan elakkan pengundian.
Atas ialah kandungan terperinci Melaksanakan pengundian tugas tak segerak dengan php `sementara gelung dan` usleep`. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

MengelakkanRepeatedFunctionCallSinWhileLoopConditionSbyCachingResultSultsLikeCount () orstrlen (). $ offsettopreventredundantcalcula

TheWhile ($ line = fgets ($ file)) coraknotatypobutadeliberateidiomwhereasSignmentReturnsTheasSignedValue, whoSisevaluatatedfor TruthinessIntHeloopCondition.2.TheloopContinuuSlongasfgets () ReturnSatruthyValue (iaitu, Avalidline, everifit'sanemptyor "0 & quo

Usewhilewhenthenumberofiterationsisunknownanddependsonaruntimecondition,suchasreadingfromafileorstreamuntilcompletion.2.Useforwhentheiterationcountisknownandprecisecontrolovertheindexisneeded,includingcustomincrementsorreversetraversal.3.Useforeachwh

Untuk melaksanakan pengundian negeri untuk tugas -tugas asynchronous dalam PHP, anda boleh menggunakan gelung sementara bersempena dengan fungsi usleep untuk pemeriksaan masa yang selamat. 1. Pelaksanaan Asas: Semak status tugas dengan memanggil Getjobstatus gelung, tetapkan bilangan maksimum percubaan (seperti 60 kali) dan masa selang (seperti 50ms), dan keluar dari gelung apabila tugas selesai, gagal atau tamat masa. 2. Tetapkan selang pengundian secara munasabah: disyorkan untuk menggunakan 100ms (100,000 microseconds) sebagai nilai awal untuk mengelakkan beban sistem atau terlalu lama yang mempengaruhi kelajuan tindak balas. 3. Amalan terbaik termasuk: bilangan maksimum percubaan mesti ditetapkan untuk mengelakkan gelung tak terhingga; Pengendalian kegagalan sementara seperti pengecualian rangkaian untuk mengelakkan gangguan pengundian; Log perlu direkodkan atau penurunan pemprosesan hendaklah dicetuskan apabila tamat masa; cuba mengelakkan w

PenggunaanSsignmentWithinwhileConditionShelpsreduceredundancyandImproverabilityWhenfetchingDatabaserows; 1) iteliminatesduplicatedFetchCallsbycombiningAssignmentandConditionCheck;

Sengaja disengajakan

Menggunakan sementara dan fgets () dapat memproses fail besar dengan cekap kerana kaedah ini membaca garis demi baris untuk mengelakkan limpahan ingatan; 1. Buka fail dan periksa sama ada pemegangnya sah; 2. Gunakan sementara gelung untuk menggabungkan fgets () untuk membaca garis demi baris; 3. Proses setiap baris data, seperti penapisan, pencarian atau penukaran; 4. Gunakan trim () untuk menghapuskan aksara ruang putih; 5. Tutup pemegang fail dalam masa; 6. Sesuaikan saiz penampan untuk mengoptimumkan prestasi; Berbanding dengan fail () Memuatkan keseluruhan fail pada satu masa, kaedah ini mempunyai penggunaan memori yang rendah, prestasi yang stabil, dan menyokong pemprosesan fail super besar. Ia sesuai untuk analisis log, penghijrahan data dan senario lain. Ia adalah cara yang disyorkan untuk memproses fail besar dengan selamat.

Unsetlargevariablesafterusetopreventaccumulation; 2.callgc_collect_cycles () secara berkalaToHandLecirculararreferences; 3.avoidgrowingstaticorglobalarraysbyloggingexternallyorlimitingbufferssize;
