Rumah >pembangunan bahagian belakang >tutorial php >Penjadualan dengan giliran pekerjaan zend

Penjadualan dengan giliran pekerjaan zend

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌asal
2025-03-01 10:21:11220semak imbas

Gunakan giliran kerja zend untuk penjadualan tugas

Scheduling with Zend Job Queue

mata teras

    Modul giliran kerja Zend Server membolehkan pelaksanaan asynchronous tugas yang tidak interaktif dan jangka panjang, menyokong operasi selari, penangguhan atau pelaksanaan tugas tetap, dan diuruskan melalui GUI.
  • API giliran kerja boleh diakses melalui kelas Zendjobqueue, yang membolehkan mewujudkan pekerjaan, lulus parameter, dan menetapkan pilihan pekerjaan lain seperti keutamaan, kegigihan, dan penjadualan.
  • Seperti yang ditunjukkan dalam contoh lanjutan, giliran kerja boleh digunakan untuk meningkatkan pengalaman pengguna dan meningkatkan kecekapan aplikasi, dan tugas boleh dijadualkan dan dilaksanakan secara selari, mengurangkan masa menunggu pengguna.
  • Walaupun terdapat alternatif lain untuk mengendalikan beratur dan pemprosesan selari dalam PHP (mis. Cron, PCNTL_FORK, GEARMAN, NODE.JS, dan RABBITMQ), giliran kerja menyediakan penyelesaian yang mudah dan mudah digunakan.
Kebanyakan aplikasi web mengikuti model komunikasi segerak. Walau bagaimanapun, tugas yang tidak interaktif dan jangka panjang (seperti generasi laporan) lebih sesuai untuk pelaksanaan asynchronous. Salah satu cara untuk mengimbangi tugas ke masa yang akan datang atau bahkan berjalan pada pelayan yang berbeza adalah dengan menggunakan modul giliran pekerjaan yang disediakan di Zend Server 5 (tetapi tidak termasuk dalam edisi komuniti). Giliran kerja membolehkan penjadualan pekerjaan berdasarkan masa, keutamaan, dan juga kebergantungan. Pekerjaan boleh ditangguhkan atau dilaksanakan secara teratur dan paling penting -boleh dijalankan secara selari! Paling penting, Zend Server sendiri menyediakan GUI pengurusan untuk mengesan pelaksanaan pekerjaan, termasuk status, masa pelaksanaan, dan outputnya. Kelebihan utama modul giliran pekerjaan terletak pada keupayaannya untuk melaksanakan tugas secara selari. Tidak seperti pekerjaan Cron, giliran kerja membolehkan:

    menjalankan tugas sekarang tanpa menunggu mereka menyelesaikan (asynchronously)
  • Jalankan tugas sekali, tetapi tidak segera (kerja tertunda)
  • Jalankan tugas secara teratur (serupa dengan pekerjaan berulang di Cron, tetapi mereka boleh dikawal sepenuhnya melalui API PHP - permulaan, berhenti, jeda, resume)
  • Status pekerjaan pertanyaan melalui API, kegagalan proses dan requeuing, dan menjejaki pekerjaan masa lalu, semasa dan belum selesai melalui GUI.
beberapa contoh giliran pekerjaan yang boleh digunakan untuk tugas -tugas asynchronous termasuk:

    Sediakan data untuk permintaan seterusnya (dipulangkan)
  • data precache
  • menghasilkan laporan berkala
  • Hantar e -mel
  • Bersihkan data atau fail sementara
  • berkomunikasi dengan sistem luaran
  • Segerakkan data latar belakang dengan peranti mudah alih

cara menggunakan giliran pekerjaan

API Giliran Kerja boleh digunakan melalui kelas Zendjobqueue. Untuk melaksanakan kebanyakan tugas, anda akan menyambung ke pelayan giliran kerja dengan meneliti objek Zendjobqueue dan membuat pekerjaan menggunakan kaedah CreateHttpjob ().

<?php
$queue = new ZendJobQueue();
$queue->createHttpJob("http://example.com/jobs/somejob.php");
Lulus jalan ke createHttpjob () dan bukannya URL penuh akan mewujudkan pekerjaan dengan nilai nama host $ _server ["http_host"]. Perhatikan bahawa $ _server ["http_host"] tidak tersedia, seperti ketika menjadualkan pekerjaan dari skrip cron.

<?php
$queue = new ZendJobQueue();
$queue->createHttpJob("http://example.com/jobs/somejob.php");

Parameter pekerjaan boleh diluluskan sebagai sebahagian daripada rentetan pertanyaan atau sebagai parameter kedua createHttpjob () sebagai array. Jika hujah diluluskan sebagai hujah kedua, array mestilah serasi JSON. Untuk mengakses parameter dalam kod kerja, anda boleh menggunakan kaedah statik getCurrentJobParams ().

<?php
// 这两个调用是等效的
$queue->createHttpJob("/jobs/somejob.php");
$queue->createHttpJob("http://" . $_SERVER["HTTP_HOST"] . "/jobs/somejob.php");

Pilihan pekerjaan lain boleh digunakan melalui parameter ketiga createhttpjob (). Ia adalah array bersekutu yang mengandungi kekunci berikut:

  • Nama - Nama Pekerjaan Pilihan
  • Keutamaan - Keutamaan Pekerjaan, yang ditakrifkan oleh pemalar yang sama Priority_Low, Priority_Normal, Priority_High dan Priority_urgent
  • berterusan - nilai boolean yang menunjukkan sama ada sejarah pekerjaan sentiasa dipelihara
  • pendahulu - Id pekerjaan pendahulu Integer
  • http_headers - header http yang dilampirkan
  • Jadual - Perintah Jadual Gaya Cron
  • Jadual_Time - Masa kerja harus dilaksanakan (tetapi menurut beban giliran pekerjaan, ia sebenarnya mungkin dijalankan selepas masa ini)

Sebagai contoh, mencipta pekerjaan yang tertunda atau pekerjaan pendua kelihatan seperti ini:

<?php
$params = ZendJobQueue::getCurrentJobParams();

gagal (dan berjaya) boleh dikendalikan seperti berikut:

<?php
$params = array("p1" => 10, "p2" => "somevalue");

// 一小时后处理
$options = array("schedule_time" => date("Y-m-d H:i:s", strtotime("+1 hour")));
$queue->createHttpJob("http://example.com/jobs/somejob.php", $params, $options);

// 每隔一天凌晨1:05处理
$options = array("schedule" => "5 1 */2 * *");
$queue->createHttpJob("http://example.com/jobs/somejob.php", $params, $options);

Contoh Extended

Katakan aplikasi web anda mesti menjana dan menghantar satu set laporan berdasarkan permintaan pengguna. Biasanya, kerana PHP tidak menyokong multiprocessing dan menggunakan model komunikasi segerak, pengguna mesti menunggu semua laporan yang diminta dijana satu persatu dan menghantar e -mel. Menggunakan giliran kerja dalam kes ini bukan sahaja membolehkan pengguna melakukan operasi lain aplikasi (kerana kerja itu akan dilakukan secara asynchronously), tetapi permohonan itu boleh memproses beberapa laporan secara serentak (kerana pekerjaan itu dapat dilaksanakan secara selari) -merenah laporan, jika tidak semua, akan disiapkan pada waktu yang sama.

<?php
try {
    doSomething();
    ZendJobQueue::setCurrentJobStatus(ZendJobQueue::OK);
}
catch (Exception $e) {
    ZendJobQueue::setCurrentJobStatus(ZendJobQueue::STATUS_LOGICALLY_FAILED, $e->getMessage());
}
Fungsi ScheduleReport () mengembalikan senarai pengenal pekerjaan yang berkaitan dengan setiap laporan yang dijadualkan. Dalam fungsi ini, kaedah IsjobqueuedaemonRunning () kelas Zendjobqueue mengesahkan sama ada perkhidmatan yang sepadan berjalan dan sama ada pekerjaan itu boleh dijadualkan. Bergantung kepada keutamaan laporan, pekerjaan itu boleh dijadualkan berjalan dengan serta -merta atau selepas dua minit (untuk mengurangkan beban pada pelayan jika banyak laporan diminta pada masa yang sama). Selepas kerja dijadualkan, IDnya disimpan ke senarai semua pekerjaan yang berjaya dicipta. Memahami ID Kerja sangat penting untuk dapat memantau pekerjaan atau bahkan membatalkan pekerjaan. Inilah panggilan ke fungsi scheduleReport () yang kelihatan seperti:

<?php
function scheduleReport($reportList, $recipient) {
    // 已调度作业列表
    $jobList = array();

    $queue = new ZendJobQueue();

    // 检查Job Queue是否正在运行
    if ($queue->isJobQueueDaemonRunning() && count($reportList) > 0) {
        foreach ($reportList as $report) {
            $params = array("type" => $report["type"],
                            "start" => $report["start"],
                            "length" => $report["length"],
                            "recipient" => $recipient);
            $options = array("priority" => $report["priority"]);

            // 除非优先级为紧急,否则在两分钟内执行作业
            if ($report["priority"] != ZendJobQueue::PRIORITY_URGENT) {
                $options["schedule_time"] = date("Y-m-d H:i:s", strtotime("+2 minutes"));
            }

            $jobID = $queue->createHttpJob("http://example.com/jobs/report.php", $params, $options);

            // 将作业ID添加到已成功调度作业的列表中
            if ($jobID !== false) {
                $jobList[] = $jobID;
            }
        }
    }

    return $jobList;
}
Seperti yang dinyatakan sebelum ini, pekerjaan yang dijadualkan juga boleh dibatalkan. Walau bagaimanapun, apabila tugas sedang berjalan, ia akan selesai. Oleh itu, jika keutamaan yang diminta tidak mendesak, pengguna mempunyai dua minit untuk membatalkan penghantaran laporan yang dijadualkan.

Fungsi
<?php
// 设置每日销售报告和每月财务报告的请求
$reportList = array(
    array("type" => "sales",
          "start" => "2011-12-09 00:00:00",
          "length" => 1,
          "priority" => ZendJobQueue::PRIORITY_URGENT),
    array("type" => "finance",
          "start" => "2011-11-01 00:00:00",
          "length" => 30,
          "priority" => ZendJobQueue::PRIORITY_NORMAL));

// 调度报告
$jobList = scheduleReport($reportList, "user@example.com");

// 验证报告是否已调度
if (empty($jobList)) {
    // 显示错误消息
}
cancirReport () hanya memadamkan tugas dari barisan laporan yang dijadualkan yang belum dijalankan. Kemudian, skrip kerja kelihatan seperti ini:

Fungsi
<?php
function cancelReport($jobID) {
    $queue = new ZendJobQueue();
    return $queue->removeJob($jobID);
}

if ($jobID !== false && cancelReport($jobID)) {
    // 作业已成功从队列中删除
}
runReport () akhirnya menyediakan dan menghantar laporan berdasarkan parameter yang disediakan. Selepas selesai, status pekerjaan ditetapkan kepada kejayaan (kegagalan logik jika ralat berlaku).

Alternatif

Sudah tentu, terdapat alternatif untuk giliran kerja. Cron, PCNTL_FORK dan juga penyelesaian berasaskan Java melalui PHP/Java Bridge mungkin bernilai melihat, bergantung kepada keperluan anda. Alat yang lebih menarik wujud, seperti Gearman, Node.js, dan Rabbitmq.

Ringkasan

Walaupun giliran kerja Zend Server bukanlah satu -satunya cara untuk mengendalikan beratur dan pemprosesan selari dalam PHP, ia adalah penyelesaian yang sangat mudah, disokong oleh "Syarikat PHP" dan sangat mudah digunakan. Dengan PHPCloud Zend menjadi lebih berjaya, penggunaan giliran pekerjaan harus lebih luas. Jika anda ingin melihat kandungan penuh kod sampel dalam artikel ini, anda boleh menemuinya di GitHub. gambar dari Varina dan Jay Patel/Shutterstock

Soalan Lazim Mengenai Giliran Zend (Soalan Lazim)

Apakah fungsi utama giliran Zend?

Giliran Zend adalah komponen rangka kerja Zend yang menyediakan API mudah untuk pelbagai sistem beratur. Ia membolehkan pemaju untuk membuat, mengurus, dan memproses data atau giliran tugas secara tidak segerak. Ini bermakna tugas -tugas boleh dilaksanakan di latar belakang, dengan itu meningkatkan prestasi dan pengalaman pengguna aplikasi web. Ia menyokong pelbagai backend, seperti Array, SQLite, dll.

Bagaimanakah barisan Zend meningkatkan prestasi aplikasi web?

Zend Queue meningkatkan prestasi aplikasi web dengan membenarkan pemprosesan tugas -tugas yang tidak segerak. Ini bermakna tugas itu boleh dilaksanakan di latar belakang tanpa menyekat benang pelaksanaan utama. Ini dapat meningkatkan responsif aplikasi web, kerana pengguna tidak perlu menunggu tugas selesai sebelum terus berinteraksi dengan aplikasi.

Bagaimana untuk membuat barisan baru dalam barisan Zend?

Untuk membuat giliran baru dalam barisan Zend, anda boleh menggunakan kaedah CreateQueue. Kaedah ini memerlukan dua parameter: nama barisan dan masa tamat. Parameter masa tamat adalah pilihan dan lalai untuk NULL. Berikut adalah contoh:

<?php
$queue = new ZendJobQueue();
$queue->createHttpJob("http://example.com/jobs/somejob.php");

Bagaimana untuk menambah mesej ke barisan dalam barisan Zend?

Untuk menambah mesej ke barisan dalam barisan Zend, anda boleh menggunakan kaedah hantar. Kaedah ini memerlukan parameter: mesej yang akan ditambah ke barisan. Berikut adalah contoh:

<?php
// 这两个调用是等效的
$queue->createHttpJob("/jobs/somejob.php");
$queue->createHttpJob("http://" . $_SERVER["HTTP_HOST"] . "/jobs/somejob.php");

Bagaimana untuk memproses mesej dari beratur dalam barisan Zend?

Untuk memproses mesej dari beratur dalam barisan Zend, anda boleh menggunakan kaedah yang diterima. Kaedah ini mengambil satu set mesej dari barisan untuk diproses. Berikut adalah contoh:

<?php
$params = ZendJobQueue::getCurrentJobParams();

Bagaimana untuk memadam barisan dalam barisan Zend?

Untuk memadam barisan dalam barisan Zend, anda boleh menggunakan kaedah Deletequeue. Kaedah ini memerlukan parameter: nama barisan untuk dipadam. Berikut adalah contoh:

<?php
$params = array("p1" => 10, "p2" => "somevalue");

// 一小时后处理
$options = array("schedule_time" => date("Y-m-d H:i:s", strtotime("+1 hour")));
$queue->createHttpJob("http://example.com/jobs/somejob.php", $params, $options);

// 每隔一天凌晨1:05处理
$options = array("schedule" => "5 1 */2 * *");
$queue->createHttpJob("http://example.com/jobs/somejob.php", $params, $options);

Bagaimana untuk memeriksa sama ada giliran wujud dalam barisan Zend?

Untuk memeriksa sama ada giliran wujud dalam barisan Zend, anda boleh menggunakan kaedah isexists. Kaedah ini memerlukan satu parameter: nama barisan untuk diperiksa. Berikut adalah contoh:

<?php
try {
    doSomething();
    ZendJobQueue::setCurrentJobStatus(ZendJobQueue::OK);
}
catch (Exception $e) {
    ZendJobQueue::setCurrentJobStatus(ZendJobQueue::STATUS_LOGICALLY_FAILED, $e->getMessage());
}

Bagaimana untuk mengira bilangan mesej dalam barisan dalam barisan zend?

Untuk mengira bilangan mesej dalam barisan dalam barisan zend, anda boleh menggunakan kaedah kiraan. Kaedah ini mengembalikan bilangan mesej dalam barisan. Berikut adalah contoh:

<?php
$queue = new ZendJobQueue();
$queue->createHttpJob("http://example.com/jobs/somejob.php");

Bagaimana untuk membersihkan semua mesej dalam beratur dalam barisan Zend?

Untuk membersihkan semua mesej dalam barisan dalam barisan Zend, anda boleh menggunakan kaedah pembersihan. Kaedah ini memadam semua mesej dalam barisan. Berikut adalah contoh:

<?php
// 这两个调用是等效的
$queue->createHttpJob("/jobs/somejob.php");
$queue->createHttpJob("http://" . $_SERVER["HTTP_HOST"] . "/jobs/somejob.php");

Bagaimana untuk menetapkan masa tamat giliran dalam barisan Zend?

Untuk menetapkan masa tamat masa untuk barisan dalam barisan Zend, anda boleh menggunakan kaedah setTimeout. Kaedah ini memerlukan dua parameter: nama barisan dan tamat masa dalam beberapa saat. Berikut adalah contoh:

<?php
$params = ZendJobQueue::getCurrentJobParams();

Sila ambil perhatian bahawa contoh kod di atas adalah berdasarkan zend_queue, bukan giliran kerja zend yang disebutkan dalam artikel. API Zend Job Giliran mungkin sedikit berbeza, jadi anda perlu merujuk kepada dokumentasi rasmi Zend Server.

Atas ialah kandungan terperinci Penjadualan dengan giliran pekerjaan zend. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn