2012-07-06 35 views
17

Tôi muốn dữ liệu được khách hàng gửi (qua bài đăng) được đặt trong hàng đợi và tập lệnh php trên máy chủ của tôi trước tiên sẽ kiểm tra nếu hàng đợi trống. Nếu hàng đợi không trống, thì tập lệnh sẽ xử lý tất cả dữ liệu trong hàng đợi một. Làm cách nào để làm điều này?PHP Làm cách nào để thực hiện xử lý hàng đợi trong php

+0

Tạo bảng trong cơ sở dữ liệu để gửi dữ liệu, và sau đó chạy công việc crontab bao giờ x để chọn nó? – BugFinder

+0

Có. Tôi thích cách tiếp cận này.Nhưng sau khi chèn nhiệm vụ trong bảng, làm thế nào để tôi lấy nhiệm vụ được thực hiện và cập nhật bảng khi nhiệm vụ được hoàn thành? – ASHUTOSH

+0

Đó là điểm của cronjob để chạy một nhiệm vụ để xử lý, truy cập vào db và cập nhật nó – BugFinder

Trả lời

1

Vấn đề với cách tiếp cận cronjob là cronjob có thể ở mức tối đa là 1 phút, vì vậy có thể trì hoãn 1 phút trong quá trình thực hiện công việc, nếu được chấp nhận thì tốt hơn là sử dụng hàng đợi với tập lệnh bỏ phiếu.

0

Kể từ khi DB quan hệ (Ví dụ: MySQL) rất linh hoạt và được các nhà phát triển web hiểu rõ, chúng được sử dụng cho nhiều loại hàng đợi công việc. Nhiều ứng dụng PHP sử dụng giải pháp này làm dự phòng khi bộ nhớ đệm đối tượng không được định cấu hình. Đó là phương pháp cuối cùng bởi vì đó là một cách rất tốn kém để thực hiện một hàng đợi.

Nếu bạn phải sử dụng MySQL làm hàng đợi, một trong những kỹ sư của Percona đã viết điều này blog entry về việc quản lý các điểm đau tiềm ẩn.

Nếu bạn muốn triển khai khả năng mở rộng nhất, tôi rất muốn giới thiệu ZeroMQ. Tuy nhiên nó không phải là một phần mở rộng PHP mặc định hoặc đặc biệt phổ biến. Vì vậy, đối với một dự án mà bạn sẽ không được kiểm soát ngăn xếp máy chủ web: Sử dụng đối tượng APC, Memcache hoặc Memcached, và sau đó dự phòng vào một bảng bộ nhớ cache MySQL.

4

Đây là điều bạn có thể dễ dàng thực hiện với thư viện enqueue. Đầu tiên, bạn có thể chọn từ nhiều loại transports, chẳng hạn như AMQP, STOMP, Redis, Amazon SQS, Hệ thống tệp và v.v.

Thứ hai, Rất dễ sử dụng. Hãy bắt đầu cài đặt:

Bạn phải cài đặt thư viện enqueue/simple-clientone of the transports. Giả sử bạn chọn hệ thống tập tin, hãy cài đặt thư viện enqueue/fs.Để tóm tắt:

composer require enqueue/simple-client enqueue/fs 

Bây giờ chúng ta hãy xem làm thế nào bạn có thể gửi tin nhắn từ kịch bản POST của bạn:

<?php 
// producer.php 

use Enqueue\SimpleClient\SimpleClient; 

include __DIR__.'/vendor/autoload.php'; 

$client = new SimpleClient('file://'); // the queue will store messages in tmp folder 

$client->sendEvent('a_topic', 'aMessageData'); 

Kịch bản tiêu thụ:

<?php 
// consumer.php 

use Enqueue\SimpleClient\SimpleClient; 
use Enqueue\Psr\PsrProcessor; 
use Enqueue\Psr\PsrMessage; 

include __DIR__.'/vendor/autoload.php'; 

$client = new SimpleClient('file://'); 

$client->bind('a_topic', 'a_processor_name', function(PsrMessage $psrMessage) { 
    // processing logic here 

    return PsrProcessor::ACK; 
}); 

// this call is optional but it worth to mention it. 
// it configures a broker, for example it can create queues and excanges on RabbitMQ side. 
$client->setupBroker(); 

$client->consume(); 

Run as nhiều consumer.php quá trình như bạn bằng cách sử dụng supervisord hoặc các trình quản lý quy trình khác, trên máy tính cục bộ, bạn có thể chạy nó mà không cần bất kỳ gói hoặc lib bổ sung nào.

Đó là một ví dụ cơ bản và enqueue có rất nhiều tính năng khác có thể có ích. Nếu bạn quan tâm, hãy kiểm tra số enqueue documentation.

Các vấn đề liên quan