Bài học về Cron Jobs trong mã nguồn mở Laravel

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down

Bài học về Cron Jobs trong mã nguồn mở Laravel  Empty Bài học về Cron Jobs trong mã nguồn mở Laravel

Bài gửi by nuong 14/1/2016, 15:40

Có lần khi ứng dụng của bạn cần để chạy các nhiệm vụ hành chính định kỳ trên máy chủ. Cho dù bạn muốn gửi email đến người dùng của bạn hoặc làm sạch các bảng cơ sở dữ liệu vào cuối ngày, bạn sẽ cần một cơ chế lập lịch trình công việc để chăm sóc các nhiệm vụ, khi đó là thời gian.


Cron là một lịch trình công việc trong các hệ thống unix-like, chạy các lệnh shell trong khoảng thời gian nhất định. Bài viết này không có nghĩa là cho giới thiệu Cron, nhưng vì nó là một khái niệm quan trọng trong hướng dẫn của chúng tôi, chúng tôi sẽ sẽ mô tả các vấn đề cơ bản về cách hoạt động.


cron cơ bản


Cron là một daemon lên lịch công việc mà chạy dự kiến nhiệm vụ trong khoảng thời gian nhất định. Cron sử dụng một tập tin cấu hình được gọi là crontab, còn được gọi là bảng cron, để quản lý quá trình lập kế hoạch.


Crontab chứa công việc cron, từng liên quan đến một công việc cụ thể. Công việc cron gồm hai phần, các biểu hiện cron, và một lệnh shell để chạy:




Code:
* * * * * command/to/run



Mỗi trường trong biểu thức trên (* * * * *) là một lựa chọn để thiết lập các lịch bay thường xuyên. Nó bao gồm phút, giờ, ngày trong tháng, tháng, ngày trong tuần theo thứ tự các vị trí. Các biểu tượng dấu đề cập đến tất cả các giá trị có thể cho các lĩnh vực tương ứng. Kết quả là, công việc cron trên sẽ được chạy mỗi phút trong ngày.


Các công việc cron sau đây được thực hiện vào lúc 12:30 mỗi ngày:


Code:
30 12 * * * command/to/run

Đây chỉ là đỉnh của tảng băng trôi Cron; để tìm hiểu thêm về nó, bạn có thể muốn truy cập vào trang wikipedia.


Trong PHP hỗ trợ các ứng dụng, công việc hành chính thường độc kịch bản PHP mà đang chạy trong chế độ CLI. Những kịch bản được viết để thực hiện các công việc khác nhau vào những thời điểm nhất định.


Tuy nhiên, chúng ta không thể làm được gì nhiều mà không có sức mạnh của các thư viện PHP khác và các khuôn khổ. Trong bài viết này, bạn sẽ học cách sử dụng khuôn khổ Laravel để tạo ra các kịch bản PHP mạnh mẽ cho các dòng lệnh và lên lịch cho chúng ngay từ mã nguồn.


Tạo Commands trong Laravel
Tạo một lệnh trong PHP cũng đơn giản như việc tạo ra một kịch bản PHP, sau đó chạy nó trong dòng lệnh, sử dụng lệnh php:


Code:
php somefile.php



Như bạn có thể thấy, các tập tin được thông qua như là một tham số cho lệnh php.


Cho dù ứng dụng của bạn đã được phát triển trong Laravel, hoặc bạn chỉ muốn sử dụng mặt tiền và người giúp việc của mình để tạo ra các kịch bản của bạn, bạn sẽ cần phải tải khởi Laravel trước khi sử dụng nó. Tuy nhiên, có một lựa chọn tốt hơn cho điều này: việc tạo ra một lệnh Laravel Artisan.


Khi sử dụng lệnh thủ công, chúng tôi sẽ có quyền truy cập vào tất cả các tính năng của Laravel, bao gồm cả những người giúp đỡ, mặt tiền, và lệnh Artisan khác, chỉ cần đến tên một vài.


Chúng tôi sẽ không đi vào chi tiết của Artisan lệnh ở đây, như họ đang vượt ra ngoài phạm vi của bài này, nhưng chúng ta hãy thảo luận về các vấn đề cơ bản, chỉ để bắt đầu. Chúng tôi sẽ sẽ được sử dụng phiên bản mới nhất của Laravel, đó là 5.1 ở thời điểm viết bài này.


Chúng tôi sử dụng thực hiện: lệnh console Artisan để tạo ra một bộ xương class lệnh để làm việc với. Như một ví dụ, chúng ta sẽ tạo ra một lệnh mà sẽ gửi một tin nhắn SMS mừng sinh nhật cho người dùng của chúng tôi vào ngày sinh nhật của họ.


Code:
$ php artisan make:console HappyBirthday --command=sms:birthday

>>> Xem thêm học lập trình android cơ bản tại hà nội !


Lệnh trên sẽ tạo ra một lớp có tên Happy Birthday trong một tập tin cùng tên trong thư mục / Console / Commands ứng dụng. Chúng tôi cũng chọn một tên cho các lệnh thông qua các tùy chọn lệnh. Đây là tên mà chúng tôi sẽ sử dụng khi gọi lệnh.
Bây giờ chúng ta hãy mở tập tin, và xem những gì chúng tôi có cho đến nay. Có một số tài sản và phương pháp bên trong các lớp học mà xây dựng phụ trợ của lệnh:
Code:

[size=16]<?php[/size]
[size=16]namespace App\Console\Commands;[/size]
[size=16]
[/size]
[size=16]use Illuminate\Console\Command;[/size]
[size=16]
[/size]
[size=16]class HappyBirthday extends Command[/size]
[size=16]{[/size]
[size=16]    /**[/size]
[size=16]     * The name and signature of the console command.[/size]
[size=16]     *[/size]
[size=16]     * @var string[/size]
[size=16]     */[/size]
[size=16]    protected $signature = 'sms:birthday';[/size]
[size=16]
[/size]
[size=16]    /**[/size]
[size=16]     * The console command description.[/size]
[size=16]     *[/size]
[size=16]     * @var string[/size]
[size=16]     */[/size]
[size=16]    protected $description = 'Command description.';[/size]
[size=16]
[/size]
[size=16]    /**[/size]
[size=16]     * Create a new command instance.[/size]
[size=16]     *[/size]
[size=16]     * @return void[/size]
[size=16]     */[/size]
[size=16]    public function __construct()[/size]
[size=16]    {[/size]
[size=16]        parent::__construct();[/size]
[size=16]    }[/size]
[size=16]
[/size]
[size=16]    /**[/size]
[size=16]     * Execute the console command.[/size]
[size=16]     *[/size]
[size=16]     * @return mixed[/size]
[size=16]     */[/size]
[size=16]    public function handle()[/size]
[size=16]    {[/size]
[size=16]        //[/size]
[size=16]    }[/size]
[size=16]}


Đối với $ mô tả, chúng ta có thể đặt một mô tả đơn giản về những gì lệnh nào khi thực thi.


bảo vệ $ Mô tả = 'Gửi một thông điệp sinh nhật hạnh phúc cho người dùng thông qua tin nhắn SMS;
Trong Laravel 5.1, bất cứ khi nào một lệnh được thực hiện trong các thiết bị đầu cuối, việc xử lý phương thức của lớp là lệnh. Đó là nơi mà chúng ta cần phải đặt logic của chúng tôi.


Trong trường hợp của chúng tôi, để gửi một thông điệp sinh nhật cho người dùng vào ngày sinh nhật của họ, chúng ta có thể thay đổi phương pháp xử lý như vậy:


Code:

[size=16]<?php[/size]
[size=16]// ...[/size]
[size=16]public function handle()[/size]
[size=16]{[/size]
[size=16]  User::whereBirthDate(date('m/d'))->get();[/size]
[size=16]
[/size]
[size=16]  foreach( $users as $user ) {[/size]
[size=16]    if($user->has('cellphone')) {[/size]
[size=16]    SMS::to($user->cellphone)[/size]
[size=16]       ->msg('Dear ' . $user->fname . ', I wish you a happy birthday!')[/size]
[size=16]       ->send();[/size]
[size=16]    } [/size]
[size=16]} [/size]
[size=16]
[/size]
[size=16]$this->info('The happy birthday messages were sent successfully!');[/size]
[size=16]
[/size]
[size=16]}


Khi lệnh được hoàn thành, chúng tôi cần phải đăng ký với Artisan, vì vậy mà nó sẽ có sẵn trong các thiết bị đầu cuối. Để làm được điều này, chúng ta chỉ cần thêm tên lớp của lệnh đến các mảng lệnh của lớp hạt nhân, mà nằm ở app/Console/Kernel.php:


Code:

[size=16]<?php[/size]
[size=16]class Kernel extends ConsoleKernel[/size]
[size=16]{[/size]
[size=16]    /**[/size]
[size=16]     * The Artisan commands provided by your application.[/size]
[size=16]     *[/size]
[size=16]     * @var array[/size]
[size=16]     */[/size]
[size=16]    protected $commands = [[/size]
[size=16]        // ...[/size]
[size=16]        'App\Console\Command\HappyBirthday'[/size]
[size=16]    ];[/size]
[size=16]
[/size]
[size=16]    // ...
   
Nếu chúng ta chạy danh sách nghệ nhân php trong thiết bị đầu cuối, chúng ta sẽ thấy mô tả các lệnh của chúng tôi:
Code:

[size=16]$ php artisan list[/size]
[size=16]
[/size]
[size=16]...[/size]
[size=16]sms[/size]
[size=16]  sms:birthday        Sends a Happy birthday to users via SMS[/size]
[size=16]...


It’s a good habit to namespace the command names. This will help us categorize them based on their usage.


As a result, whenever we run the command in the terminal, a happy birthday message would be sent to the matched group of users:
Code:

[size=16]$ php artisan sms:birthday


Các thông điệp sinh nhật hạnh phúc đã được gửi thành công!
Đây chỉ là một trường hợp sử dụng giả thuyết. Đối với một ví dụ cụ thể hơn, xem bài của Younes Rafie về một lệnh giảm tính chất.


Lập kế hoạch Commands


Ở đây có phần vui vẻ. Hãy sắp xếp một nhiệm vụ để chạy lệnh, chúng ta chỉ cần xây dựng. Để làm được điều này, chúng ta sẽ sử dụng một tính năng mà bạn chắc chắn sẽ đến với tình yêu: Laravel Task Scheduler.


Các nhiệm vụ được định nghĩa bên trong phương pháp lịch trình của lớp hạt nhân. Chúng ta có thể thêm bao nhiêu lệnh Artisan như chúng ta cần bằng cách sử dụng phương pháp lệnh.


Nhiệm vụ của chúng tôi, theo cách sử dụng của nó, là nghĩa vụ phải được chạy một lần một ngày. Vì vậy, chúng ta có thể sử dụng phương pháp  daily()  như vậy:


Code:

[size=16]<?php[/size]
[size=16]
[/size]
[size=16]// ...[/size]
[size=16]
[/size]
[size=16]protected function schedule(Schedule $schedule)[/size]
[size=16]{ [/size]
[size=16]        $schedule->command('sms:birthday')->daily();[/size]
[size=16]}
>> Tham khảo khóa học lập trình php cơ bản tại hà nội !


Chúng tôi có thể sắp xếp tất cả các lệnh ngay từ phương pháp lịch. Theo các tiểu bang tài liệu, có một loạt các tần số lịch trình chúng ta có thể gán cho các nhiệm vụ. Chúng tôi sẽ liệt kê một vài trong số họ ở đây, nhưng bạn có thể muốn đọc tài liệu để xem danh sách đầy đủ và quyết định phù hợp nhất với hoàn cảnh của bạn.


Để chạy một nhiệm vụ mỗi giờ mỗi ngày:
Code:

[size=16]<?php[/size]
[size=16]$schedule->command('myTask')[/size]
[size=16]         ->hourly();
        
To run a task every day at midnight:
Code:

[size=16]<?php[/size]
[size=16]$schedule->command('myTask')[/size]
[size=16]         ->daily();
        
To run a task every day at 9:30:
Code:

[size=16]<?php[/size]
[size=16]$schedule->command('myTask')[/size]
[size=16]         ->dailyAt('09:30');
        
To run a task every week:
Code:

[size=16]<?php[/size]
[size=16]$schedule->command('myTask')[/size]
[size=16]         ->weekly();
To run it every month:
Code:

[size=16]<?php[/size]
[size=16]$schedule->command('myTask')[/size]
[size=16]         ->monthly();
        
We can also use a custom cron schedule, like an ordinary cron job expression:
Code:

[size=16]$schedule->command('myTask')[/size]
[size=16]         ->cron('* * * * *');
        
Các nhiệm vụ trên would be running per minute.


Để xem danh sách đầy đủ options, xin vui lòng tham khảo the documentation, phần Schedule Tần Options.


Laravel that provide a file its ràng buộc hạn, điều which can be combined with phương pháp trên. For example, we can be sắp xếp công việc must be running hàng tuần, but the limit in one ngày nhất định and time.
Code:

[size=16]<?php[/size]
[size=16]$schedule->command('theTask')[/size]
[size=16]         ->weekly()[/size]
[size=16]         ->mondays()[/size]
[size=16]         ->at(12:30);[/size]
[size=16]or[/size]
[size=16]
[/size]
[size=16]<?php[/size]
[size=16]$schedule->command('theTask')[/size]
[size=16]         ->weekly()[/size]
[size=16]         ->sundays()
        
Chúng ta có thể đi xa hơn và hạn chế việc thực hiện các nhiệm vụ cho một điều kiện nào đó, bằng cách sử dụng khi phương pháp mà chấp nhận một đóng cửa. Nhiệm vụ sẽ được thực hiện chỉ khi việc đóng cửa trả về true.


Code:

[size=16]<?php[/size]
[size=16]$schedule->command('table:clean')[/size]
[size=16]          ->daily()[/size]
[size=16]          ->when(function() {[/size]
[size=16]             return SMS::isWorkingFine();[/size]
[size=16]          });
        
Starting the Laravel Scheduler


To start the scheduler itself, we only need to add one cron job on the server (using the crontab -e command), which executes php /path/to/artisan schedule:run every minute in the day:


Code:

[size=16]* * * * * php /path/to/artisan schedule:run 1>>/dev/null 2>&1


Xin lưu ý rằng chúng ta cần phải cung cấp đường dẫn đầy đủ đến các lệnh Artisan lắp đặt Laravel của chúng tôi.
Để loại bỏ các đầu ra cron chúng tôi đặt / dev / null 2> & 1 ở cuối biểu thức công việc định kỳ.
Để đọc thêm về các Scheduler, xem trong phần Lập kế hoạch trong các tài liệu hướng dẫn.


Lời kết


Trong hướng dẫn này, chúng tôi đã sử dụng của Laravel Artisan lệnh để tạo ra các lệnh terminal. Thay vì thêm nhiều mục công việc cron trên máy chủ mỗi công việc, chúng ta chỉ tạo một lệnh được thực thi mỗi phút và đại biểu trách nhiệm công việc lên lịch Laravel của.


>>Xem thêm Khóa học photoshop cơ bản tại hà nội !
nuong
nuong
Cấp 1
Cấp 1

Bài gửi : 23
Điểm : 3352
Like : 0
Tham gia : 02/12/2015

Về Đầu Trang Go down

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang

- Similar topics

Permissions in this forum:
Bạn không có quyền trả lời bài viết