Menjadwalkan Tugas dengan Cron untuk PHP

Dengan Layanan Cron App Engine, Anda dapat mengonfigurasi tugas yang dijadwalkan secara berkala yang beroperasi pada waktu yang ditentukan atau rentang waktu yang teratur. Tugas ini biasanya disebut cron job. Cron job ini otomatis dipicu oleh Layanan Cron App Engine. Misalnya, Anda mungkin menggunakan cron job untuk mengirim laporan email setiap hari, atau memperbarui beberapa data yang di-cache setiap 10 menit, atau memperbarui informasi ringkasan sekali satu jam.

Cron job akan membuat permintaan GET HTTP terjadwal ke endpoint yang ditentukan dalam aplikasi yang sama tempat cron job dikonfigurasi. Pengendali untuk endpoint tersebut akan menjalankan logika saat dipanggil.

Layanan Cron App Engine tidak dapat digunakan untuk memanggil endpoint web di luar aplikasi host App Engine. Layanan ini tidak dapat digunakan untuk memanggil endpoint App Engine dari aplikasi lain selain aplikasi host.

Permintaan cron job dikenai batas yang sama dengan batas untuk task queue push.

Sebelum memulai

Untuk men-deploy atau memperbarui jadwal, akun Anda memerlukan salah satu peran IAM berikut:

  • Owner
  • Editor

Anda dapat menetapkan izin pada halaman IAM di Konsol Google Cloud.

Membuat cron job

  1. Buat file cron.yaml di direktori root aplikasi Anda (beserta app.yaml).
  2. Tambahkan satu atau beberapa entri <cron> ke file Anda dan tentukan elemen yang diperlukan untuk tugas Anda, termasuk elemen <url> dan <schedule> yang diperlukan. Tinjau opsi dan sintaksis cron.yaml untuk mengetahui detail selengkapnya tentang elemen file cron.yaml.

    Contoh berikut membuat cron job dasar yang berjalan setiap hari:

    cron:
    - description: "daily summary job"
      url: /tasks/summary
      target: beta
      schedule: every 24 hours
    

    Spesifikasi target bersifat opsional dan merupakan nama layanan/versi. Jika ada, target akan ditambahkan nama host aplikasi, sehingga tugas diarahkan ke layanan/versi tersebut. Jika target tidak ditentukan, tugas akan berjalan dalam versi layanan default yang dikonfigurasi untuk traffic.

  3. Buat pengendali untuk URL cron job. Pengendali harus menjalankan tugas apa pun yang ingin Anda jadwalkan. Pengendali harus merespons dengan kode status HTTP antara 200 dan 299 (inklusif) untuk menunjukkan keberhasilan. Kode status lainnya dapat ditampilkan dan dapat digunakan untuk mencoba ulang cron job.

Menguji cron job di server pengembangan

Server pengembangan lokal tidak otomatis menjalankan cron job Anda. Anda dapat membuat permintaan langsung ke URL cron job untuk menguji fungsionalitas. Anda dapat menggunakan cron lokal atau antarmuka tugas terjadwal untuk memicu URL tugas dengan curl atau alat yang mirip.

Anda dapat menggunakan antarmuka admin server pengembangan lokal untuk melihat cron job Anda di http://localhost:8000/cron.

Mencoba ulang cron job yang gagal

Jika pengendali permintaan cron job menampilkan kode status yang tidak berada dalam rentang 200–299 (inklusif), App Engine akan menganggap tugas tersebut gagal. Secara default, tugas yang gagal tidak akan dicoba ulang kecuali jika kode status 503 ditampilkan. Dalam hal ini, tugas tersebut dicoba lagi setiap menit hingga berhasil atau menampilkan kode status 200-299.

Untuk menetapkan tugas yang gagal agar dicoba ulang:

  1. Sertakan blok retry_parameters dalam file cron.yaml Anda.
  2. Pilih dan setel parameter percobaan ulang dalam blok retry_parameters.

    Misalnya, contoh file cron.yaml ini berisi satu cron job yang dikonfigurasi untuk mencoba ulang hingga lima kali (default) dengan backoff awal selama 2,5 detik yang berlipat ganda setiap kali dijalankan.

    cron:
    - description: "retry demo"
      url: /retry
      schedule: every 10 mins
      retry_parameters:
        min_backoff_seconds: 2.5
        max_doublings: 5
    

Pelajari lebih lanjut opsi percobaan ulang cron.

Men-deploy cron job

Untuk men-deploy cron job yang ditentukan dalam file konfigurasi cron.yaml, jalankan perintah berikut:

gcloud app deploy cron.yaml

Menghapus semua cron job

Untuk menghapus semua cron job:

  1. Edit isi file cron.yaml menjadi:

    cron:
    
  2. Deploy file cron.yaml ke App Engine.

Mengamankan URL untuk cron

Pengendali cron hanyalah pengendali biasa yang ditentukan dalam app.yaml. Anda dapat mencegah pengguna mengakses URL yang digunakan oleh tugas terjadwal dengan membatasi akses ke akun administrator. Tugas terjadwal dapat mengakses URL khusus admin. Anda dapat membatasi URL dengan menambahkan login: admin ke konfigurasi pengendali di app.yaml.

Contohnya mungkin terlihat seperti ini di app.yaml:

runtime: php55
api_version: 1

handlers:
- url: /report/weekly
  script: weekly.php
  login: admin
Untuk mengetahui informasi selengkapnya, lihat cara mewajibkan login atau status admin di referensi app.yaml.

Untuk menguji cron job, login sebagai administrator dan buka URL pengendali di browser Anda.

Permintaan dari Layanan Cron juga akan berisi header HTTP:

X-Appengine-Cron: true

Header X-Appengine-Cron ditetapkan secara internal oleh App Engine. Jika pengendali permintaan Anda menemukan header ini, pengendali dapat memercayai bahwa permintaan tersebut adalah permintaan cron. Jika muncul pada permintaan pengguna eksternal ke aplikasi Anda, header akan dihapus, kecuali untuk permintaan dari administrator aplikasi yang login, yang diizinkan menetapkan header untuk tujuan pengujian.

App Engine akan menerbitkan permintaan Cron dari alamat IP 0.1.0.2. Untuk Cron job yang dibuat dengan versi gcloud sebelumnya (sebelum versi 326.0.0), permintaan Cron akan berasal dari 0.1.0.1.

Memanggil Google Cloud Endpoints

Anda tidak dapat menentukan Google Cloud Endpoint di kolom url pada cron job. Jika Anda ingin cron job memanggil Google Cloud Endpoint, kirimkan permintaan ke target yang disajikan oleh pengendali di aplikasi Anda, lalu panggil class dan metode endpoint dari kode pengendali.

Melihat cron job di Konsol Google Cloud

Anda dapat melihat cron job terjadwal di tab Cron Job App Engine di Cloud Scheduler.

Anda juga dapat melihat log untuk mengetahui kapan cron job ditambahkan atau dihapus.

Pelajari lebih lanjut

Lihat informasi mendetail tentang cara menentukan cron job di cron.yamlReference.