Chạy bộ lập lịch tác vụ tập lệnh php

Lập lịch tác vụ song song cho PHP sử dụng MongoDB làm hàng đợi phân phối. Thực hiện các nhiệm vụ song song một cách dễ dàng. Thư viện này có hỗ trợ tích hợp cho các hệ thống cụm và cpu đa lõi. Bạn có thể khởi động nhiều nút công nhân và chúng sẽ cân bằng tải các công việc có sẵn với nguyên tắc đến trước phục vụ trước. Mỗi nút cũng sẽ sinh ra một số tiến trình con có thể định cấu hình (động) để sử dụng tất cả các tài nguyên có sẵn. Hơn nữa, có thể lên lịch công việc vào những thời điểm nhất định, khoảng thời gian vô tận cũng như sắp xếp lại nếu công việc thất bại. Điều này mang đến một triển khai trong thế giới thực để quản lý quy trình song song cho PHP. Bạn cũng có thể đồng bộ hóa các tác vụ con và nhiều nội dung hay hơn nữa

Đặc trưng

  • Nhiệm vụ song song
  • Hỗ trợ cụm
  • Hỗ trợ đa lõi
  • cân bằng tải
  • chuyển đổi dự phòng
  • có thể mở rộng
  • Đồng bộ hóa các tác vụ với nhau
  • Hủy bỏ các tác vụ đang chạy
  • công việc hết thời gian chờ
  • Thử lại và khoảng thời gian
  • Lên lịch công việc vào những thời điểm cụ thể
  • quản lý tín hiệu
  • Sự kiện chặn
  • hỗ trợ tiến độ
  • Tự động phát hiện các công việc mồ côi

v4

Đây là tài liệu cho phiên bản chính v4 hiện tại. Bạn có thể xem hướng dẫn nâng cấp nếu muốn nâng cấp từ phiên bản v3 hoặc thậm chí là phiên bản cũ hơn. Tài liệu cho v3 có sẵn tại đây

Mục lục

Tại sao?

PHP không phải là ngôn ngữ đa luồng và nó cũng không thể xử lý (hầu hết) các tác vụ không đồng bộ. Chắc chắn có pthreads và pcntl nhưng chúng chỉ có thể sử dụng được trong chế độ cli (hoặc chỉ nên được sử dụng ở đó). Sử dụng thư viện này, bạn có thể viết các tác vụ có thể được thực thi song song bởi cùng một hệ thống hoặc bất kỳ hệ thống nào khác

Nó hoạt động như thế nào (Làm ơn đi đường ngắn)?

Một công việc được lên lịch thông qua bộ lập lịch tác vụ và được ghi vào hàng đợi tin nhắn trung tâm (MongoDB). Tất cả các nút Hàng đợi sẽ được thông báo trong thời gian thực (mềm) rằng có một công việc mới. Nút hàng đợi sẽ chuyển tiếp công việc thông qua hàng đợi tin nhắn systemv nội bộ tới trình quản lý công nhân. Người quản lý công nhân quyết định xem có cần tạo công nhân mới hay không. Cuối cùng, một công nhân sẽ thực hiện nhiệm vụ theo nguyên tắc đến trước phục vụ trước. Nếu không có chỗ trống nào, công việc sẽ đợi trong hàng đợi và được thực hiện ngay khi có chỗ trống. Một công việc có thể được lên lịch lại nếu nó thất bại. Có rất nhiều tính năng có sẵn, tiếp tục đọc

Yêu cầu

  • Hệ thống Posix (Về cơ bản mọi linux)
  • Máy chủ MongoDB >= 3. 6
  • Bộ sao chép MongoDB (Cũng có thể chỉ là một nút MongoDB)
  • PHP >= 7. 1
  • Phần mở rộng pcntl PHP
  • Phần mở rộng posix PHP
  • Phần mở rộng PHP mongodb
  • Phần mở rộng sysvmsg PHP

Lưu ý . Thư viện này sẽ chỉ hoạt động trên hệ thống *nix. Không có cửa sổ hỗ trợ và rất có thể sẽ không bao giờ có.

Tải xuống

Gói có sẵn tại packagist

Để cài đặt gói thông qua trình soạn thảo thực thi

composer require gyselroth/php-task-scheduler

Nhật ký thay đổi

Một thay đổi có sẵn ở đây

Đóng góp

Chúng tôi rất vui vì bạn muốn đóng góp cho dự án này. Vui lòng làm theo các điều khoản nhất định

Điều kiện

Bạn có thể gặp các thuật ngữ sau trong readme này hoặc ở nơi khác

TermClassDescriptionScheduler
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
5Scheduler được sử dụng để thêm công việc, truy vấn công việc, xóa công việc và lắng nghe các sự kiện, nó là thành phần duy nhất bên cạnh các công việc (khác) thực sự được sử dụng trong ứng dụng chính của bạn. Công việc
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
6Việc triển khai công việc là nhiệm vụ thực tế mà bạn muốn thực hiện. Quy trình
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
7Bạn sẽ nhận được một quy trình sau khi thêm công việc, truy vấn công việc, v.v., quy trình về cơ bản là phần trên của quá trình thực hiện công việc của bạn. Nút hàng đợi
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
8Các nút hàng đợi xử lý các công việc có sẵn và chuyển tiếp chúng tới trình quản lý công nhân. Người quản lý công nhân_______1_______9Công việc của người quản lý công nhân là tạo ra những công nhân thực sự xử lý công việc. Ghi chú. Bản thân trình quản lý công nhân là một nhánh từ quy trình nút hàng đợi. Công nhân_______6_______0Công nhân là những người xử lý một công việc từ hàng đợi và thực sự làm công việc bạn đã nộp. Nhà máy công nhân
$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
1Một nhà máy công nhân cần được bạn triển khai, nó sẽ tạo ra người quản lý công nhân và công nhân mới. Cluster-A cluster là một tập hợp nhiều nút xếp hàng. Một cụm không cần phải được cấu hình theo bất kỳ cách nào, bạn có thể bắt đầu bao nhiêu nút hàng đợi tùy thích

Cài đặt

Nếu ứng dụng của bạn được tạo bằng bộ chứa docker, bạn phải sử dụng ít nhất các tùy chọn bản dựng sau

________số 8_______

Tài liệu

Để hiểu rõ hơn về cách thức hoạt động của thư viện này, chúng ta sẽ triển khai một công việc thư. Tất nhiên bạn có thể thực hiện bất kỳ loại công việc nào

Tạo công việc

Việc tạo một tác vụ khá dễ dàng, bạn chỉ cần triển khai TaskScheduler\JobInterface. Trong ví dụ này, chúng tôi sẽ triển khai một công việc có tên là MailJob để gửi thư bằng zend-mail

Lưu ý . Bạn có thể sử dụng TaskScheduler\AbstractJob để triển khai các phương thức mặc định được yêu cầu bởi TaskScheduler\JobInterface. Điều duy nhất sau đó bạn cần triển khai là start() thực hiện công việc thực tế (gửi thư).

class MailJob extends TaskScheduler\AbstractJob
{
    /**
     * {@inheritdoc}
     */
    public function start(): bool
    {
        $transport = new Zend\Mail\Transport\Sendmail();
        $mail = Message::fromString($this->data);
        $this->transport->send($mail);

        return true;
    }
}

Khởi tạo bộ lập lịch

Bạn cần một phiên bản MongoDB\Database và một bộ ghi tương thích Psr\Log\LoggerInterface để khởi tạo bộ lập lịch

$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);

công việc ống chỉ

Bây giờ, hãy để chúng tôi tạo một thư và triển khai nó tới bộ lập lịch tác vụ mà chúng tôi đã khởi tạo ngay trước đó

$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());

Đây là toàn bộ điều kỳ diệu, bộ lập lịch của chúng tôi hiện đã có công việc đầu tiên, thật tuyệt vời

thực hiện công việc

Nhưng bây giờ chúng ta cần thực hiện các queued job đó
Đó là nơi các nút hàng đợi phát huy tác dụng. Các nút đó lắng nghe trong thời gian thực (mềm) cho các công việc mới và sẽ cân bằng tải các công việc đó

Tạo nhà máy công nhân

Bạn sẽ cần tạo nhà máy nút công nhân của riêng mình trong không gian tên ứng dụng được gọi để sinh ra các quy trình con mới. Nhà máy này được gọi trong khi một ngã ba mới được sinh ra. Điều này có nghĩa là nếu nó được gọi, bạn đang ở trong một quy trình mới và bạn sẽ cần khởi động lại ứng dụng của mình từ đầu (Hoặc chỉ những thứ bạn cần cho một nhân viên)

Lưu ý . Cả người quản lý công nhân và chính công nhân đều được sinh ra trong các nhánh riêng từ quy trình nút hàng đợi.

Queue node (TaskScheduler\Queue)
|
|-- Worker Manager (TaskScheduler\WorkerManager)
    |
    |-- Worker (TaskScheduler\Worker)
    |-- Worker (TaskScheduler\Worker)
    |-- Worker (TaskScheduler\Worker)
    |-- ...

Đối với cả người quản lý công nhân và công nhân, một ngã ba mới có nghĩa là bạn sẽ cần phải khởi động lại lớp từ đầu

Lưu ý . Về mặt lý thuyết, bạn có thể sử dụng lại các kết nối, đối tượng hiện có, v.v. bằng cách đặt chúng thông qua hàm tạo của nhà máy worker của bạn vì nhà máy được khởi tạo trong hàm main(). Nhưng điều này có thể dẫn đến lỗi và hành vi lạ của ứng dụng và không được hỗ trợ.

Để hiểu rõ hơn. nếu có một tệp cấu hình mà bạn đã lưu trữ các cấu hình của mình như một MongoDB uri, trong nhà máy, bạn sẽ cần phân tích lại cấu hình này và tạo một phiên bản mongodb mới. Hoặc bạn có thể đang sử dụng thùng chứa PSR-11, thùng chứa cần được tạo từ đầu trong nhà máy (Cây phụ thuộc mới). Bạn có thể chuyển một thể hiện của dic (tương thích với Psr\Container\ContainerInterface) làm đối số thứ năm cho TaskScheduler\Worker (hoặc tùy chọn trình quản lý worker nâng cao làm đối số thứ ba cho TaskScheduler\WorkerManager (). Tìm hiểu thêm tại )

class WorkerFactory extends TaskScheduler\WorkerFactoryInterface
{
    /**
     * {@inheritdoc}
     */
    public function buildWorker(MongoDB\BSON\ObjectId $id): TaskScheduler\Worker
    {
        $mongodb = new MongoDB\Client('mongodb://localhost:27017');
        $logger = new \A\Psr4\Compatible\Logger();
        $scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);

        return new TaskScheduler\Worker($id, $scheduler, $mongodb->mydb, $logger);
    }
    
    /**
     * {@inheritdoc}
     */
    public function buildManager(): TaskScheduler\WorkerManager
    {
        $logger = new \A\Psr4\Compatible\Logger();
        return new TaskScheduler\WorkerManager($this, $logger);
    }
}

Tạo nút hàng đợi

Hãy để chúng tôi viết một nút hàng đợi mới. Nút hàng đợi phải được bắt đầu như một quá trình riêng biệt. Bạn nên cung cấp một cách dễ dàng để bắt đầu các nút xếp hàng như vậy, có nhiều cách để đạt được điều này. Cách dễ nhất là chỉ tạo một tập lệnh php duy nhất có thể bắt đầu qua cli

$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
$worker_factory = My\App\WorkerFactory(); #An instance of our previously created worker factory
$queue = new TaskScheduler\Queue($scheduler, $mongodb, $worker_factory, $logger);

Và sau đó bắt đầu phép thuật

$queue->process();

Lưu ý . Trình lập lịch tác vụ\Hàng đợi. process() là một cuộc gọi chặn.

Thư của chúng tôi được gửi ngay khi nút xếp hàng đang chạy và bắt đầu một số công nhân

Thông thường, bạn muốn các nút đó luôn chạy. Chúng hoạt động giống như các nút thực thi vô hình phía sau ứng dụng của bạn

quản lý công việc

Nhận việc

Bạn có thể muốn truy xuất tất cả các công việc đã lên lịch

$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
$scheduler->getJobs();

Theo mặc định, bạn sẽ nhận được tất cả các công việc có trạng thái

  • CHỜ
  • XỬ LÝ
  • TRÌ HOÃN

Bạn có thể chuyển một truy vấn tùy chọn để truy vấn các công việc cụ thể

FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
0

Hủy công việc

Có thể hủy các công việc đang chờ trong hàng đợi cũng như hủy các công việc đang thực sự chạy

FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
1

Nếu bạn hủy một công việc với trạng thái ĐANG XỬ LÝ, công việc đó sẽ bị hủy và dữ liệu của tôi bị hỏng. Bạn đã được cảnh báo. (Điều này tương tự khi công việc kết thúc với trạng thái TIMEOUT). Sự khác biệt duy nhất là một công việc hết thời gian chờ sẽ được lên lịch lại nếu nó đã thử lại > 0 hoặc có một khoảng thời gian được định cấu hình. Một công việc bị hủy sẽ không được lên lịch lại. Bạn sẽ cần tạo một công việc mới theo cách thủ công cho công việc đó

sửa đổi công việc

Không thể sửa đổi công việc đã lên lịch theo thiết kế. Bạn cần hủy công việc và thêm một công việc mới

Lưu ý . Điều này có thể được thay đổi với v4 sẽ có tính năng bền bỉ cho công việc.

tuôn ra hàng đợi

Mặc dù không thể sửa đổi/xóa công việc nhưng có thể xóa toàn bộ hàng đợi

Lưu ý . Điều này không có nghĩa là được gọi thường xuyên. Có thể có trường hợp bạn cần xóa tất cả các công việc do nâng cấp. Các nút xếp hàng đang chạy sẽ phát hiện điều này và sẽ lắng nghe các công việc mới được lưu trữ.

FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
2

Xử lý công việc thất bại

Một công việc được xác nhận là thất bại nếu công việc đưa ra một ngoại lệ dưới bất kỳ hình thức nào. Nếu chúng tôi xem lại công việc thư của mình, nhưng lần này nó sẽ đưa ra một ngoại lệ

FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
3

Điều này sẽ dẫn đến một công việc KHÔNG THÀNH CÔNG ngay sau khi công việc này được thực thi

Lưu ý . Không có vấn đề gì nếu bạn quay lại

$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
2 hoặc
$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
3, chỉ một trường hợp ngoại lệ chưa được thực hiện mới dẫn đến công việc KHÔNG THÀNH CÔNG, tuy nhiên, bạn phải luôn quay lại
$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
2.

Bộ lập lịch có xử lý tích hợp các công việc không thành công. Bạn có thể chỉ định tự động lên lịch lại một công việc nếu nó không thành công. Phần sau đây sẽ lên lịch lại công việc tối đa 5 lần (Nếu nó kết thúc với trạng thái FAILED) với khoảng thời gian là 30 giây

FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
4

Điều này sẽ xếp hàng thư của chúng tôi để được thực thi sau một giờ kể từ bây giờ và nó sẽ lên lịch lại công việc tối đa ba lần nếu nó không thành công trong khoảng thời gian một phút

Ping còn sống và tiến độ công việc

TaskScheduler có hỗ trợ tích hợp để cập nhật tiến độ công việc từ quá trình thực hiện công việc của bạn. Theo mặc định, một công việc bắt đầu từ

$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
5 (%) và kết thúc với tiến độ
$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
6 (%). Lưu ý rằng tiến độ là số nổi. Bạn có thể tăng tiến độ đạt được trong công việc của mình

Quan trọng. Lưu ý rằng theo mặc định, bộ lập lịch sẽ nhận một công việc sau 30 giây là mồ côi và lên lịch lại cho nó. Bạn có thể thay đổi số 30 trên toàn cầu trong quá trình khởi tạo Trình lập lịch biểu hoặc tiếp tục gọi ____6_______7 trong quá trình thực hiện nhiệm vụ của mình. Việc gọi

$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
8 có hoặc không có tiến trình hoạt động giống như một lệnh ping duy trì hoạt động cho bộ lập lịch và sẽ được gọi trong tác vụ của bạn nếu đó là một tác vụ chạy dài có vòng lặp. Nếu không có vòng lặp, bạn vẫn nên gọi phương thức này theo một số dạng khoảng thời gian để giữ cho tác vụ của bạn tồn tại. Không cần đặt tiến trình dưới dạng giá trị phần trăm, nếu không đặt, tác vụ sẽ tiếp tục ở mức 0% và đặt thành 100% nếu hoàn thành

Chúng ta hãy xem nó hoạt động như thế nào với công việc sao chép tệp từ a sang b

FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
5

Tiến trình hiện tại có thể có sẵn bằng cách sử dụng giao diện quy trình

FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
6

Lưu ý Có giới hạn tốc độ cập nhật tiến độ theo mặc định là 500 mili giây. Bạn có thể thay đổi giới hạn tốc độ bằng cách định cấu hình

$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
9 thành thứ khác và thành 0 nếu bạn hoàn toàn không muốn giới hạn tốc độ.

lập trình không đồng bộ

Hãy xem ví dụ này

FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
7

Điều này sẽ buộc main() (Quy trình của bạn) đợi cho đến khi tác vụ

Queue node (TaskScheduler\Queue)
|
|-- Worker Manager (TaskScheduler\WorkerManager)
    |
    |-- Worker (TaskScheduler\Worker)
    |-- Worker (TaskScheduler\Worker)
    |-- Worker (TaskScheduler\Worker)
    |-- ...
0 được thực thi. (Hoặc với trạng thái XONG, KHÔNG ĐẠT, ĐÃ HỦY, HẾT THỜI GIAN)

Đây là ví dụ phức tạp hơn

FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
8

Điều này sẽ đợi cả ba công việc hoàn thành trước khi tiếp tục

Lưu ý quan trọng
Nếu bạn đang lập trình ở chế độ http (các yêu cầu http đến) và ứng dụng của bạn cần triển khai các tác vụ thì bạn không nên chờ đợi. Thay vào đó, cách tốt nhất là trả về mã HTTP 202. Nếu khách hàng cần biết kết quả của những công việc đó, bạn có thể trả lại id của quy trình và gửi yêu cầu thứ 2, sau đó chờ và trả về trạng thái của những công việc đó hoặc khách hàng có thể nhận được kết quả của nó thông qua kết nối liên tục hoặc ổ cắm web

FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
9

Bạn cũng có thể chặn thời gian chờ nếu bất kỳ quy trình nào dẫn đến ngoại lệ

class MailJob extends TaskScheduler\AbstractJob
{
    /**
     * {@inheritdoc}
     */
    public function start(): bool
    {
        $transport = new Zend\Mail\Transport\Sendmail();
        $mail = Message::fromString($this->data);
        $this->transport->send($mail);

        return true;
    }
}
0

Lắng nghe các sự kiện

Bạn có thể liên kết với bộ lập lịch và lắng nghe mọi thay đổi và thực hiện công việc. )

class MailJob extends TaskScheduler\AbstractJob
{
    /**
     * {@inheritdoc}
     */
    public function start(): bool
    {
        $transport = new Zend\Mail\Transport\Sendmail();
        $mail = Message::fromString($this->data);
        $this->transport->send($mail);

        return true;
    }
}
1

Cũng có thể lọc các sự kiện như vậy, ví dụ này sẽ chỉ được thông báo cho các sự kiện xảy ra trong một công việc cụ thể

class MailJob extends TaskScheduler\AbstractJob
{
    /**
     * {@inheritdoc}
     */
    public function start(): bool
    {
        $transport = new Zend\Mail\Transport\Sendmail();
        $mail = Message::fromString($this->data);
        $this->transport->send($mail);

        return true;
    }
}
2

Lưu ý . nghe() là một cuộc gọi chặn, bạn có thể thoát khỏi trình nghe và tiếp tục với hàm main() nếu bạn trả về giá trị boolean

$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
2 trong hàm gọi lại của trình nghe.

sự kiện ràng buộc

Bên cạnh phương thức nghe đơn giản cho Trình lập lịch biểu, bạn có thể liên kết các trình nghe sự kiện với

$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
8 và/hoặc
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
5 của bạn

Ví dụ

class MailJob extends TaskScheduler\AbstractJob
{
    /**
     * {@inheritdoc}
     */
    public function start(): bool
    {
        $transport = new Zend\Mail\Transport\Sendmail();
        $mail = Message::fromString($this->data);
        $this->transport->send($mail);

        return true;
    }
}
3

Lưu ý . Bạn cần ràng buộc người nghe của mình trước khi gọi

Queue node (TaskScheduler\Queue)
|
|-- Worker Manager (TaskScheduler\WorkerManager)
    |
    |-- Worker (TaskScheduler\Worker)
    |-- Worker (TaskScheduler\Worker)
    |-- Worker (TaskScheduler\Worker)
    |-- ...
4 vì đó là cuộc gọi chặn đồng bộ.

Bạn có thể liên kết người nghe với cùng một sự kiện trong các nút hàng đợi của mình

class MailJob extends TaskScheduler\AbstractJob
{
    /**
     * {@inheritdoc}
     */
    public function start(): bool
    {
        $transport = new Zend\Mail\Transport\Sendmail();
        $mail = Message::fromString($this->data);
        $this->transport->send($mail);

        return true;
    }
}
4

Lưu ý . Bạn cần ràng buộc người nghe của mình trước khi gọi

Queue node (TaskScheduler\Queue)
|
|-- Worker Manager (TaskScheduler\WorkerManager)
    |
    |-- Worker (TaskScheduler\Worker)
    |-- Worker (TaskScheduler\Worker)
    |-- Worker (TaskScheduler\Worker)
    |-- ...
5 vì đó là cuộc gọi chặn đồng bộ.

Sự kiện

Bạn có thể ràng buộc cho các sự kiện sau

ShortFullScopeDescription
Queue node (TaskScheduler\Queue)
|
|-- Worker Manager (TaskScheduler\WorkerManager)
    |
    |-- Worker (TaskScheduler\Worker)
    |-- Worker (TaskScheduler\Worker)
    |-- Worker (TaskScheduler\Worker)
    |-- ...
6
Queue node (TaskScheduler\Queue)
|
|-- Worker Manager (TaskScheduler\WorkerManager)
    |
    |-- Worker (TaskScheduler\Worker)
    |-- Worker (TaskScheduler\Worker)
    |-- Worker (TaskScheduler\Worker)
    |-- ...
7globalTriggers after a new job got added
Queue node (TaskScheduler\Queue)
|
|-- Worker Manager (TaskScheduler\WorkerManager)
    |
    |-- Worker (TaskScheduler\Worker)
    |-- Worker (TaskScheduler\Worker)
    |-- Worker (TaskScheduler\Worker)
    |-- ...
8
Queue node (TaskScheduler\Queue)
|
|-- Worker Manager (TaskScheduler\WorkerManager)
    |
    |-- Worker (TaskScheduler\Worker)
    |-- Worker (TaskScheduler\Worker)
    |-- Worker (TaskScheduler\Worker)
    |-- ...
9globalTriggers after a job has been postponed
class WorkerFactory extends TaskScheduler\WorkerFactoryInterface
{
    /**
     * {@inheritdoc}
     */
    public function buildWorker(MongoDB\BSON\ObjectId $id): TaskScheduler\Worker
    {
        $mongodb = new MongoDB\Client('mongodb://localhost:27017');
        $logger = new \A\Psr4\Compatible\Logger();
        $scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);

        return new TaskScheduler\Worker($id, $scheduler, $mongodb->mydb, $logger);
    }
    
    /**
     * {@inheritdoc}
     */
    public function buildManager(): TaskScheduler\WorkerManager
    {
        $logger = new \A\Psr4\Compatible\Logger();
        return new TaskScheduler\WorkerManager($this, $logger);
    }
}
0
class WorkerFactory extends TaskScheduler\WorkerFactoryInterface
{
    /**
     * {@inheritdoc}
     */
    public function buildWorker(MongoDB\BSON\ObjectId $id): TaskScheduler\Worker
    {
        $mongodb = new MongoDB\Client('mongodb://localhost:27017');
        $logger = new \A\Psr4\Compatible\Logger();
        $scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);

        return new TaskScheduler\Worker($id, $scheduler, $mongodb->mydb, $logger);
    }
    
    /**
     * {@inheritdoc}
     */
    public function buildManager(): TaskScheduler\WorkerManager
    {
        $logger = new \A\Psr4\Compatible\Logger();
        return new TaskScheduler\WorkerManager($this, $logger);
    }
}
1globalTriggers after a job started to execute
class WorkerFactory extends TaskScheduler\WorkerFactoryInterface
{
    /**
     * {@inheritdoc}
     */
    public function buildWorker(MongoDB\BSON\ObjectId $id): TaskScheduler\Worker
    {
        $mongodb = new MongoDB\Client('mongodb://localhost:27017');
        $logger = new \A\Psr4\Compatible\Logger();
        $scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);

        return new TaskScheduler\Worker($id, $scheduler, $mongodb->mydb, $logger);
    }
    
    /**
     * {@inheritdoc}
     */
    public function buildManager(): TaskScheduler\WorkerManager
    {
        $logger = new \A\Psr4\Compatible\Logger();
        return new TaskScheduler\WorkerManager($this, $logger);
    }
}
2
class WorkerFactory extends TaskScheduler\WorkerFactoryInterface
{
    /**
     * {@inheritdoc}
     */
    public function buildWorker(MongoDB\BSON\ObjectId $id): TaskScheduler\Worker
    {
        $mongodb = new MongoDB\Client('mongodb://localhost:27017');
        $logger = new \A\Psr4\Compatible\Logger();
        $scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);

        return new TaskScheduler\Worker($id, $scheduler, $mongodb->mydb, $logger);
    }
    
    /**
     * {@inheritdoc}
     */
    public function buildManager(): TaskScheduler\WorkerManager
    {
        $logger = new \A\Psr4\Compatible\Logger();
        return new TaskScheduler\WorkerManager($this, $logger);
    }
}
3globalTriggers after a job finished successfully
class WorkerFactory extends TaskScheduler\WorkerFactoryInterface
{
    /**
     * {@inheritdoc}
     */
    public function buildWorker(MongoDB\BSON\ObjectId $id): TaskScheduler\Worker
    {
        $mongodb = new MongoDB\Client('mongodb://localhost:27017');
        $logger = new \A\Psr4\Compatible\Logger();
        $scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);

        return new TaskScheduler\Worker($id, $scheduler, $mongodb->mydb, $logger);
    }
    
    /**
     * {@inheritdoc}
     */
    public function buildManager(): TaskScheduler\WorkerManager
    {
        $logger = new \A\Psr4\Compatible\Logger();
        return new TaskScheduler\WorkerManager($this, $logger);
    }
}
4
class WorkerFactory extends TaskScheduler\WorkerFactoryInterface
{
    /**
     * {@inheritdoc}
     */
    public function buildWorker(MongoDB\BSON\ObjectId $id): TaskScheduler\Worker
    {
        $mongodb = new MongoDB\Client('mongodb://localhost:27017');
        $logger = new \A\Psr4\Compatible\Logger();
        $scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);

        return new TaskScheduler\Worker($id, $scheduler, $mongodb->mydb, $logger);
    }
    
    /**
     * {@inheritdoc}
     */
    public function buildManager(): TaskScheduler\WorkerManager
    {
        $logger = new \A\Psr4\Compatible\Logger();
        return new TaskScheduler\WorkerManager($this, $logger);
    }
}
5globalTriggers after a job failed
class WorkerFactory extends TaskScheduler\WorkerFactoryInterface
{
    /**
     * {@inheritdoc}
     */
    public function buildWorker(MongoDB\BSON\ObjectId $id): TaskScheduler\Worker
    {
        $mongodb = new MongoDB\Client('mongodb://localhost:27017');
        $logger = new \A\Psr4\Compatible\Logger();
        $scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);

        return new TaskScheduler\Worker($id, $scheduler, $mongodb->mydb, $logger);
    }
    
    /**
     * {@inheritdoc}
     */
    public function buildManager(): TaskScheduler\WorkerManager
    {
        $logger = new \A\Psr4\Compatible\Logger();
        return new TaskScheduler\WorkerManager($this, $logger);
    }
}
6
class WorkerFactory extends TaskScheduler\WorkerFactoryInterface
{
    /**
     * {@inheritdoc}
     */
    public function buildWorker(MongoDB\BSON\ObjectId $id): TaskScheduler\Worker
    {
        $mongodb = new MongoDB\Client('mongodb://localhost:27017');
        $logger = new \A\Psr4\Compatible\Logger();
        $scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);

        return new TaskScheduler\Worker($id, $scheduler, $mongodb->mydb, $logger);
    }
    
    /**
     * {@inheritdoc}
     */
    public function buildManager(): TaskScheduler\WorkerManager
    {
        $logger = new \A\Psr4\Compatible\Logger();
        return new TaskScheduler\WorkerManager($this, $logger);
    }
}
7globalTriggers after a job timed out
class WorkerFactory extends TaskScheduler\WorkerFactoryInterface
{
    /**
     * {@inheritdoc}
     */
    public function buildWorker(MongoDB\BSON\ObjectId $id): TaskScheduler\Worker
    {
        $mongodb = new MongoDB\Client('mongodb://localhost:27017');
        $logger = new \A\Psr4\Compatible\Logger();
        $scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);

        return new TaskScheduler\Worker($id, $scheduler, $mongodb->mydb, $logger);
    }
    
    /**
     * {@inheritdoc}
     */
    public function buildManager(): TaskScheduler\WorkerManager
    {
        $logger = new \A\Psr4\Compatible\Logger();
        return new TaskScheduler\WorkerManager($this, $logger);
    }
}
8
class WorkerFactory extends TaskScheduler\WorkerFactoryInterface
{
    /**
     * {@inheritdoc}
     */
    public function buildWorker(MongoDB\BSON\ObjectId $id): TaskScheduler\Worker
    {
        $mongodb = new MongoDB\Client('mongodb://localhost:27017');
        $logger = new \A\Psr4\Compatible\Logger();
        $scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);

        return new TaskScheduler\Worker($id, $scheduler, $mongodb->mydb, $logger);
    }
    
    /**
     * {@inheritdoc}
     */
    public function buildManager(): TaskScheduler\WorkerManager
    {
        $logger = new \A\Psr4\Compatible\Logger();
        return new TaskScheduler\WorkerManager($this, $logger);
    }
}
9globalTriggers after a job has been canceled
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
$worker_factory = My\App\WorkerFactory(); #An instance of our previously created worker factory
$queue = new TaskScheduler\Queue($scheduler, $mongodb, $worker_factory, $logger);
0
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
$worker_factory = My\App\WorkerFactory(); #An instance of our previously created worker factory
$queue = new TaskScheduler\Queue($scheduler, $mongodb, $worker_factory, $logger);
1queue node onlyTriggers after a queue node spawned a new worker
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
$worker_factory = My\App\WorkerFactory(); #An instance of our previously created worker factory
$queue = new TaskScheduler\Queue($scheduler, $mongodb, $worker_factory, $logger);
2
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
$worker_factory = My\App\WorkerFactory(); #An instance of our previously created worker factory
$queue = new TaskScheduler\Queue($scheduler, $mongodb, $worker_factory, $logger);
3queue node

Trình phát sự kiện tùy chỉnh

Về cơ bản, cả

$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
8 và
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
5 đều sử dụng
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
$worker_factory = My\App\WorkerFactory(); #An instance of our previously created worker factory
$queue = new TaskScheduler\Queue($scheduler, $mongodb, $worker_factory, $logger);
6 làm bộ phát sự kiện. Bạn có thể tạo cả hai phiên bản với phiên bản Trình tổ chức sự kiện giải đấu của riêng bạn

class MailJob extends TaskScheduler\AbstractJob
{
    /**
     * {@inheritdoc}
     */
    public function start(): bool
    {
        $transport = new Zend\Mail\Transport\Sendmail();
        $mail = Message::fromString($this->data);
        $this->transport->send($mail);

        return true;
    }
}
5

Tùy chọn công việc nâng cao

Trình lập lịch tác vụ \ Trình lập lịch. addJob()/TaskScheduler\Scheduler. addJobOnce() cũng chấp nhận tùy chọn thứ ba (tùy chọn) cho phép bạn đặt các tùy chọn nâng cao hơn cho công việc

OptionDefaultTypeDescription
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
$worker_factory = My\App\WorkerFactory(); #An instance of our previously created worker factory
$queue = new TaskScheduler\Queue($scheduler, $mongodb, $worker_factory, $logger);
7
$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
5intChấp nhận thời gian unix cụ thể cho phép bạn chỉ định thời gian thực hiện công việc. Mặc định (0) là ngay lập tức hoặc tốt hơn là nói ngay khi có một vị trí miễn phí.
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
$worker_factory = My\App\WorkerFactory(); #An instance of our previously created worker factory
$queue = new TaskScheduler\Queue($scheduler, $mongodb, $worker_factory, $logger);
9_______6_______5int Bạn có thể chỉ định khoảng thời gian công việc (tính bằng giây) hữu ích cho các công việc cần được thực hiện trong một khoảng thời gian cụ thể, ví dụ: dọn dẹp thư mục tạm thời. Giá trị mặc định là
$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
5 có nghĩa là không có khoảng thời gian nào cả,
$queue->process();
2 có nghĩa là thực hiện lại công việc ngay lập tức (Nhưng hãy cẩn thận với
$queue->process();
2, điều này có thể dẫn đến việc sử dụng nhiều cpu tùy thuộc vào công việc bạn đang thực hiện). Định cấu hình
$queue->process();
4 có nghĩa là công việc sẽ được thực hiện hàng giờ.
$queue->process();
5
$queue->process();
6chuỗi Bạn có thể chỉ định nếu khoảng thời gian đề cập đến
$queue->process();
7 hoặc
$queue->process();
6 của công việc trước đó. Giá trị mặc định là
$queue->process();
6 có nghĩa là khoảng thời gian đề cập đến thời gian kết thúc của công việc trước đó. Khi bạn xác định
$queue->process();
7, khoảng thời gian đề cập đến thời gian bắt đầu của công việc trước đó. Điều này có thể hữu ích khi một công việc phải chạy vào những thời điểm cụ thể.
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
$scheduler->getJobs();
1_______6_______5intChỉ định khoảng thời gian thử lại nếu công việc không thực thi được. Giá trị mặc định là
$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
5 có nghĩa là không thử lại. Ví dụ:
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
$scheduler->getJobs();
4 có nghĩa là 2 lần thử lại. Bạn có thể đặt
$queue->process();
2 để thử lại vô tận.
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
$scheduler->getJobs();
6
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
$scheduler->getJobs();
7int Tùy chọn này chỉ định thời gian (tính bằng giây) giữa các lần thử lại công việc. Mặc định là
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
$scheduler->getJobs();
7 tức là 5 phút. Hãy cẩn thận với tùy chọn này trong khi
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
$scheduler->getJobs();
6 là
$queue->process();
2, bạn có thể kết thúc bằng một vòng lặp thất bại.
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
01
$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
3boolBạn có thể chỉ định
$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
2 cho tùy chọn này để sinh ra một công nhân mới chỉ cho nhiệm vụ này. Ghi chú. Tùy chọn này bỏ qua giá trị max_children của
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
9, có nghĩa là công nhân này luôn được sinh ra. Nó hoàn toàn hợp lý đối với các công việc thực hiện các cuộc gọi chặn, ví dụ như một trình nghe lắng nghe các thay đổi của hệ thống tệp cục bộ (inotify). Một công việc với tùy chọn được bật này sẽ chỉ tiêu tốn ít cpu/bộ nhớ nhất có thể.
class WorkerFactory extends TaskScheduler\WorkerFactoryInterface
{
    /**
     * {@inheritdoc}
     */
    public function buildWorker(MongoDB\BSON\ObjectId $id): TaskScheduler\Worker
    {
        $mongodb = new MongoDB\Client('mongodb://localhost:27017');
        $logger = new \A\Psr4\Compatible\Logger();
        $scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);

        return new TaskScheduler\Worker($id, $scheduler, $mongodb->mydb, $logger);
    }
    
    /**
     * {@inheritdoc}
     */
    public function buildManager(): TaskScheduler\WorkerManager
    {
        $logger = new \A\Psr4\Compatible\Logger();
        return new TaskScheduler\WorkerManager($this, $logger);
    }
}
6_______6_______5intChỉ định thời gian chờ tính bằng giây sẽ chấm dứt công việc sau khi hết thời gian nhất định bằng vũ lực.
$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
5 mặc định có nghĩa là không có thời gian chờ nào cả. Công việc hết thời gian chờ sẽ được lên lịch lại nếu thử lại không phải là
$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
5 và sẽ được đánh dấu là đã hết thời gian chờ.
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
09
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
10
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
11Chỉ định id công việc theo cách thủ công.
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
12_______6_______3boolChỉ hữu ích nếu được đặt trong lệnh gọi addJobOnce(). Nếu
$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
2 người lên lịch không so sánh dữ liệu công việc để quyết định xem công việc có cần được lên lịch lại hay không

Lưu ý . Hãy cẩn thận với thời gian chờ vì nó sẽ giết chết công việc đang chạy của bạn. Bạn đã được cảnh báo. Bạn sẽ luôn sử dụng thời gian chờ gốc trong một chức năng nếu được hỗ trợ.

Hãy để chúng tôi thêm lại ví dụ về công việc thư của chúng tôi với một số tùy chọn tùy chỉnh

Lưu ý . Chúng tôi đang sử dụng các hằng số OPTION_ ở đây, bạn cũng có thể chỉ sử dụng các tên được ghi ở trên.

class MailJob extends TaskScheduler\AbstractJob
{
    /**
     * {@inheritdoc}
     */
    public function start(): bool
    {
        $transport = new Zend\Mail\Transport\Sendmail();
        $mail = Message::fromString($this->data);
        $this->transport->send($mail);

        return true;
    }
}
6

Điều này sẽ xếp hàng thư của chúng tôi để được thực thi sau một giờ kể từ bây giờ và nó sẽ lên lịch lại công việc tối đa ba lần nếu nó không thành công trong khoảng thời gian một phút

Thêm công việc nếu chưa có

Những gì bạn cũng có thể làm là chỉ thêm công việc nếu nó chưa được xếp hàng đợi. Thay vì sử dụng

FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
15, bạn có thể sử dụng
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
16, bộ lập lịch trình sau đó sẽ xác minh xem nó có cùng một công việc đã được xếp hàng chưa. Nếu không, công việc sẽ được thêm vào. Bộ lập lịch so sánh loại công việc (
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
17 trong trường hợp này) và dữ liệu được gửi (
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
18 trong trường hợp này)

Lưu ý . Công việc được lên lịch lại nếu các tùy chọn bị thay đổi.

class MailJob extends TaskScheduler\AbstractJob
{
    /**
     * {@inheritdoc}
     */
    public function start(): bool
    {
        $transport = new Zend\Mail\Transport\Sendmail();
        $mail = Message::fromString($this->data);
        $this->transport->send($mail);

        return true;
    }
}
7

Theo mặc định,

FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
19 không so sánh loại công việc, dữ liệu đã gửi và trạng thái quy trình (ĐANG XỬ LÝ, CHỜ ĐỢI hoặc ĐÃ HOÃN). Nếu bạn không muốn kiểm tra dữ liệu, bạn có thể đặt
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
20 thành
$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
2. Điều này sẽ yêu cầu bộ lập lịch chỉ lên lịch lại công việc của lớp đã cho nếu dữ liệu thay đổi. Điều này khá hữu ích nếu một công việc của lớp nhất định chỉ được xếp hàng một lần

Lưu ý . Tùy chọn này không hợp lý trong ví dụ thư mà chúng tôi đang sử dụng ở đây. Một thư có thể có nội dung khác nhau. Nhưng có thể xảy ra trường hợp bạn có công việc xóa bộ nhớ tạm thời sau mỗi 24 giờ.

class MailJob extends TaskScheduler\AbstractJob
{
    /**
     * {@inheritdoc}
     */
    public function start(): bool
    {
        $transport = new Zend\Mail\Transport\Sendmail();
        $mail = Message::fromString($this->data);
        $this->transport->send($mail);

        return true;
    }
}
8

Nếu max_age thay đổi, công việc cũ sẽ bị hủy và công việc mới sẽ được xếp vào hàng đợi. Nếu

FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
20 không được đặt ở đây, chúng ta sẽ có hai công việc thuộc loại
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
23

class MailJob extends TaskScheduler\AbstractJob
{
    /**
     * {@inheritdoc}
     */
    public function start(): bool
    {
        $transport = new Zend\Mail\Transport\Sendmail();
        $mail = Message::fromString($this->data);
        $this->transport->send($mail);

        return true;
    }
}
9

Tất nhiên, cũng có thể truy vấn công việc đó theo cách thủ công, hủy bỏ và lên lịch lại. Điều này sẽ đạt được như trên

$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
0

Tùy chọn lập lịch trình nâng cao

Bạn có thể đặt các tùy chọn công việc đó làm mặc định chung cho toàn bộ lịch biểu. Các tùy chọn và giá trị mặc định tùy chỉnh có thể được đặt cho các công việc trong quá trình khởi tạo hoặc bằng cách gọi Trình lập lịch biểu. setOptions()

$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
1

Bạn cũng có thể thay đổi các tùy chọn đó sau đó

$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
2

Lưu ý . Thay đổi tùy chọn công việc mặc định sẽ không ảnh hưởng đến bất kỳ công việc hiện có nào.

NameDefaultTypeDescription_______8_______24
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
25stringBộ sưu tập MongoDB hoạt động như hàng đợi thông báo công việc.
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
26
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
27intKích thước tối đa tính bằng byte của bộ sưu tập công việc, nếu đạt đến công việc đầu tiên sẽ bị ghi đè bởi công việc mới.
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
28
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
29stringBộ sưu tập MongoDB hoạt động như hàng đợi thông báo sự kiện.
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
30
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
31intKích thước tối đa tính bằng byte của bộ sưu tập sự kiện, nếu đạt đến thì sự kiện đầu tiên sẽ bị ghi đè bởi sự kiện mới. Giá trị này thường phải lớn hơn 5 lần so với giá trị của
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
26 vì một công việc có thể có nhiều sự kiện hơn.
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
33_______8_______10?intXác định thời gian thực hiện mặc định cho tất cả các công việc. Điều này chỉ liên quan đến các công việc mới được thêm vào. Mặc định là ngay lập tức hoặc tốt hơn là nói ngay khi có một vị trí miễn phí.
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
35
$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
5intXác định khoảng thời gian mặc định cho tất cả các công việc. Điều này chỉ liên quan đến các công việc mới được thêm vào. Giá trị mặc định là
$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
5 có nghĩa là không có khoảng thời gian nào cả.
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
38
$queue->process();
6chuỗiXác định xem khoảng thời gian đề cập đến
$queue->process();
7 hay
$queue->process();
6 của công việc trước đó.
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
42_______6_______5intXác định khoảng thời gian thử lại mặc định cho tất cả các công việc. Điều này chỉ liên quan đến các công việc mới được thêm vào. Không có thử lại theo mặc định cho các công việc không thành công.
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
44_______16_______7int Tùy chọn này chỉ định thời gian (tính bằng giây) giữa các lần thử lại công việc. Điều này chỉ liên quan đến các công việc mới được thêm vào. Mặc định là
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
$scheduler->getJobs();
7 tức là 5 phút.
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
47
$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
5intChỉ định thời gian chờ mặc định cho tất cả các công việc. Điều này chỉ liên quan đến các công việc mới được thêm vào. Theo mặc định, không có thời gian chờ nào cả

Lưu ý . Điều quan trọng là chọn kích thước hàng đợi (job_queue_size và event_queue_size) phù hợp với thiết lập của bạn.

Tùy chọn quản lý công nhân nâng cao

Mặc dù bạn đã biết rằng bạn cần một nhà máy công nhân để sinh ra trình quản lý công nhân, nhưng bạn có thể chỉ định các tùy chọn nâng cao cho nó. Đây là nhân viên của chúng tôi, nhưng lần này chúng tôi chỉ định thêm một số tùy chọn

$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
3

Xử lý công nhân được thực hiện bằng cách chỉ định tùy chọn

FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
49 trong khi công nhân sinh sản động là chế độ mặc định

NameDefaultTypeDescription_______8_______49
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
51stringBạn có thể thay đổi cách xử lý fork được thực hiện. Có ba chế độ. động, tĩnh, theo yêu cầu.
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
52
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
53intSố tiến trình con tối thiểu.
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
54
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
$scheduler->getJobs();
4intSố tiến trình con tối đa

Chế độ quản lý quy trình (

FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
49)

  • động (bắt đầu rẽ nhánh min_children khi khởi động và tự động tạo con mới nếu được yêu cầu cho đến khi đạt được max_children)
  • tĩnh (bắt đầu các nút min_children, (max_children bị bỏ qua))
  • theo yêu cầu (Không khởi động bất kỳ công việc con nào khi khởi động (min_children bị bỏ qua), khởi động một công nhân cho mỗi công việc nhưng không quá max_children. Sau khi hoàn thành công việc (Hoặc thất bại, bị hủy, hết thời gian), công nhân chết

Mặc định là

FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
51. Thông thường
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
51 có ý nghĩa. Bạn có thể cần
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
59 trong thế giới được cung cấp vùng chứa trong khi số nút hàng đợi được xác định từ số lượng công việc chưa xử lý. Ví dụ: bạn có thể đang sử dụng Kubernetes autoscaling

Lưu ý . Số lượng quy trình con thực tế có thể cao hơn nếu các công việc được lên lịch với tùy chọn Trình lập lịch biểu. OPTION_FORCE_SPAWN.

Sử dụng PSR-11 DIC

Theo tùy chọn, người ta có thể chuyển Psr\Container\ContainerInterface cho các nút worker, sau đó được gọi để tạo các thể hiện công việc. Bạn có thể đã nhận được nó, nhưng đây là công nhân. Lần này, nó chuyển một thể hiện của bộ chứa PSR-11 tới các nút worker. Và nếu bạn đã sử dụng một vùng chứa thì hoàn toàn hợp lý khi yêu cầu người quản lý từ vùng chứa đó. (Tất nhiên, bạn cũng có thể yêu cầu một phiên bản worker từ nó nếu việc triển khai bộ chứa của bạn hỗ trợ các tham số trong thời gian chạy (Id worker). Ghi chú. Đây sẽ là một triển khai bộ chứa không tương thích từ thông số kỹ thuật PSR-11. )

$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
4

xử lý tín hiệu

Tất nhiên là có thể chấm dứt các nút hàng đợi. Họ thậm chí còn quản lý để sắp xếp lại các công việc đang chạy. Bạn chỉ cần gửi SIGTERM cho quy trình. Sau đó, nút hàng đợi sẽ truyền điều này đến trình quản lý công nhân trong khi trình quản lý công nhân sẽ gửi nó cho tất cả các công nhân đang chạy và họ sẽ lưu trạng thái của mình và thoát ra một cách dễ dàng. Một worker cũng lưu trạng thái của nó nếu worker process trực tiếp nhận được một SIGTERM. Nếu SIGKILL được sử dụng để chấm dứt nút hàng đợi (hoặc công nhân), trạng thái không thể được lưu và bạn có thể nhận các công việc zombie (Công việc có trạng thái XỬ LÝ nhưng không có công nhân nào thực sự xử lý các công việc đó). Không quản trị viên hệ thống tốt nào sẽ chấm dứt các công việc đang chạy bằng cách sử dụng SIGKILL, điều này không được chấp nhận và chỉ có thể được sử dụng nếu bạn biết mình đang làm gì

Bạn cũng nên tránh sử dụng các hàm chặn không bao giờ kết thúc trong công việc của mình, php không thể xử lý các tín hiệu nếu bạn làm điều đó

Làm cách nào để chạy tập lệnh PHP bằng Trình lập lịch tác vụ?

Trả lời .
Đăng nhập vào Plesk
Chuyển đến Công cụ & Cài đặt > Tác vụ đã lên lịch > Thêm tác vụ;
Tại Script Path, chỉ định đường dẫn đầy đủ đến tập lệnh PHP trên máy chủ. .
Tại trường Run, chỉ định tần suất mong muốn mà tác vụ sẽ được chạy;
Chọn Chạy tập lệnh PHP và đặt phiên bản bắt buộc
Nhấn OK để lưu tác vụ

Làm cách nào để tạo một công việc định kỳ để chạy tập lệnh PHP?

Công việc định kỳ với PHP và loại tệp khác .
PHP. Lệnh chạy cron job PHP5. php/home/tên người dùng/public_html/cron. php. .
perl. Lệnh chạy CGI cron job. perl/home/tên người dùng/public_html/cgi-bin/tệp. làm ơn
SSH. Lệnh chạy cron job shell script. /bin/sh/home/tên người dùng/public_html/tệp. sh
mysql

Làm thế nào để viết một lịch trình trong PHP?

php'; . định cấu hình các công việc đã lên lịch (xem bên dưới). // Để bộ lập lịch thực hiện các công việc đến hạn. $scheduler->run(); . $scheduler = new Scheduler(); // .. configure the scheduled jobs (see below) .. // Let the scheduler execute jobs which are due. $scheduler->run(); Then add a new entry to your crontab to run scheduler.

Làm cách nào để tạo một tệp bó để chạy tập lệnh PHP?

Thực thi tập lệnh php trong tệp bat .
1 trường hợp 1. Thực thi mã PHP trực tiếp
2 trường hợp 2. Thực thi tệp script PHP mà không truyền tham số
3 trường hợp 3. Thực thi tệp script PHP truyền tham số
4 Ví dụ về tập tin bat
5 Ví dụ về tệp bash
6 Tự động chạy tập lệnh PHP tại một thời điểm xác định
7 Khắc phục sự cố