Rumah >pembangunan bahagian belakang >tutorial php >Penjadualan dengan giliran pekerjaan zend
Gunakan giliran kerja zend untuk penjadualan tugas
mata teras
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:
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)
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.
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.
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");
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");
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();
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);
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()); }
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");
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");
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!