50درصد تخفیف سورس فروشگاهی دیجی کالا + اپلیکیشن اندروید تا پایان این هفته - کد تخفیف : off50
با تخفیف میخرم

آموزش Cron Job در PHP

  • آپدیت شده در تاریخ

آموزش Cron Job در PHP

قبل از شروع آموزش Cron Job در PHP نیاز است مفاهیمی را یاد بگیریم

کرون جاب یا Cron Jobs قابلیتی در سیستم های لینوکسی می باشد که وظیفه ی اجرای عملیاتی خاص در زمانبندی خاصی را به صورت کاملا اوتوماتیک بر عهده دارد. با استفاده از کرون جاب به صورت کلی می توانید کار های روتین و تکراری را به سادگی و بدون دخالت کاملا اوتوماتیک زمانبندی و اجرا نمایید .

این عملیات می تواند بعنوان مثال برای اجرای زمانبندی شده ی یک فایل PHP به منظور ارسال ایمیل به کاربران که به صورت اتوماتیک در زمان مشخص شده مثلا هر روز ساعت ۹ صبح باشد و یا گرفتن بکاپ از پایگاه داده, عملیات پاکسازی, تهیه گزارش آنالیز هفتگی, دریافت فید RSS و …

کارهایی که باید با زمانبندی انجام شوند در فایلی با نام CronTab ذخیره می شوند. CronTab یک فایل متنی است که در هر سطر آن یک دستور با فرمتی که برای Cron قابل فهم است قرار می گیرد. به هر کدام از دستورات این فایل اصطلاحا Cron Job گفته می شود.

یک کرون جاب همیشه شامل ۵ ستون است که هر کدام از آنها نشان دهنده زمان است که نهایتا به یک مسیر یا دستور برای اجرا ختم می شود.

هر کدام از ستون ها به ترتیب نشان دهنده :

  • Minutes : دقیقه [۰-۵۹]
  • Hours : ساعت [۰-۲۳]
  • Days : روز [۱-۳۱]
  • Months : ماه [۱-۱۲]
  • Days of the Week : روزهای هفته [۰-۶]

برای مثال, اگر می خواهید زمان بندی را برای ۱۲قبل از ظهر اولین روز هر ماه قرار بدید, چیزی مثل دستور زیر را خواهید داشت:

اگر قصد دارید که زمان بندی را برای هر شنبه در ۸:۳۰ قرار بدید :

همچنین اوپراتون های دیگه وجود دارد که میتونید در زمان بندی استفاده کنید

  • کاما (,) برای ساخت لیستی از مقادیر از هر ستون کرون
  • خط تیره () برای مشخص کردن محدوده مقادیر
  • ستاره ها (*) برای مشخص کردن مقدار همه

cronTab به صورت پیش فرض یک ایمیل اطلاع رسانی را برای تسک اجرا شده ارسال می کند در بعضی شرایط به ارسال این ایمیل نیاز نداریم برای همین می توانیم خروجی را به دیوایس /dev/null انتقال بدیم. این انتقال خروجی با اوپراتور > انجام میشود .

اگر قصد دارید که ارور ها رو هم به دیوایس نال انتقال بدید میتونید از این دستور نیز بهره ببرید.

 

طرح کلی آموزش Cron Job در PHP

برای مدیریت cronTab در PHP , نیاز است که قابلیت اجرای دستور شل را روی سرور به منظور ویرایش فایل cronTab را داشته باشیم. در تعداد کمی از سرور های اشتراکی معمولا این قابلیت در دسترس است و در سرورهای مجازی و اختصاصی می توانید از این قابلیت به سادگی بهره ببرید.

در PHP برای اتصال به SSH2 میتوانیم از کتابخانه SSH2 استفاده کنیم. برای نصب کتابخانه ssh2 می توانید از این لینک استفاده کنید

برای شروع کار یک کلاس برای آموزش Cron Job در PHP نوشتیم که در زیر به تشریح ساختار آن می پردازیم.

در ابندا چهار property زیر را تعریف کردیم

  • $connection : کانکشن دیتابیس ما / ریسورس خروجی اتصال
  • $path : مسیر فایل
  • $handle : نام فایل کرون موقت ما
  • $cron_file : مسیر کامل فایل و نام فایل کرون

کلاس ما باید قابلیت اتصال و احراز هویت به منظور اجرای دستورات و داشتن دسترسی به cronTab کاربر را داشته باشد. بنابراین ما یک کانکشن SSH2 را داخل constructor برقرار و احراز هویت می کنیم.

برای اجرای دستورات نیاز است که از متد exec() استفاده کنیم.

سپس, نیاز به این خواهیم داشت که بتوانیم در فایل cronTab رایت کنیم. همچنین به راهی نیاز داریم که بتوانیم بعد از اتمام کار این فایل را حذف کنیم. برای اینکار متد write_to_file() و remove_file() را تعریف می کنیم.

البته, به راهی نیاز داریم که بتوانیم cron job ها را بسازیم و پاک کنیم. برای همین به ترتیب متدهای append_cronjob() و remove_cornjob() را ایجاد می کنیم.

برای اینکه بتوانیم کل cronTab ها را حذف کنیم نیاز است از متد remove_crontab() برای مدیریت این عملیات بهره ببریم.

در آخر, نیاز به دو متد کمکی (helper method) داریم. اولین متد, که مقدار بولین (boolean) را برگشت می دهد, بطور ساده وجود فایل موقت cron را بررسی می کند, متد بعدی, برای نمایش ارور های پیش امده استفاده می شود. نام متدهای به ترتیب crontab_file_exists() و error_message() خواهد بود.

 

کلاس کلی برای کار ما در ادامه آموزش Cron Job در PHP بصورت زیر است:

برای دانلود کامل این کلاس به همراه متدها به باکس دانلود زیر این پست مراجعه کنید

اجرای کلاس آموزش Cron Job در PHP

برای شروع در ابتدا, یک شی نمونه از کلاس خود را می سازیم. که نیاز است در ابتدا آدرس IP , پورت , نام کاربری و پسورد را به کلاس سازنده (constructor) پاس بدیم

اضافه کردن یک cron job :

با داشتن کانکشن احراز هویت شده می توانیم یک کرون جاب جدید را بسازیم.

اضافه کردن آرایه ای از cron job ها :

افزودن تعدادی از cron job ها به سادگی اضافه کردن یک cron job است. به راحتی آرایه از کرون جاب را به متد apeend_cronjob() می دیم.

حذف یک cron job :

در اینجا از عبارت های با قاعده (Regular Expression) برای پیدا کردن یک کرون جاب یکتا و حذف آن استفاده می کنید . مطیمنا بسته به کرون جابی که می خواین مثلا بر اساس ماه پیدا و حذف کنید عبارت regex شما متفاوت خواهد بود.

حذف آرایه ای از cron job ها :

همانند حذف یک cron job اینجا هم از regex استفاده می کنیم که هر کدام از آن را در خانه ای از آرایه قرار میدیم و در نهایت متد remove_cronjob را اجرا می کنیم.

 

جمع بندی

همانطور که دیدید چقدر کار با Cron Job در PHP آسان و لذت بخش است . بخصوص که کلاس خودمان را نوشتیم و بدون استفاده از کلاس دیگه ای از متد های ساخته شده خودمان عملیات مختلف را کنترل کردیم .

مطمینا متوجه شدید که task scheduling چقدر میتونه در مدیریت اسکریپت ها در اپلیکیشن های تحت وب مفید و کارامد باشد و با استفاده از کرون جاب به صورت کلی می توانید کار های روتین و تکراری را به سادگی و بدون دخالت کاملا اوتوماتیک زمانبندی و اجرا نمایید .

 

امیدوارم از آموزش Cron Job در PHP نهایت استفاده را برده باشید .

برای دانلود سورس کد کامل کلاس و متدهای استفاده در این آموزش از باکس دانلود استفاده کنید.

هر سوالی داشتید ، از قسمت نظرات ارسال کنید . سریعا ، پاسخگوی سوالات شما هستیم .

موفق و پیروز باشید.

حسن شفیعی علاقه خاصی به برنامه نویسی وب و موبایل دارم و هر روز تلاش می کنم به این حوزه مسلط تر شوم و اطلاعاتم را به شکل کاربردی برای علاقه مندان در وب به اشتراک بگذارم

آموزش های رایگان بیشتر در اینستاگرام ما ...

NETPARADIS /
مطالب زیر را حتما بخوانید
دیدگاه کاربران (۲۲)

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

  1. nargesizm ۴ شهریور ۱۳۹۹

    سلام
    من یک فایل php دارم که میخوام در هر روز یک ایمیل به کاربران ارسال بشه و با استفاده از Cron Jobs تنظیمات رو انجام دادم اما پس از اجرا Permission denied به ایمیلم ارسال میشه.
    آیا در فایل php باید کامندهای لینوکس نوشته بشه ؟
    آیا فایلی که تنها کدهای php نوشته شده قابل استفاده نیست؟

    ممنونم از راهنماییتون

    پاسخ
    1. حسن شفیعی ۴ شهریور ۱۳۹۹

      سلام.
      بعد اینکه فایل php شامل کدهای ارسال ایمیل هست را نوشتید کافیه که اون رو داخل کرون جاب هاست تنظیم کنید و نیاز نیست برای کرون جاب کدجداگانه ای بنویسید.

      آموزش ایجاد کرون جاب در کنترل پنل Cpanel
      https://my.mihanwebhost.com/knowledgebase.php?action=displayarticle&id=210

      آموزش کرون جاب (Cron Jobs) در دایرکت ادمین
      https://my.mihanwebhost.com/knowledgebase.php?action=displayarticle&id=161

      پاسخ
      1. nargesizm ۴ شهریور ۱۳۹۹

        سپاس
        دلیل Permission denied بودن رو میشه لطفا بفرمائید؟
        و چطور میشه پرمیشن فایل را روی ۷۵۵ قرار بدم؟
        ممنون از راهنماییتون

        پاسخ
      2. حسن شفیعی ۴ شهریور ۱۳۹۹

        از چه دستوری استفاده می کنید ؟
        دستور شما باید بصورت زیر باشه :
        php /home/USER/public_html/run.php
        اگر بازم این خطا را دارید حتما به هاستینگ تیکت بزنید راهنمایی می کنند.

        پاسخ
      3. nargesizm ۴ شهریور ۱۳۹۹

        سلام مجدد و تشکر
        مورد Permission رفع شد اما این خطا را دریافت میکنم:
        line 1: syntax error near unexpected token `(‘
        فایل یکبار به صورت تست run شده و بدون خطا اجرا شده اما هنگام اجرا توسط cron jobs این خطا گرفته میشه
        ممنون میشیم راهنمایی بفرمائید.

        پاسخ
      4. حسن شفیعی ۴ شهریور ۱۳۹۹

        سلام. در بعضی هاستینگ ها دستور اجرای کرون جاب ممکن هست فرق داشته باشه که به هاستینگ تیکت بزنید و بپرسید

        پاسخ
  2. علی ۲۴ خرداد ۱۳۹۹

    باز کردن دسترسی به شل (اینکه بشه دستورات شل اجرا کرد) مشکل امنیتی ایجاد نمیکنه؟ این مشکل رو چجوری برطرف میکنید؟

    پاسخ
    1. حسن شفیعی ۲۴ خرداد ۱۳۹۹

      سلام. روی سرورهای مجازی مشکلی از این نظر پیش نمیاد.

      پاسخ
  3. محمد ۱۱ خرداد ۱۳۹۹

    با عرض سلام ببخشید یک لینک دانلود دارم میخوام وقتی پرداخت انجام شد این لینک فعال شود چطوری داخل دیتابس باید شرط بزارم . و چطوری میتونم واسه لینکم زمانبندی بزارم ؟

    پاسخ
    1. حسن شفیعی ۱۱ خرداد ۱۳۹۹

      سلام. این آموزش رو دنبال کنید :
      https://netparadis.com/generate-onetime-download-link-php

      پاسخ
  4. میثم ۴ اردیبهشت ۱۳۹۹

    سلام وقتتون بخیر
    من تو ربات تلگرام یه حلقه while دارم که پیام میفرستم باهاش به مخاطبام.الانکه مخاطبا زیاد شدن این حلقه میره رو تکرار یه جورایی بیرون نمیاد ازش .چجوری میتونم کرون جاب ست کنم که مثلا ۱۰۰ تا ۱۰۰ تا پیام بفرسته یا با فاصله ی زمانی مشخص بفرسته فشار رو هاست نیاد و قاطی نکنه

    پاسخ
    1. حسن شفیعی ۵ اردیبهشت ۱۳۹۹

      سلام. ممنون. یکه کانتر بزارید مثلا $count = 0 و داخل حلقه چک کنید به عدد موردنظر مثلا ۱۰۰ رسید از حلقه بیرون بشه.
      موفق باشید.

      پاسخ
  5. امیرحسین فضلی ۱۶ فروردین ۱۳۹۹

    سلام و خسته نباشید. من ربات تلگرام مینویسم. میخوام یک فایل installer بسازم که دیگه نیازی نباشه که عملیات نصب سورس به صورت دستی انجام بشه. فایل installer من باید به دیتابیس وصل بشه و یکسری جداولی رو ایجاد کنه. بعد یک کرون جاب ست کنه و در آخر هم ست وب هوک کنه. شما که cron tab گفتین من یکم قاطی کردم. و همچنین اون کانکشن و اینا رو هم که گفتین بیشتر قاطی کردم. خب کانکشن برای چی لازمه؟ راه بهتری برای من نیست؟

    پاسخ
    1. حسن شفیعی ۱۷ فروردین ۱۳۹۹

      سلام. ممنون.
      کانکشن برای اتصال به دیتابیس است. شما دفیقا همین موردی که گفتید را به راحتی میتونید در installer خودتون بنویسید و کاملا هم کار خواهد کرد.

      پاسخ
  6. دلارام ۲۴ دی ۱۳۹۸

    سلام جناب شفیعی
    من با php کار میکنم. میخوام یکسری مطالب از پایگاه داده به کانال تلگرام ارسال کنم که هر مطلب در زمان به خصوصی هست اما این اموزش یکم منو گیج کرده
    میشه یکم واضح تر راهنماییم کنین

    پاسخ
    1. حسن شفیعی ۲۴ دی ۱۳۹۸

      سلام. باید با بات نویسی آشنا باشید تا بتونید اینکار رو انجام بدید.
      کافیه فایل php مورد نظر رو تهیه کنید بعد با قابلیت کرون جاب خود پنل هاست بدون کدنویسی خاصی, عملیات دلخواهتون رو انجام بدید.
      موفق باشید.

      پاسخ
  7. حامد ۹ آبان ۱۳۹۸

    با سلام و خسته نباشید من هاست ویندوزی دارم و میخوام هر روز صبح از دیتابیس چک کنه و به کسایی که تولدشون هست sms تبریک بده ولی الان مشکلم اجرای خودکار برنامه هست، سؤال داشتم یکی اینکه کرون جاب روی هاست ویندوز کار می کنه یا نه و اینکه اگر نه برنامه جایگزین چه هست
    سپاسگزارم

    پاسخ
    1. حسن شفیعی ۹ آبان ۱۳۹۸

      سلام. ممنون.
      خب شما کل این عملیات رو که میخواید باید داخل یک فایل php کد بزنید که متصل به دیتابیس بشه و sms ارسال کنه و بعد آدرس این فایل رو داخل کرون جاب ب بازه زمانی دلخواه تعریف کنید تا در ساعات مشخص این فایل اجرا شود.
      در سرور ویندوزی هم باید همچنین دستوری روی
      C:\path\to\php\php.exe C:\path\to\cron.php
      را داخل برنامه schedule task ویندوز تعریف کنید تا با cmd اجرا شود.
      موفق باشید.

      پاسخ
    2. Saeeded ۱۰ آبان ۱۳۹۸

      ضمن تشکر از آقای شفیعی عزیز…
      من هم دقیقا مشکل آقای حامد رو دارم که در صفحه مربوط به Post – Get آقای شفیعی فرمودن که با استفاده از cronjob نمیشه متد های http رو استفاده کرد.
      مشکل اساسی اینه که وبسرویس پیامک ارائه شده توسط شرکت ها بیشتر متد های get , post رو قبول میکنن.
      میشه راهنمایی بفرمایید که شرکت ها برای ارسال پیامک برای مناسب های خاص بصورت اتوماتیک از چه روشی استفاده میکنن ؟؟

      پاسخ
      1. حسن شفیعی ۱۵ آبان ۱۳۹۸

        سلام. در این صورت باید یک سرور مجازی با دسترسی به شل داشته باشید تا بتونید مستقیما دستورات ترمینال یا همان بش را از طریق اسکریپت php اجرا کنید.
        موفق باشید.

        پاسخ
  8. سامان ۲۰ آذر ۱۳۹۷

    سلام . خسته نباشید . من با لاراول کار میکنم و دسترسی به سرور را هم در محیط سی پنل دارم . در لاراول دو تا فایل هست که به کران جاب مربوط میشه یکی فایل kernel.php ودیگری فایلی به اسم دلخواه مثلا cron.php که حاوی کاری است که میخواهیم بطور متناوب اجرا شود . در محیط سی پنل یک آیتمی داره به اسم cronJob که در ان میتوانیم دوره تناوب اجرای دستور و محل فایل cron.php را مشخص کنیم . آخرش کاری که توانستم بکنم این بود که کران جاب رو فعال کنم ولی نمیتونه فایل cron.php را درست اجرا کنه و میگه Class ‘Illuminate\Console\Command’ not found . این پیام در ایمیلی که بهم میده هستش . چند تا سوال برام پیش اومد اول اینکه چه نیازی به این فایل kernel.php هست ؟ ما در خط command اسمی از آن نمیبریم . دوم اینکه اگر اصلا میشه دستورات آرتیسان را در خود cpanel که رابط من با سرور هست اجرا کنم ؟ در اینصورت چه دستوری باید بدم که پیام خطای بالا را نده ؟ سوم اینکه در خط کامند اصولا دو مدل میشه نوشت یکی آدرس فایل cron.php را داد و دیگری دستور آرتیسان artisan schedule:run را داد . چه فرقی دارن اینا با هم .
    خیلی متشکر از لطفی که در پاسخ بدادن سوالات میکنید.

    پاسخ
    1. حسن شفیعی ۲۰ آذر ۱۳۹۷

      سلام. ممنون. متاسفانه با لاراول کار نکردم و از نحوه پیاده سازی این مورد در لاراول اطلاعی نداریم. میتونید با جستجوی خطاها در گوگل جواب سوال خود را پیدا کنید.
      موفق باشید.

      پاسخ
دوره های آموزشی

دانلود رایگان کتاب آموزش PHP

صفر تا صد PHP و MySQL را یکجا یاد بگیرید
همین الان دانلود کن
نگران نباشید. ایمیل‌های مزاحم نمی‌فرستیم
close-link