Với Laravel bạn muốn khởi tạo 1 crontab hay schedule để sau 1 khoảng thời gian và đều dặn nó sẽ đi kiểm tra database hay làm việc gì đó thì bạn sẽ làm như thế nào
Vậy chúng ta cùng nghiên cứu schedule trong laravel.
1) Create a command via “php artisan”
ở đây bạn sẽ cần code ra 1 command ví dụ như:php artisan kang:return-stable-scale-object-k8s
=> Mục đích là command này sẽ query vào service và kiểm tra nếu cấu hình đó hết hạn thì nó thực hiện restore lại config mặc định.
Đầu tiền bạn run command để tạo class:
php artisan make:command ReturnStableScaleObjectK8s
Lúc này nó sẽ tạo ra file trong commands.
Lúc này bạn có thể thay đổi command theo ý thích.
Sau đó bạn code các logic trong funtion handle()
Tiếp đến bạn có thể chạy thử command:
Nếu command đã chạy thành công thì bạn cần setup nó vào schedule
Tiếp theo bạn vào console.php trong folder routes
<?php use Illuminate\Foundation\Inspiring; use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Schedule; Artisan::command('inspire', function () { $this->comment(Inspiring::quote()); })->purpose('Display an inspiring quote')->hourly(); Schedule::command('kang:return-stable-scale-object-k8s')->everyMinute();
Để run được schedule này bạn sẽ cần run command này để kiểm tra command đã được define trong schedule hay chưa?
php artisan schedule:run
Giờ ta phải dùng crontab để run command php artisan schedule:run
# my_laravel_docker_crontab # m h dom mon dow command # use the bin/bash as the default environment * * * * * cd /var/www/html/ && php artisan schedule:run >> /tmp/cron-log.txt # If your docker doesn't use the bin/bash as the default environment * * * * * /bin/bash -l -c 'cd /var/www/html && php artisan schedule:run >> /tmp/cron-log.txt'
2) Run the laravel schedule in docker.
Mục tiêu chúng của chúng ta là phải run được schedule laravel trên Docker.
Chúng ta có Dockerfile:
# Refer to https://github.com/codityco/003-how-to-dockerise-a-laravel-project/blob/main/Dockerfile ### https://www.youtube.com/watch?v=uYhowDSkwyk FROM php:8.3.12-apache # Install dependencies RUN apt-get update && \ apt-get install -y \ libzip-dev \ zip \ cron # Enable mod_rewrite RUN a2enmod rewrite # Install PHP extensions RUN docker-php-ext-install pdo_mysql zip ENV APACHE_DOCUMENT_ROOT=/var/www/html RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf # Copy the application code COPY . /var/www/html RUN chmod +x ./start.sh # Set the working directory WORKDIR /var/www/html # Install composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # Install project dependencies RUN composer install # Create Folder and File for SQLite RUN mkdir -p /var/www/html/database/sqlite-data && \ chown -R www-data:www-data /var/www/html/database/sqlite-data # # Create a .env file from .env.example # RUN if [ -f ".env.example" ]; then \ # cp .env.example .env; \ # else \ # echo "No .env.example file found"; \ # fi # # Generate application key # RUN php artisan key:generate --ansi # Add docker custom crontab ADD config/laravel_docker_crontab /etc/cron.d/my_laravel_docker_crontab # Ensure newline at end of crontab file # fix - new crontab file is missing newline before EOF, can't install. RUN echo "" >> /etc/cron.d/my_laravel_docker_crontab # Update the crontab file permission RUN chmod 0644 /etc/cron.d/my_laravel_docker_crontab # Specify crontab file for running RUN crontab /etc/cron.d/my_laravel_docker_crontab # Execute both Apache and cron CMD ["./start.sh"]
các bạn sẽ thấy file start.sh
#!/bin/bash service cron start # Ensure the storage and cache directories have the correct permissions chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache # Define the files to check FILES=( "/var/www/html/database/sqlite-data/database.sqlite" "/var/www/html/storage/logs/laravel.log" ) # Define the user and group variables USER="www-data" GROUP="www-data" # Loop through each file in the FILES array for FILE in "${FILES[@]}"; do # Check if the file exists if [ ! -f "$FILE" ]; then echo "File does not exist at $FILE. Creating file..." touch "$FILE" # Change ownership of the directory where the file is located chown -R "$USER":"$GROUP" "$(dirname "$FILE")" echo "File created at $FILE and ownership set to $USER:$GROUP" else echo "File already exists at $FILE" fi done apache2-foreground
Tiếp đến là bạn define cấu hình crontab:
# my_laravel_docker_crontab # m h dom mon dow command # use the bin/bash as the default environment * * * * * cd /var/www/html/ && php artisan schedule:run >> /tmp/cron-log.txt # If your docker doesn't use the bin/bash as the default environment * * * * * /bin/bash -l -c 'cd /var/www/html && php artisan schedule:run >> /tmp/cron-log.txt'