Bagaimana Batch Bekerja Di Sekitar Batas Waktu PHP


9

Dokumentasi Drupal 7 memperkenalkan Batch API sebagai:

Fungsi memungkinkan pemrosesan formulir tersebar di beberapa permintaan halaman, sehingga memastikan pemrosesan tidak terganggu karena batas waktu PHP ...

Saya menganggap ini berarti bahwa Batch menangani masalah terkait waktu tunggu untuk pengembang.

Namun, postingan lain (mis. Bagaimana API batch bekerja secara internal? ) Menyiratkan bahwa itu adalah tanggung jawab pengembang untuk memberi tahu Batch berapa banyak pekerjaan yang harus dilakukan sebelum menunggu pengguna lain tiba dan Batch akan dipanggil lagi --- sehingga menghindari waktu habis.

Jika yang terakhir benar maka saya berasumsi Batch tidak menjamin bahwa pekerjaan tidak akan berakhir. Apakah Batch memberikan jaminan? Apakah terserah pengembang untuk menebak berapa banyak Batch dapat diproses sebelum waktu habis?

Terima kasih!


3
Ini pertanyaan yang sangat bagus, terima kasih :-)
Chapabu

Jawaban:


5

Batch hanya mengatakan, "Saya akan melakukan sejumlah N hal (paling banyak) dan kemudian melakukan refresh halaman ... dan melakukan lebih banyak."

Jika Anda mengatakan lakukan 5 item per potongan pekerjaan yang masing-masing membutuhkan waktu 5 detik, Anda akan baik-baik saja dengan nilai batas waktu php default 30 detik.

Jika Anda mengatakan lakukan 20 item per potongan pekerjaan yang masing-masing membutuhkan waktu 5 detik, beban kerja Anda per permintaan terlalu tinggi dan kemungkinan akan habis.

Ingatlah saat Anda menggunakan PHP dalam siklus hidup sebuah halaman request in -> response out. Dan bahwa server web Anda menjaga setiap utas tetap hidup untuk waktu yang terbatas. Anda harus mengatasi batas waktu itu - yang mana Batch API membantu Anda melakukannya.

Menjalankan hal-hal dari katakan Drush, sisi server menggunakan modul komunitas seperti Migrasi dapat membantu Anda sepenuhnya menghindari timeout jika perlu.

EDIT

Juga perhatikan bahwa setiap permintaan halaman adalah bootstrap drupal penuh dan Batch API memilih dari yang sebelumnya ditinggalkan. Itu adalah salah satu operasi paling mahal saat menggunakan Batch API, memuat ulang drupal setiap N item. Itu sebabnya orang telah bekerja pada teknik sisi server untuk membuat node, mengimpor konten, dll. Batch API sangat bagus untuk tugas yang sederhana dan berulang. Tetapi cenderung berantakan dalam kumpulan data yang kompleks, atau sangat besar.


1
Apakah Anda mengatakan bahwa Batch dipanggil pada setiap pemuatan halaman; yaitu. Batch bangun untuk melihat apakah ada tugas (seperti cron poorman)? Ini diduga; Namun, saya tidak mengerti mengapa Anda menekankan biaya komputasi proses. Bukankah biaya tambahan hanya beberapa perbandingan dan apa pun pekerjaan Batch dalam antriannya atau apakah Batch melakukan sesuatu yang istimewa seperti memanggil dirinya sendiri dengan memuat halaman?
Pemanggang roti

1
lihat jawaban kiamlaluno di bawah ini. Halaman bilah progres batch cukup memuat ulang sendiri setelah X detik. Jika Anda memuat Firebug atau Chrome di tab Network dan menjalankan pekerjaan Batch API, lihat URL dan Anda hanya akan melihat halaman yang sama dengan berbagai item offset dan ukuran chunk. Biaya perhitungan bootstrap semua drupal setiap permintaan satu halaman adalah TINGGI. Menjalankan drush sql mengimpor banyak drupal hanya sekali, misalnya. Untuk dataset dan masalah besar, overhead API Batch menjadi terlalu tinggi.
Tenken

3

API batch hanya mendaftar _batch_shutdown()sebagai fungsi shutdown register_shutdown_function(). Fungsi itu hanya menyimpan dalam tabel database status saat ini dari batch yang dieksekusi.
API Batch tidak memberikan jaminan apa pun bahwa operasi yang Anda lakukan tidak terganggu di tengah. Itulah sebabnya operasi batch biasanya menjalankan operasi sederhana seperti membaca baris database dari menyimpan tabel, dan menyimpan baris database di tabel lain.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.