مدیریت Cron Jobs با PHP

  • 121 بازدید
  • مدیریت Cron Jobs با PHP

    مدیریت Cron Jobs با PHP

    مدیریت Cron Jobs

    مدیریت Cron Jobs :فعالیت هایی که توسط یک سایت اینترنتی انجام می شود به دلایل مختلف مانند زمان بر بودن و یا زمانبندی شدن نمی توان با درخواست کاربر انجام داد و نیاز به زمانبندی دارند.برای رفع این مشکل از Cron Jobs استفاده می شود. انجام کارها به صورت شخصی ساری شده توسط Cron Jobs نیاز به برنامه نویسی با زبان PHP دارد.

    در این مقاله به نحوه ایجاد و مدیریت Cron Jobs با استفاده از زبان PHP می پردازیم.

    Cron Jobs

    مدیریت Cron Jobs

    cronTab یا Cron Table یک پروسه سیستم لینوکس است که وظیفه زمانبندی کارهای تکراری را بر عهده دارد و باعث تسهیل در کارهای روزانه می شود.در این آموزش، ما یک کلاس PHP پویا ایجاد می کنیم که با استفاده از یک اتصال امن، به ما امکان دستکاری cronTab را می دهد.
    تهیه پشتیبان از پایگاه داده SQL، ارسال ایمیل ، تجزیه و تحلیل عملکرد، و یا حتی گرفتن فید RSS، کارهایی است که با Cron Jobs می توان انجام داد.

    ایجاد دستور Cron Jobs

    Cron Jobs

    گرچه نحو برنامه ریزی یک کار جدید ممکن است در نگاه اول پیچیده باشد، اما در حقیقت نسبتا ساده است.Cron Jobs همواره دارای پنج ستون است که هر کدام از آن ها یک عملیات زمانبندی است که با یک مسیر و دستور دنبال می شود:

    * * * * * home/path/to/command/the_command.sh

    • دقیقه: دقیقه یک ساعت داده می شود (۵۹-۰).

    • ساعت: ساعت یک روز معادل ۲۳-۰ داده می شود.

    • روز: نشان دهنده یک روز از ماه معینی است (۱-۳۱).

    • ماه: نشان دهنده یک ماه از سال معینی است، به ترتیب ۱۲-۱ می باشد.

    • روز هفته: نشان دهنده روز هفته، یکشنبه تا شنبه، به صورت عددی، به ترتیب ۶-۰ است

    [دقیقه [۰-۵۹
    |  [ساعت [۰-۲۳
    |  | [روز [۱-۳۱
    |  | |  [ماه [۱-۱۲
    |  | |  | روز هفته [Numeric, 0-6]
    |  | |  | |
    * * * * * home/path/to/command/the_command.sh

    برای مثال، اگر یک کار را برای ۱۲ صبح یکم هر ماه انجام دهد:

    ۱ ۰ ۰ ۱ * * home/path/to/command/the_command.sh

    اگر ما می خواستیم برنامه ای را هر شنبه در ساعت ۸:۳۰ بگذاریم، آن را به صورت زیر می نویسیم:

    ۱ ۳۰ ۸ * * ۶ home/path/to/command/the_command.sh

    • برای ایجاد یک لیست از کاما استفاده کرده و از مقادیر برای هر یک از ستون های cron استفاده می شود.

    • برای تعیین طیف وسیعی از مقادیر، از - استفاده شده است.

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

     

    cronTab، به طور پیش فرض، هر زمان که یک کار برنامه ریزی شده اجرا می شود، یک اعلان ایمیل ارسال می کند. در بسیاری از موارد، این مورد نیاز نیست. با این وجود، با هدایت خروجی استاندارد این فرمان به مقدار  /dev/null، می توانیم این قابلیت را به راحتی غیر فعال کنیم. اساسا این یک فایل است که همه چیز در آن نوشته شده است. هدایت خروجی از طریق اپراتور انجام می شود. بیایید بررسی کنیم که چگونه می توانیم خروجی استاندارد را به /dev/null  تغییر دهیم با استفاده از نمونه  cronjob ما که یک کار برنامه ریزی شده را هر شنبه در ساعت ۸:۳۰ انجام می دهیم:

    ۱ ۳۰ ۸ * * ۶ home/path/to/command/the_command.sh >/dev/null

    علاوه بر این، اگر ما خروجی استاندارد را به یک دستگاه null  هدایت کنیم، احتمالا می خواهیم خطاهای استاندارد را نیز تغییر دهیم. ما می توانیم این کار را به سادگی با هدایت خطاهای استاندارد انجام دهیم تا جایی که خروجی استاندارد پیش از آن هدایت می شود،

    home/path/to/command/the_command.sh >/dev/null 2>&1

     

    کلاس مدیریت Cron Jobs

    Class Ssh2_crontab_manager {

        private $connection;

        private $path;

        private $handle;

        private $cron_file;

    function __construct($host=NULL, $port=NULL, $username=NULL, $password=NULL)

    {

        $path_length     = strrpos(__FILE__, "/");

        $this->path      = substr(__FILE__, 0, $path_length) . '/';

        $this->handle    = 'crontab.txt';

        $this->cron_file = "{$this->path}{$this->handle}";

        try

        {

            if (is_null($host) || is_null($port) || is_null($username) || is_null($password)) throw new Exception("Please specify the host, port, username and password!");

            $this->connection = @ssh2_connect($host, $port);

            if ( ! $this->connection) throw new Exception("The SSH2 connection could not be established.");

            $authentication = @ssh2_auth_password($this->connection, $username, $password);

            if ( ! $authentication) throw new Exception("Could not authenticate '{$username}' using password: '{$password}'.");

        }

        catch (Exception $e)

        {

            $this->error_message($e->getMessage());

        }

    }

    public function exec()

    {

        $argument_count = func_num_args();

        try

        {

            if ( ! $argument_count) throw new Exception("There is nothing to execute, no arguments specified.");

            $arguments = func_get_args();

            $command_string = ($argument_count > 1) ? implode(" && ", $arguments) : $arguments[0];

            $stream = @ssh2_exec($this->connection, $command_string);

            if ( ! $stream) throw new Exception("Unable to execute the specified commands: <br />{$command_string}");

        }

        catch

        {

            $this->error_message($e->getMessage());

        }

        return $this;

    }

    public function write_to_file($path=NULL, $handle=NULL)

    {

        if ( ! $this->crontab_file_exists())

        {

            $this->handle = (is_null($handle)) ? $this->handle : $handle;

            $this->path   = (is_null($path))   ? $this->path   : $path;

            $this->cron_file = "{$this->path}{$this->handle}";

            $init_cron = "crontab -l > {$this->cron_file} && [ -f {$this->cron_file} ] || > {$this->cron_file}";

            $this->exec($init_cron);

        }

        return $this;

    }

    public function remove_file()

    {

        if ($this->crontab_file_exists()) $this->exec("rm {$this->cron_file}");

        return $this;

    }

    public function append_cronjob($cron_jobs=NULL)

    {

        if (is_null($cron_jobs)) $this->error_message("Nothing to append!  Please specify a cron job or an array of cron jobs.");

        $append_cronfile = "echo '";

        $append_cronfile .= (is_array($cron_jobs)) ? implode("\n", $cron_jobs) : $cron_jobs;

        $append_cronfile .= "'  >> {$this->cron_file}";

        $install_cron = "crontab {$this->cron_file}";

        $this->write_to_file()->exec($append_cronfile, $install_cron)->remove_file();

        return $this;

    }

    public function remove_cronjob($cron_jobs=NULL)

    {

        if (is_null($cron_jobs)) $this->error_message("Nothing to remove!  Please specify a cron job or an array of cron jobs.");

        $this->write_to_file();

        $cron_array = file($this->cron_file, FILE_IGNORE_NEW_LINES);

        if (empty($cron_array)) $this->error_message("Nothing to remove!  The cronTab is already empty.");

        $original_count = count($cron_array);

        if (is_array($cron_jobs))

        {

            foreach ($cron_jobs as $cron_regex) $cron_array = preg_grep($cron_regex, $cron_array, PREG_GREP_INVERT);

        }

        else

        {

            $cron_array = preg_grep($cron_jobs, $cron_array, PREG_GREP_INVERT);

        }

        return ($original_count === count($cron_array)) ? $this->remove_file() : $this->remove_crontab()->append_cronjob($cron_array);

    }

    public function remove_crontab()

    {

        $this->exec("crontab -r")->remove_file();

        return $this;

    }

    private function crontab_file_exists()

    {

        return file_exists($this->cron_file);

    }

    private function error_message($error)

    {

        die("<pre style='color:#EE2711'>ERROR: {$error}</pre>");

    }

    }

    برای مدیریت cronTab با php، ما باید توانایی اجرای دستورات، در سرور از راه دور، به عنوان کاربر نیاز داریم. خوشبختانه، PHP  یک راه ساده برای انجام این کار از طریق کتابخانه SSH2 فراهم می کند.

     

    فعال کردن کلاس و ایجاد یک اتصال معتبر

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

    $crontab = new Ssh2_crontab_manager('11.11.111.111', '22', 'my_username', 'my_password');

    • اضافه کردن یک cronjobs تکی: 

    با یک اتصال معتبر در جای خود، بیایید نگاهی به چگونگی ایجاد یک کار جدید، تک، cron کنیم.

    $crontab->append_cronjob('30 8 * * 6 home/path/to/command/the_command.sh >/dev/null 2>&1');

     

    • اضافه کردن یک آرایه از cronjobs:

    اضافه کردن کارهای چندگانه به سادگی همانند افزودن یک cronjobs ساده است. ما به راحتی یک آرایه را به روش append_cronjob () منتقل میکنیم.

    $new_cronjobs = array(    '۰ ۰ ۱ * * home/path/to/command/the_command.sh',    '۳۰ ۸ * * ۶ home/path/to/command/the_command.sh >/dev/null 2>&1'); $crontab->append_cronjob($new_cronjobs);

    حذف یک کار cron تکی:

    به همان شیوه که ما یک کار cron را ایجاد کردیم، اکنون یک مورد را حذف خواهیم کرد. با این وجود، این بار، از یک عبارت منظم برای یافتن کار مناسب استفاده می کنیم. این  عبارت می تواند به همان اندازه ساده یا پیچیده باشد که شما به آن نیاز دارید. در حقیقت، تعدادی از راه های برای regex برای کار شما برای شما وجود دارد. برای مثال، اگر وظیفه ای که شما باید حذف کنید، منحصر به فرد است که دستور اجرا شده در هر جای دیگر در cronTab استفاده نمی شود، شما می توانید ساده نام دستور را به عنوان regEx مشخص کنید. علاوه بر این، اگر شما می خواهید تمام وظایف را برای یک ماه خاص را حذف کنید، می توانید به سادگی یک عبارت منظم برای پیدا کردن یک بازی برای همه کارهای یک ماه خاص ارسال کنید!

    $crontab = new Ssh2_crontab_manager('11.11.111.111', '22', 'my_username', 'my_password'); $cron_regex = '/home\/path\/to\/command\/the_command\.sh\/'; $crontab->remove_cronjob($cron_regex);

     

     

    $crontab = new Ssh2_crontab_manager('11.11.111.111', '22', 'my_username', 'my_password'); $cron_regex = array(    '/۰ ۰ ۱ \* \*/',    '/home\/path\/to\/command\/the_command\.sh\/'); $crontab->remove_cronjob($cron_regex);

    حذف آرایه ای از cronjobs:

    حذف cronjobs چندگانه به همان شیوه است که حذف یک cronJob تنها با یک استثناء، ما آرایه عبارات منظم کار با cron را به روش remove_cronjob () منتقل می کنیم.

    $crontab = new Ssh2_crontab_manager('11.11.111.111', '22', 'my_username', 'my_password'); $cron_regex = array(    '/۰ ۰ ۱ \* \*/',    '/home\/path\/to\/command\/the_command\.sh\/'); $crontab->remove_cronjob($cron_regex);

    ارسال دیدگاه

    نشانی ایمیل شما منتشر نخواهد شد.

    سئوال دارید؟ کارشناسان ما همواره پاسخگوی شما هستند.