Addon 2x CLI Job Runner for XF 2.2 - Trình chạy công việc CLI cho XenForo 2.2

PVS

Super Moderator
Thành viên BQT
Tham gia
28/02/2015
Bài viết
16,826
Được Like
12,687
CLI Job Runner for XF 2.2 - Trình chạy công việc CLI cho XenForo 2.2 2.0.0

Addon XenForo 2.2 này triển khai trình chạy công việc được kích hoạt CLI nâng cao để sử dụng với Unix cron để thay thế cho lệnh xf:run-jobs tích hợp được giới thiệu trong XF 2.2

Lệnh này được gọi là hg:run-jobs và thực hiện tương tự như xf:run-jobs, nhưng với nhiều tùy chọn và chức năng hơn.

Tính năng

Các tính năng chính của addon này:
  • cho phép các lệnh xử lý jobs/crons tối đa 10 phút mỗi lần, ngay cả khi được kích hoạt mỗi phút từ tác vụ cron (sử dụng tệp khóa để ngăn chặn nhiều lần thực thi song song) - lý tưởng để cải thiện hiệu suất công việc trên các trang lưu lượng truy cập cao
  • output gỡ lỗi mở rộng có sẵn để kiểm tra và xác định các vấn đề với các job và tác vụ cron
  • drop-in thay thế cho xf:run-jobs
Yêu cầu

Addon này yêu cầu PHP 7.0 trở lên và đã được thử nghiệm trên XenForo 2.2.0 beta 1

Cài đặt

Cài đặt như cài đặt addon bình thường.

Sau khi cài đặt, hãy chuyển đến trang System và tùy chọn hiệu suất khi thay đổi thiết lập Job run trigger thành "Server based trigger"

1596700351453.png

Trước tiên, bạn nên kiểm tra xem người chạy công việc của bạn đang hoạt động hay không - thực hiện lệnh sau từ CLI của bạn:
Bash:
$ php <path to your forum root>/cmd.php hg:run-jobs

Ví dụ: nếu diễn đàn gốc của bạn là /srv/www/xenforo/community, thì lệnh job runner sẽ là:
Bash:
$ php /srv/www/xenforo/community/cmd.php hg:run-jobs

Chạy lệnh này sẽ thực hiện bất kỳ công việc nào còn tồn đọng và sau đó kết thúc với một thông báo về việc có thêm công việc đang chờ được thực hiện hay không. Khi thực hiện lệnh này từ cron, bạn nên sử dụng cờ --quiet (hoặc -q) để chặn đầu ra.

Một khi bạn hài lòng rằng job runner hoạt động chính xác, bạn sẽ cần tạo tác vụ cron của riêng mình để chạy nó theo lịch trình bạn chọn.

LƯU Ý: nếu bạn đã thiết lập một tác vụ cron để chạy xf:run-jobs, chỉ cần tắt nó đi và thay thế nó bằng một tác vụ giống hệt chạy hg:run-jobs.

Tiếp cận #1 bằng crontab:

Rất khuyến khích bạn thực hiện tác vụ cron của mình với tư cách là người dùng máy chủ web để ngăn chặn các vấn đề về quyền tiềm ẩn.

Ví dụ: trên Ubuntu với người dùng máy chủ web của www-data, hãy cài đặt tác vụ cron bằng cách chạy lệnh sau:
Bash:
$ sudo crontab -u www-data -e

Chỉnh sửa tệp crontab và thêm:
Bash:
    *       *       *       *       *       php /path/to/your/forum/root/cmd.php --quiet hg:run-jobs

Lưu crontab.

Tiếp cận #2 bằng cron.d:

Thay vì sử dụng crontab, một số bản phân phối Linux tạo một thư mục nổi tiếng được tự động kiểm tra các tác vụ cron để thực thi. Trong trường hợp của Ubuntu, bạn có thể tạo các tệp trong /etc/cron.d/ nơi bạn chỉ định lịch biểu, người dùng thực hiện lệnh dưới dạng và chính lệnh đó.

Tạo một tệp trong /etc/cron.d/ với nội dung sau:
Bash:
* * * * * webserver-user php /path/to/your/forum/root/cmd.php --quiet hg:run-jobs

... trong đó webserver-user được thay đổi thành tên người dùng mà máy chủ web của bạn chạy và thay đổi đường dẫn đến diễn đàn gốc của bạn.

Một lần nữa, sử dụng ví dụ trước trong đó người dùng máy chủ web là www-data và diễn đàn gốc là
/srv/www/xenforo/community, chúng ta sẽ thực hiện lệnh sau để tạo tệp cron:
Bash:
echo "* * * * * www-data php /srv/www/xenforo/community/cmd.php --quiet hg:run-jobs" | sudo tee -a /etc/cron.d/xenforo

Cả hai tùy chọn (crontab và cron.d) sẽ thực thi job runner mỗi phút, kiểm tra các công việc chưa hoàn thành sẽ được chạy.

Theo mặc định, job runner sẽ chạy trong tối đa 30 giây, thực hiện bất kỳ công việc nào còn tồn đọng cho đến khi không còn công việc có thể chạy được nữa trong hàng đợi.

Cấu hình

Bạn có thể điều chỉnh thời gian thực hiện tối đa của job runner bằng cách chỉ định tùy chọn --time=[TIME] trên dòng lệnh.

Ví dụ: để cho phép job runner thực thi trong tối đa 45 giây:
Bash:
$ php <path to your forum root>/cmd.php --time=45 hg:run-jobs

Addon này sử dụng các tệp khóa để ngăn nhiều lệnh của job runner thực thi cùng một lúc, điều này cũng cho phép chúng ta chạy lệnh trong thời gian dài hơn trên các trang web bận rộn.

Thời gian thực hiện tối đa cho phép là 10 phút (600 giây). Lệnh sẽ thực thi cho đến khi không tìm thấy công việc nào nổi bật hơn và sau đó dừng lại - vì vậy thời gian thực hiện thường chỉ vài giây.

Để tùy chỉnh thêm việc thực hiện công việc của bạn, bạn cũng có thể điều chỉnh thời gian tối đa mà mỗi công việc được phép chạy.
Điều này được định cấu hình thông qua Tùy chọn XenForo config.php:
Mã:
$config['jobMaxRunTime'] = 8;

Tùy chọn jobMaxRunTime định cấu hình khoảng thời gian tính bằng giây mà các công việc đang xử lý sẽ được phép chạy trước khi chúng bị tạm dừng để xử lý thêm trong một lần quay khác, nếu có thể. Cài đặt mặc định được tối ưu hóa cho job runner do trình duyệt kích hoạt và do đó để cho phép các công việc thực thi lâu hơn trong môi trường CLI, bạn có thể muốn điều chỉnh cài đặt này thành giá trị cao hơn.

Nói chung, đề xuất rằng cài đặt này được giữ ở một giá trị tương đối nhỏ để tránh trường hợp một công việc rất dài có thể ngăn cản các công việc khác thực hiện kịp thời. Một số thử nghiệm có thể được yêu cầu để tìm giá trị tối ưu cho tải máy chủ và kích thước diễn đàn của bạn. Nếu nghi ngờ, hãy để nó làm cài đặt mặc định là 8 giây.

Cách dùng

Lệnh run-jobs sẽ được thực thi tự động bằng tác vụ cron theo hướng dẫn ở trên.

Hiển thị các Job

Lệnh hg:show-jobs xuất ra một danh sách tất cả các công việc hiện đang chờ xử lý, vì vậy bạn có thể thấy mức độ đầy đủ của hàng đợi công việc.

Theo mặc định, chỉ 100 công việc đã lên lịch tiếp theo sẽ được hiển thị, bạn có thể sử dụng tùy chọn --all để hiển thị danh sách đầy đủ tất cả các công việc đang chờ xử lý.

Luôn phải có ít nhất một công việc (Cron job chính) trong danh sách. Đối với XF 2.1 trở lên, bạn cũng sẽ thấy công việc kiểm tra nâng cấp.
Bash:
$ php cmd.php xf:show-jobs              

2 pending jobs found

+----------------+-----------------+----------------------+----------------------+
| Key            | Class           | Next Run             | Last Run             |
+----------------+-----------------+----------------------+----------------------+
| cron           | XF\Job\Cron     | 11-Apr-2019 10:52:01 | 11-Apr-2019 10:52:31 |
| xfUpgradeCheck | XF:UpgradeCheck | 12-Apr-2019 00:12:21 | 10-Apr-2019 21:24:03 |
+----------------+-----------------+----------------------+----------------------+

The current time is: 11-Apr-2019 10:52:31 (UTC+10:00)

Job gỡ lỗi

Có các công cụ gỡ lỗi mở rộng để giúp xác định các vấn đề với các tác vụ Job và Cron.

Để chạy ở chế độ gỡ lỗi, trước tiên hãy tắt Unix cron tự động chạy các công việc (đừng quên bật lại nó một lần nữa sau khi bạn gỡ lỗi xong!) Và sau đó sử dụng các tùy chọn chi tiết (Verbose: -v, Very verbose: -vv hoặc Debug: -vvv) cho lệnh hg:run-jobs để chỉ định mức output hiển thị trên bảng điều khiển.

Output là bảng điều khiển và có định dạng tương tự như định dạng được sử dụng bởi thư viện Monolog (mặc dù không sử dụng Monolog để tạo output).

Ví dụ, tùy chọn Verbose -v:
Mã:
$ php cmd.php hg:run-jobs -v
[2019-11-27 23:53:09] XF\Job\Cron: Cron entry XF\Cron\CleanUp::runUserDowngrade executed in 0.01 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry Hampel\LogDigest\Cron\SendLogs::serverError executed in 0.00 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry XF\Cron\MemberStats::rebuildMemberStatsCache executed in 0.00 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry Hampel\Slack\Cron\NotifyLogs::notify executed in 0.03 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry XF\Cron\Feeder::importFeeds executed in 0.01 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry XFMG\Cron\RandomCache::generateRandomMediaCache executed in 0.07 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry XF\Cron\EmailBounce::process executed in 0.00 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry XF\Cron\Counters::rebuildForumStatistics executed in 0.02 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Job executed in 0.20 seconds

No more runnable jobs pending

Tùy chọn Very Verbose -vv thêm ngữ cảnh, thường là về JobResult:
Bash:
$ php cmd.php hg:run-jobs -vv
[2019-11-27 23:49:49] XF\Job\Cron: Cron entry Hampel\Slack\Cron\NotifyLogs::notify executed in 0.01 seconds {"entry_id":"slackNotifyServerErrors","cron_class":"Hampel\\Slack\\Cron\\NotifyLogs","cron_method":"notify","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":-1}},"active":true,"next_run":1574898543,"addon_id":"Hampel\/Slack"}

[2019-11-27 23:49:49] XF\Job\Cron: Cron entry Hampel\SparkPost\Cron\MessageEvents::fetchMessageEvents executed in 0.00 seconds {"entry_id":"sparkpostMessageEvents","cron_class":"Hampel\\SparkPost\\Cron\\MessageEvents","cron_method":"fetchMessageEvents","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":19,"1":49}},"active":true,"next_run":1574898543,"addon_id":"Hampel\/SparkPost"}

[2019-11-27 23:49:49] XF\Job\Cron: Job executed in 0.03 seconds {"completed":false,"jobId":2,"continueDate":1574898603,"continueDate_formatted":"2019-11-27 23:50:03 UTC","statusMessage":"Running... Cron entries"}

[2019-11-27 23:49:49] Hampel\SparkPost:MessageEvent: Job executed in 0.83 seconds {"completed":true,"jobId":12,"continueDate":null,"continueDate_formatted":"","statusMessage":""}

No more runnable jobs pending

Và cuối cùng tùy chọn Debug -vvv bổ sung thêm thông tin về công việc:
Bash:
$ php cmd.php hg:run-jobs -vvv
[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\Feeder::importFeeds executed in 0.01 seconds {"entry_id":"feeder","cron_class":"XF\\Cron\\Feeder","cron_method":"importFeeds","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":2,"1":12,"2":22,"3":32,"4":42,"5":52}},"active":true,"next_run":1574879524,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\Counters::rebuildForumStatistics executed in 0.02 seconds {"entry_id":"forumStatistics","cron_class":"XF\\Cron\\Counters","cron_method":"rebuildForumStatistics","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":3,"1":13,"2":23,"3":33,"4":43,"5":53}},"active":true,"next_run":1574879584,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\MemberStats::rebuildMemberStatsCache executed in 0.03 seconds {"entry_id":"memberStatsCache","cron_class":"XF\\Cron\\MemberStats","cron_method":"rebuildMemberStatsCache","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":0,"1":10,"2":20,"3":30,"4":40,"5":50}},"active":true,"next_run":1574880004,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\Trophy::runTrophyCheck executed in 0.00 seconds {"entry_id":"trophy","cron_class":"XF\\Cron\\Trophy","cron_method":"runTrophyCheck","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":40}},"active":true,"next_run":1574880004,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XFMG\Cron\Statistics::cacheGalleryStatistics executed in 0.01 seconds {"entry_id":"xfmgCacheStats","cron_class":"XFMG\\Cron\\Statistics","cron_method":"cacheGalleryStatistics","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":10,"1":40}},"active":true,"next_run":1574880004,"addon_id":"XFMG"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\CleanUp::expireTempUserChanges executed in 0.00 seconds {"entry_id":"expireTempUserChanges","cron_class":"XF\\Cron\\CleanUp","cron_method":"expireTempUserChanges","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":42}},"active":true,"next_run":1574880124,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XFMG\Cron\RandomCache::generateRandomAlbumCache executed in 0.02 seconds {"entry_id":"xfmgGenerateRandomAlbum","cron_class":"XFMG\\Cron\\RandomCache","cron_method":"generateRandomAlbumCache","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":12,"1":42}},"active":true,"next_run":1574880124,"addon_id":"XFMG"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\EmailUnsubscribe::process executed in 0.00 seconds {"entry_id":"emailUnsubscribe","cron_class":"XF\\Cron\\EmailUnsubscribe","cron_method":"process","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":13,"1":43}},"active":true,"next_run":1574880184,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\Ban::deleteExpiredBans executed in 0.01 seconds {"entry_id":"deleteExpiredBans","cron_class":"XF\\Cron\\Ban","cron_method":"deleteExpiredBans","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":45}},"active":true,"next_run":1574880304,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Job executed in 0.32 seconds {"completed":false,"jobId":2,"continueDate":1574898543,"continueDate_formatted":"2019-11-27 23:49:03 UTC","statusMessage":"Running... Cron entries"} {"job_id":2,"unique_key":"cron","execute_class":"XF\\Job\\Cron","execute_data":{},"manual_execute":0,"trigger_date":1574879464,"last_run_date":1574879405,"trigger_date_formatted":"2019-11-27 18:31:04 UTC","last_run_date_formatted":"2019-11-27 18:30:05 UTC"}

[2019-11-27 23:48:03] Hampel\SparkPost:MessageEvent: Job executed in 0.90 seconds {"completed":true,"jobId":10,"continueDate":null,"continueDate_formatted":"","statusMessage":""} {"job_id":10,"unique_key":"SparkPostMessageEvents","execute_class":"Hampel\\SparkPost:MessageEvent","execute_data":{},"manual_execute":0,"trigger_date":1574898483,"last_run_date":null,"trigger_date_formatted":"2019-11-27 23:48:03 UTC","last_run_date_formatted":""}

[2019-11-27 23:48:03] Hampel\SparkPost:EmailBounce: Job executed in 0.02 seconds {"completed":true,"jobId":11,"continueDate":null,"continueDate_formatted":"","statusMessage":""} {"job_id":11,"unique_key":"SparkPostEmailBounce","execute_class":"Hampel\\SparkPost:EmailBounce","execute_data":{},"manual_execute":0,"trigger_date":1574898483,"last_run_date":null,"trigger_date_formatted":"2019-11-27 23:48:03 UTC","last_run_date_formatted":""}

No more runnable jobs pending

Gỡ lỗi công việc tùy chỉnh

Bạn có thể thêm gỡ lỗi bổ sung cho các công việc tùy chỉnh của mình.

Thêm hàm sau vào class công việc của bạn để gọi hàm logJobProgress của class Logger:
PHP:
    protected function log($message, array $context = [])
    {
        // check to see if we actually have a logger available and abort if not
        if (!isset($this->app['cli.logger'])) return;

        /** @var Logger $logger */
        $logger = $this->app['cli.logger'];
        $logger->logJobProgress($message, $context, $this);
    }

Sau đó, bạn có thể gọi hàm log() trong code công việc của mình để gửi thông tin đến bảng điều khiển khi Job Runner được thực thi ở chế độ chi tiết.

Ví dụ - xem công việc thử nghiệm được bao gồm trong addon này Hampel\JobRunner\Job\TestJob:
PHP:
    public function run($maxRunTime)
    {
        $this->log("About to start test job", $this->data);

        $mail = $this->app->mailer()->newMail();
        $mail->setTo($this->data['email']);
        $mail->setContent(
            "Test job",
            "This is an email sent from a test job"
        );
        $sent = $mail->send();

        $this->log("Sent mail", ['sent' => $sent]);

        return $this->complete();
    }

Đoạn code trên sẽ tạo ra kết quả sau khi Job Runner ở chế độ gỡ lỗi:
Bash:
$ php cmd.php hg:run-jobs -vvv
[2019-11-28 00:26:21] Hampel\JobRunner:TestJob: About to start test job {"email":"[email protected]"} {"job_id":17,"class":"Hampel\\JobRunner\\Job\\TestJob","status_message":"Testing jobs","data":{"email":"[email protected]"},"execution_time":"0.00"}

[2019-11-28 00:26:21] Hampel\JobRunner:TestJob: Sent mail {"sent":1} {"job_id":17,"class":"Hampel\\JobRunner\\Job\\TestJob","status_message":"Testing jobs","data":{"email":"[email protected]"},"execution_time":"0.95"}

[2019-11-28 00:26:21] Hampel\JobRunner:TestJob: Job executed in 0.95 seconds {"completed":true,"jobId":17,"continueDate":null,"continueDate_formatted":"","statusMessage":""} {"job_id":17,"unique_key":null,"execute_class":"Hampel\\JobRunner:TestJob","execute_data":{"email":"[email protected]"},"manual_execute":0,"trigger_date":1574900777,"last_run_date":null,"trigger_date_formatted":"2019-11-28 00:26:17 UTC","last_run_date_formatted":""}

No more runnable jobs pending

Không có output nào được hiển thị khi chạy ở chế độ yên tĩnh - và quan trọng hơn, nếu addon này bị vô hiệu hóa, code ghi nhật ký sẽ không cần phải xóa. Phần quan trọng là dòng if (!isset(\XF::app['cli.logger'])) return; này sẽ hủy bỏ nếu Logger không khả dụng.

Gỡ lỗi tác vụ Cron tùy chỉnh

Sử dụng một cơ chế tương tự, chúng ta cũng có thể thêm code gỡ lỗi vào các tác vụ Cron tùy chỉnh của mình:

Thêm một hàm hơi khác vào các tác vụ Cron của bạn để gọi hàm log() của class Logger:
Mã:
    protected static function log($message, array $context = [])
    {
        // check to see if we actually have a logger available and abort if not
        if (!isset(\XF::app['cli.logger'])) return;

        /** @var Logger $logger */
        $logger = \XF::app['cli.logger'];
        $logger->log("XF\Job\Cron", $message, $context);
    }

Sau đó, chỉ cần gọi một cái gì đó như: self::log("some message about something happening", ['key' => 'value']); trong code của bạn để xuất thông tin ra bảng điều khiển khi Job Runner được thực thi ở chế độ chi tiết.

Đặc điểm Logger

Ngoài ra còn có một đặc điểm bạn có thể đưa vào các class của mình: Hampel\JobRunner\Cli\LoggerTrait thực hiện một số chức năng ghi nhật ký cơ bản mà bạn có thể gọi từ code của mình:
  • getLogger
  • log
  • logNormal
  • logVerbose
  • logVeryVerbose
  • debug
Không cần xóa code ghi nhật ký hoặc gỡ lỗi khỏi trình bổ sung khi bạn triển khai - khi chạy hg:run-jobs ở chế độ bình thường hoặc yên tĩnh, không có output nào được hiển thị.

Chúc các bạn thành công.


Nguồn: xenforo.com​
 

Đính kèm

  • Hampel-JobRunner-2.0.0 Beta 1.zip
    25.9 KB · Lượt xem: 6
  • Hampel-JobRunner-2.0.0 Beta 2.zip
    25.3 KB · Lượt xem: 7
  • Hampel-JobRunner-2.0.0 Beta 3.zip
    28.2 KB · Lượt xem: 9
  • Hampel-JobRunner-2.0.0.zip
    28.9 KB · Lượt xem: 10

PVS

Super Moderator
Thành viên BQT
Tham gia
28/02/2015
Bài viết
16,826
Được Like
12,687
Update phiên bản 2.0.0 Beta 2
 

PVS

Super Moderator
Thành viên BQT
Tham gia
28/02/2015
Bài viết
16,826
Được Like
12,687
Update phiên bản 2.0.0 Beta 3
 

PVS

Super Moderator
Thành viên BQT
Tham gia
28/02/2015
Bài viết
16,826
Được Like
12,687
Update phiên bản 2.0.0
 

Hướng dẫn sử dụng

XenForo 1 XenForo 2
Translate by PVS

Dịch vụ XenForo của VNXF

Mr. Tuấn

Mobile/Zalo: 0988 488 096

Telegram: bluekpro

Email: [email protected]

Nhà Tài Trợ

Mút Xốp Không Gian
pallet Thịnh Phát
Top Bottom