مكتبة PHP لإدارة وظائف GNU/Linux CRON برمجيا.
يمكّنك من:
crontab (يجب تثبيتها بالفعل في التوزيع الخاص بك).sudo ، إذا كنت ترغب في إدارة crontab مستخدم آخر من مستخدم وقت التشغيل دون مواجهة المشكلات الصحيحة (انظر أدناه) يمكن تثبيت المكتبة باستخدام الملحن.
composer require tiben/crontab-manager ~1.0
تتكون المكتبة من ثلاثة فصول:
CrontabJob هو فئة كيان تمثل وظيفة cron.CrontabRepository لاستمرار/استرداد وظائف CRON الخاصة بك.CrontabAdapter يتعامل مع وظائف cron استمرار في crontab.من أجل العمل ، يحتاج Crontabrepository إلى مثيل Crontabadapter.
$crontabRepository = new CrontabRepository(new CrontabAdapter());
لنفترض أنك تريد إنشاء وظيفة جديدة تتكون من إطلاق الأمر "df >> /tmp/df.log" كل يوم في الساعة 23:30. يمكنك القيام بذلك بطريقتين.
في طريق OO النقي:
$crontabJob = new CrontabJob();
$crontabJob
->setMinutes(30)
->setHours(23)
->setDayOfMonth('*')
->setMonths('*')
->setDayOfWeek('*')
->setTaskCommandLine('df >> /tmp/df.log')
->setComments('Logging disk usage'); // Comments are persisted in the crontab
من سلسلة بناء جملة CRON الخام باستخدام طريقة المصنع:
$crontabJob = CrontabJob::createFromCrontabLine('30 23 * * * df >> /tmp/df.log');
يمكنك الآن إضافة cronjob الجديد الخاص بك في مستودع Crontab واستمر كل التغييرات على crontab.
$crontabRepository->addJob($crontabJob);
$crontabRepository->persist();
لنفترض أننا نريد تعديل ساعة cronjob الموجودة بالفعل. يتم العثور على وظائف الوجود باستخدام بعض التعبيرات العادية. يتم تطبيق regex على خط Crontab بأكمله.
$results = $crontabRepository->findJobByRegex('/Logging disk usage/');
$crontabJob = $results[0];
$crontabJob->setHours(21);
$crontabRepository->persist();
يمكنك إزالة وظيفة مثل هذا:
$results = $crontabRepository->findJobByRegex('/Logging disk usage/');
$crontabJob = $results[0];
$crontabRepository->removeJob($crontabJob);
$crontabRepository->persist();
ملاحظة: نظرًا لأن وظائف CRON تتطابق داخليًا بالرجوع إليها ، فيجب الحصول عليها مسبقًا من المستودع أو تمت إضافتها مسبقًا.
تتيح لك هذه الميزة إدارة crontab لمستخدم آخر من المستخدم الذي أطلق وقت التشغيل. يمكن أن يكون هذا مفيدًا عندما يكون مستخدم وقت التشغيل www-data ولكن صاحب crontab الذي تريد تحريره هو حساب مستخدم Linux الخاص بك.
للقيام بذلك ، ببساطة تمرير اسم المستخدم لمالك Crontab كمعلمة لمؤسسة Crontabadapter. لنفترض أنك www-data وتريد تحرير crontab من المستخدم bobby :
$crontabAdapter = new CrontabAdapter('bobby');
$crontabRepository = new CrontabRepository($crontabAdapter);
باستخدام بهذه الطريقة ، ستقوم بتوزيع مشكلات حقوق المستخدم. يمكن التعامل مع هذا عن طريق تحرير ملف sudoers الخاص بك باستخدام "Visudo".
إذا كنت ترغب في السماح للمستخدم www-data بتحرير crontab من المستخدم bobby ، أضف هذا السطر:
www-data ALL=(bobby) NOPASSWD: /usr/bin/crontab
الذي يخبر Sudo بعدم طلب كلمة المرور عند استدعاء المستخدم www-data crontab كمستخدم bobby باستخدام sudo
الآن ، يمكنك الوصول إلى crontab من المستخدم bobby مثل هذا:
$crontabAdapter = new CrontabAdapter('bobby', true);
$crontabRepository = new CrontabRepository($crontabAdapter);
لاحظ المعلمة الثانية true لدعوة مُنشئ Crontabadapter. يخبر هذا المنطق Crontabadapter باستخدام sudo داخليًا عند الاتصال crontab .
يمكنك تمكين أو تعطيل وظائف CRON باستخدام طريقة setEnabled() لكائن cronjob وفقًا لذلك:
$crontabJob->setEnabled(false);
سيؤدي هذا إلى إعداد وظيفتك cron مع # في crontab عند استمرارها.
بالإضافة إلى ذلك ، إذا لم تتمكن من قراءة crontabs لمستخدم آخر أو إذا كنت على بنية موزعة حيث لا يتم تشغيل crons على الجهاز الذي ينفذ الوظائف ، فيمكنك إنشاء أي محول آخر للهندسة المعمارية عن طريق تنفيذ CrontabAdapterInterface .
يمكنك بعد ذلك إنشاء مثيل لل CrontabRepository مع محولك.
تمت كتابة الاختبارات باستخدام phpunit وتتطلب الإصدار 5.3+. لتنفيذ الاختبارات:
$ phpunit <crontab-library-path>/tests
إذا قمت بتثبيت المكتبة باستخدام الملحن وتثبيت الاعتماد على deved ، فيمكنك تنفيذها باستخدام phpunit المضمّن كاعتماد:
$ ./vendor/bin/phpunit <crontab-library-path>/tests
... مرحب بهم :)