زمانبندی کرونجاب با تقویم شمسی درShamsic
Shamsic یک کتابخانهی متنباز در زبان PHP است که به منظور استفاده از کرون درون پروژه شخصی طراحی شده است. این ابزار سبک و سریع، برای توسعهدهندگانی که نیاز به پشتیبانی از تقویم جلالی برای استفاده از CronJOB دارند، بسیار کاربردی است.
شاید برای شما هم پیش آمده باشد که بخواهید از Cron Job در پروژهتان استفاده کنید، اما متوجه شدهاید که نمیتوانید تاریخهای دقیقی را که در تقویم شمسی وجود دارند، مدیریت کنید.
برای مثال، کرون جاب این امکان را به شما میدهد که اسکریپت خود را در روزهای خاصی از هفته یا ماه اجرا کنید؛ اما چون کرون فقط از تقویم میلادی (Gregorian) پشتیبانی میکند، استفاده از آن برای کاربران ایرانی که از تقویم شمسی استفاده میکنند، یا غیرممکن است یا با دقت پایین انجام میشود.
این پکیج به شما کمک میکند تا این مشکل را مستقیماً در کدهای PHP خود حل کنید.
این پکیج از PHP 8.1+
پشتیبانی میکند.
نصب
برای نصب پکیج از Composer استفاده کنید:
composer require ghaninia/shamsic
نحوه استفاده
ابتدا باید یک CronJob
روی سرور تنظیم کنید. دستور زیر باعث میشود که فایل شما هر دقیقه به صورت خودکار اجرا شود:
* * * * * php output.php
علامت *
به معنی «هر زمان» است. اگر با مفاهیم کرون جاب آشنایی ندارید، میتوانید از لینک زیر استفاده کنید:
https://crontab.guru
ساختار کلی کرون جاب به صورت زیر است:
.---------------- دقیقه (0 - 59)
| .------------- ساعت (0 - 23)
| | .---------- روز ماه (1 - 31)
| | | .------- ماه (1 - 12)
| | | | .---- روز هفته (0 - 6)
| | | | |
* * * * * فرمانی که باید اجرا شود
سه بخش آخر این ساختار یعنی روز ماه، ماه، و روز هفته مربوط به زمانبندی هستند که در تقویم شمسی قابل تنظیم نیستند؛ این همان مشکلی است که Shamsic آن را حل میکند.
اکنون فایل output.php
را باز کرده و از کد زیر استفاده کنید:
use GhaniniaIR\Shamsic\Schedule;
### اجرای تسک در هر دقیقه از روز شنبه در فروردین:
(new Schedule)
->call(function(){
echo "test";
})
->cron("* * * 1 2");
### اجرای تسک در هر دقیقه از شنبه تا پنجشنبه در ماه خرداد:
(new Schedule)
->call(function(){
echo "test";
})
->cron("* * * 3 1-5");
...
### پس از تعریف همه زمانبندیها، آنها را اجرا کنید:
Schedule::run();
اعتبارسنجی عبارات کرون
اگر میخواهید بررسی کنید که عبارت زمانبندی شما معتبر است یا نه:
(new ExecuteExpression("* * * * *"))->isValid();