Làm cách nào để chạy lịch trình trong 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 tác 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
  • Đặc trưng
  • Tại sao?
  • Nó hoạt động như thế nào (Làm ơn đi đường ngắn)?
  • Yêu cầu
  • Tải xuống
  • Nhật ký thay đổi
  • Đóng góp
  • Điều kiện
  • Tài liệu
    • Tạo công việc
    • Khởi tạo bộ lập lịch
    • công việc ống chỉ
    • thực hiện công việc
      • Tạo nhà máy công nhân
      • Tạo nút hàng đợi
    • quản lý công việc
      • Nhận việc
      • Hủy công việc
      • sửa đổi công việc
    • Xử lý công việc thất bại
    • tiến độ công việc
    • Lập trình không đồng bộ
    • Lắng nghe sự kiện
      • sự kiện ràng buộc
    • Tùy chọn công việc nâng cao
    • Thêm công việc nếu chưa có
    • Tùy chọn quản lý công nhân nâng cao
    • Tùy chọn nút hàng đợi nâng cao
    • Sử dụng PSR-11 DIC
    • Tính bền vững của dữ liệu
    • xử lý tín hiệu
  • Ví dụ thế giới thự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);
5Bộ lập lịch đượ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
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
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
$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
0Công nhân là những người xử lý công việc từ hàng đợi và thực sự thực hiện công việc bạn đã gửi. 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 thi các công việc đã xếp hàng đó.
Đó 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.

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

Đố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ùy chọn trình quản lý worker nâng cao). Xem thêm tại Sử dụng DIC)

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

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);
4

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

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

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 đằng 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

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

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Ờ
  • CHẾ BIẾN
  • 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 ý . Việc bạn trả 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 không thành vấn đề, chỉ một ngoại lệ chưa được phát 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 trả 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

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

$scheduler->addJob(MailJob::class, $mail->toString());
7 trong quá trình thực hiện tác 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ó chứa một 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ụ

$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
20 đượ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ề 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 ________ 15 của mình

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 _______ 124 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 _______ 125 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
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
26
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
27globalTriggers after a new job got added
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
28
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
29globalTriggers after a job has been postponed
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
30
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
31globalTriggers after a job started to execute
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
32
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
33globalTriggers after a job finished successfully
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
34
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
35globalTriggers after a job failed
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
36
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
37globalTriggers after a job timed out
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
38
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
39globalTriggers 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);
40
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
41queue 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);
42
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
43queue 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);
46 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);
47
$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);
49 ________ 65in 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ả,
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
52 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
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
52, đ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
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
54 có nghĩa là công việc sẽ được thực hiện hàng giờ.
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
55
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
56chuỗi Bạn có thể chỉ định nếu khoảng thời gian đề cập đến
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
57 hoặc
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
56 của công việc trước đó. Giá trị mặc định là
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
56 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
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
57, 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ể.
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
61
$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
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ụ như
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
64 có nghĩa là 2 lần thử lại. Bạn có thể đặt
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
52 để thử lại vô tận.
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
66
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
67int 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à
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
67 tức là 5 phút. Hãy cẩn thận với tùy chọn này trong khi
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
66 là
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
52, 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 để tạo 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, nghĩa là nhân viê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ể.
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
36
$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ờ 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
$mail = new Message();
$mail->setSubject('Hello...');
$mail->setBody('World');
$mail->setFrom('root@localhost', 'root');

$scheduler->addJob(MailJob::class, $mail->toString());
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 bộ lập 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 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 lớp 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 tôi sẽ kết thúc với 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____824
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______827intKí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
FROM php:7.4
RUN docker-php-ext-install pcntl sysvmsg
RUN pecl install mongodb && docker-php-ext-enable mongodb pcntl sysvmsg
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
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
56stringXác định xem khoảng thời gian đề cập đến
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
57 hay
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
56 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
$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 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
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
67intTù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à
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
67 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à máy công nhân của chúng tôi một lần nữa, 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____849
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 thức 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
$mongodb = new MongoDB\Client('mongodb://localhost:27017');
$logger = new \A\Psr4\Compatible\Logger();
$scheduler = new TaskScheduler\Scheduler($mongodb->mydb, $logger);
64intSố 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. Có thể bạn đã hiểu rồi, nhưng đây lại là nhà máy của 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 để sử dụng lịch biểu 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();

Làm cách nào để chạy một công việc định kỳ trong php?

Thời gian - đặt ngày trong tuần, tháng, ngày, giờ và phút. Thực thi – công việc định kỳ cần được gọi bằng PHP để chạy – công việc đó nằm ở đường dẫn /usr/bin/php. Script Path – đường dẫn của file bạn muốn chạy. Đầu ra – bạn được phép thêm đầu ra cron vào một tệp hoặc loại bỏ nó. /dev/null 2>&1 sẽ loại bỏ

Làm cách nào để chạy tập lệnh php cứ sau 5 phút?

hãy thử giải pháp này. ? php $interval=5; .