ูƒูŠููŠุฉ ุชุดุบูŠู„ cron ุฃูƒุซุฑ ู…ู† ู…ุฑุฉ ููŠ ุงู„ุฏู‚ูŠู‚ุฉ ุจุงุณุชุฎุฏุงู… PHP

ู…ู„ู ุงู„ุชูƒูˆูŠู† ุงู„ูƒู„ุงุณูŠูƒูŠ ู„ุฅุฏุฎุงู„ุงุช ู…ู‡ุงู… cron ููŠ ู†ุธุงู… ุงู„ุชุดุบูŠู„ Linux ู‡ูˆ ูƒู…ุง ูŠู„ูŠ:

# โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  (0 - 59)
# โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  (0 - 23)
# โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  (1 - 31)
# โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  (1 - 12)
# โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€   (0 - 6)
# โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
# * * * * * <  >

ุชุดูŠุฑ ุงู„ู…ุนู„ู…ุงุช ุงู„ุฎู…ุณ ุงู„ุฃูˆู„ู‰ ุฅู„ู‰ ูˆู‚ุช ุชู†ููŠุฐ ู‡ุฐู‡ ุงู„ู…ู‡ู…ุฉ ุŒ ูˆุงู„ุณุงุฏุณุฉ - ุงู„ุฃู…ุฑ ู†ูุณู‡ ุŒ ุงู„ุฐูŠ ูŠุฌุจ ุชุดุบูŠู„ู‡. ู…ุนู„ู…ุงุช ุงู„ูˆู‚ุช ู‡ูŠ: ุงู„ุฏู‚ุงุฆู‚ ูˆุงู„ุณุงุนุงุช ูˆุงู„ุฃูŠุงู… ูˆุงู„ุฃุดู‡ุฑ ูˆูŠูˆู… ุงู„ุฃุณุจูˆุน. ุนู„ุงูˆุฉ ุนู„ู‰ ุฐู„ูƒ ุŒ ูŠุฌุจ ุชู…ุซูŠู„ ุฌู…ูŠุน ุงู„ุฃุฑู‚ุงู… ุนู„ู‰ ุฃู†ู‡ุง ุฃุนุฏุงุฏ ุตุญูŠุญุฉ ุฃูˆ ููŠ ุจู†ุงุก ุฌู…ู„ุฉ ุฎุงุต .

ูˆู†ุชูŠุฌุฉ ู„ุฐู„ูƒ ุŒ ูุฅู† ุงู„ุญุฏ ุงู„ุฃุฏู†ู‰ ู„ู„ูุชุฑุฉ ุงู„ุฒู…ู†ูŠุฉ ู„ุจุฏุก ุงู„ุฃู…ุฑ ู…ุฑุฉ ูˆุงุญุฏุฉ ููŠ ุงู„ุฏู‚ูŠู‚ุฉ.

ู„ู„ุนุฏูŠุฏ ู…ู† ุงู„ู…ู‡ุงู… ุŒ ู‡ู†ุงูƒ ุญุงุฌุฉ ุฅู„ู‰ ุชู†ููŠุฐ ุงู„ุฃูˆุงู…ุฑ ุจุดูƒู„ ุฃูƒุซุฑ ุชูƒุฑุงุฑู‹ุง ุŒ ุนู„ู‰ ุณุจูŠู„ ุงู„ู…ุซุงู„ ุŒ ูƒู„ 10 ุซูˆุงู†ู. ุจุงู„ู†ุณุจุฉ ู„ุจุนุถ ู…ู‡ุงู… ุฃุชู…ุชุฉ ุนู…ู„ูŠุงุช ุงู„ุฃุนู…ุงู„ ุŒ ู„ุง ูŠุชุฌุงูˆุฒ ุงู„ุญุฏ ุงู„ุฃู‚ุตู‰ ุงู„ู…ุณู…ูˆุญ ุจู‡ ู„ู„ุชุฃุฎูŠุฑ ุบุงู„ุจู‹ุง 1-1.5 ุซุงู†ูŠุฉ.

ุจุงู„ุทุจุน ุŒ ูƒุฑูˆู† ุงู„ูƒู„ุงุณูŠูƒูŠ ุบูŠุฑ ู…ู†ุงุณุจ ู„ู‡ุฐุง - ูŠุญุชุงุฌ ุฅู„ู‰ ุชุญุณูŠู†.

ู…ุง ูŠู„ูŠ ู‡ูˆ ุชู†ููŠุฐ ุฎุทูˆุฉ ุจุฎุทูˆุฉ ู„ุฅู†ุดุงุก ูˆุธุงุฆู ุฅุถุงููŠุฉ (ููŠ PHP) ุฅู„ู‰ cron ุงู„ูƒู„ุงุณูŠูƒูŠ ุนู„ู‰ Linux ุจุงุณุชุฎุฏุงู… ุญู…ุงูŠุฉ ุฅุถุงููŠุฉ ุถุฏ ุนู…ู„ูŠุงุช ุฅุนุงุฏุฉ ุงู„ุชุดุบูŠู„.

ุฅุนุฏุงุฏ ุงู„ู…ู‡ุงู… ูˆุฅุนุฏุงุฏ ูƒุฑูˆู†


ุนู„ู‰ ุณุจูŠู„ ุงู„ู…ุซุงู„ ุŒ ุณู†ุณุชุฎุฏู… ุงู„ู…ู‡ู…ุฉ ุงู„ุชุงู„ูŠุฉ:

  1. ููŠ ุงู„ูˆุงุฌู‡ุฉ ุงู„ุฃู…ุงู…ูŠุฉ ุŒ ูŠู…ูƒู† ู„ู„ู…ุณุชุฎุฏู… ุงู„ุจุฏุก ููŠ ุชู†ููŠุฐ ุจุนุถ ุงู„ู…ู‡ุงู… ุงู„ู…ุนู‚ุฏุฉ ุจุงู„ู†ู‚ุฑ ููˆู‚ ุงู„ุฒุฑ "ุชุดุบูŠู„" ุ›
  2. ุชุจู„ุบ ุงู„ู†ู‡ุงูŠุฉ ุงู„ุฎู„ููŠุฉ ุจุนุฏ ูƒุชุงุจุฉ ุณุทุฑ ุฌุฏูŠุฏ ููŠ ู‚ุงุนุฏุฉ ุงู„ุจูŠุงู†ุงุช ุงู„ู…ุณุชุฎุฏู… ุจุงู„ุชุฃูƒูŠุฏ ุ›
  3. ู…ู† ุฎู„ุงู„ cron ุŒ ุณูˆู "ู†ุชุชุจุน" ู‡ุฐู‡ ุงู„ู…ู‡ุงู… ุงู„ุฌุฏูŠุฏุฉ ูˆู†ูƒู…ู„ู‡ุง ุจุฃุณุฑุน ู…ุง ูŠู…ูƒู† ุญุชู‰ ู„ุง ูŠุญุตู„ ุงู„ู…ุณุชุฎุฏู… ุนู„ู‰ ุงู„ู†ุชูŠุฌุฉ ููŠ ุฏู‚ูŠู‚ุฉ ูˆุงุญุฏุฉ ุŒ ูˆู„ูƒู† ุนู„ู‰ ุงู„ููˆุฑ *

* ุฅุฐุง ูƒู†ุช ุชุณุชุฎุฏู… ุฅุทู„ุงู‚ ุงู„ุฃูˆุงู…ุฑ ุŒ ููŠ ุงู„ุฏู‚ูŠู‚ุฉ ุงู„ูˆุงุญุฏุฉ ูู‚ุท ุŒ ูุณุชุจุฏุฃ ุงู„ู…ู‡ู…ุฉ ุนู†ุฏู…ุง ุชุตู„ ุงู„ุซูˆุงู†ูŠ ุฅู„ู‰ ุฃู‚ุฑุจ ุตูุฑ (ุจุฏุงูŠุฉ ุฏู‚ูŠู‚ุฉ ุฌุฏูŠุฏุฉ). ู„ุฐู„ูƒ ุŒ ููŠ ุงู„ู†ู…ูˆุฐุฌ ุงู„ูƒู„ุงุณูŠูƒูŠ ุŒ ุณูŠุญุชุงุฌ ุงู„ู…ุณุชุฎุฏู… ุฅู„ู‰ ุงู†ุชุธุงุฑ ุงู„ุชู†ููŠุฐ ู…ู† 0 ุฅู„ู‰ 59 ุซุงู†ูŠุฉ.

ู„ุฐู„ูƒ ุŒ ุณูŠุชู… ุชูƒูˆูŠู† cron ููŠ ุดูƒู„ู‡ ุงู„ุฃู‚ุตู‰ ุŒ ุฃูŠ ู…ุฑุฉ ููŠ ุงู„ุฏู‚ูŠู‚ุฉ:

* * * * * /usr/bin/php -q /run.php > /dev/null 2>&1
#/usr/bin/php -    PHP   (      )
#/run.php -   PHP   
#> /dev/null 2>&1 - ,            run.php

ุฏูˆุฑุฉ ูˆุงุญุฏุฉ


ููŠ ุงู„ุจุฏุงูŠุฉ ุŒ ูŠุฌุจ ุฃู† ุชู‚ุฑุฑ ุนุฏุฏ ุงู„ู…ุฑุงุช ุงู„ุชูŠ ุณู†ุทู„ุจ ููŠู‡ุง ู…ู‡ุงู… ุฌุฏูŠุฏุฉ ููŠ ู‚ุงุนุฏุฉ ุงู„ุจูŠุงู†ุงุช - ุจู†ุงุกู‹ ุนู„ู‰ ุฐู„ูƒ ุŒ ุณูŠุชุบูŠุฑ ุนุฏุฏ ุงู„ุฏูˆุฑุงุช ูˆุงู„ู†ูˆู… ุงู„ู…ู†ุทู‚ูŠ (ุงู„ูˆุธูŠูุฉ sleep) .

ููŠ ุงู„ู…ุซุงู„ ุงู„ุญุงู„ูŠ ุŒ ูŠุชู… ุงุณุชุฎุฏุงู… ุฎุทูˆุฉ ู…ู† 10 ุซูˆุงู†ู. ู„ุฐู„ูƒ ุŒ ูŠูƒูˆู† ุนุฏุฏ ุงู„ุฏูˆุฑุงุช 60/10 = 6. ุงู„ุฅุฌู…ุงู„ูŠ ุŒ ุงู„ุฑู…ุฒ ุงู„ุนุงู… ู‡ูˆ ูƒู…ุง ูŠู„ูŠ:

for ($cycle = 1; $cycle <= 6; $cycle++) { # 6 
    $all_tasks = get_all_tasks(); #     
    if ($all_tasks) { #    - 
        foreach($all_tasks as $one_task) { #     
            solve_one_task($one_task); #  
        }
    }
    sleep(10); #  ,  ""  10 
}

ุชูˆุถูŠุญ : ููŠ ู‡ุฐุง ุงู„ู…ุซุงู„ ุŒ ูŠุชู… ุงุณุชุฎุฏุงู… ุฎุทูˆุฉ ู…ู† 10 ุซูˆุงู†ู ุŒ ูˆุงู„ุชูŠ ูŠู…ูƒู† ุฃู† ุชูˆูุฑ ุงู„ุญุฏ ุงู„ุฃุฏู†ู‰ ู…ู† ุงู„ูุงุตู„ ุงู„ุฒู…ู†ูŠ ู„ุชู†ููŠุฐ ุงู„ุจุฑู†ุงู…ุฌ ุงู„ู†ุตูŠ ู…ุฑุฉ ูˆุงุญุฏุฉ ูƒู„ 10 ุซูˆุงู†ู. ูˆูู‚ู‹ุง ู„ุฐู„ูƒ ุŒ ู…ู† ุฃุฌู„ ุชู†ููŠุฐ ุฃูƒุซุฑ ุชูƒุฑุงุฑู‹ุง ุŒ ูŠุฌุจ ุนู„ูŠูƒ ุชุบูŠูŠุฑ ุนุฏุฏ ุงู„ุฏูˆุฑุงุช ูˆ "ูˆู‚ุช ุงู„ู†ูˆู…".

ุชุฌู†ุจ ุชู†ููŠุฐ ุงู„ู…ู‡ุงู… ุงู„ู…ุชูƒุฑุฑุฉ


ููŠ ุงู„ู†ู…ูˆุฐุฌ ุงู„ู…ู‚ุฏู… ุŒ ู‡ู†ุงูƒ ุดูƒ ูˆุงุญุฏ ุŒ ูˆู‡ูˆ ุงู„ุชู†ููŠุฐ ุงู„ู…ุชูƒุฑุฑ ู„ู„ู…ู‡ู…ุฉ ุฅุฐุง ูƒุงู†ุช ู‚ุฏ ุจุฏุฃุช ุจุงู„ูุนู„. ูŠุตุจุญ ู‡ุฐุง ุตุญูŠุญู‹ุง ุจุดูƒู„ ุฎุงุต ุฅุฐุง ูƒุงู†ุช ุงู„ู…ู‡ู…ุฉ "ุตุนุจุฉ" ูˆุชุชุทู„ุจ ุจุถุน ุซูˆุงู†ู ู„ุชู†ููŠุฐู‡ุง.

ูŠุคุฏูŠ ู‡ุฐุง ุฅู„ู‰ ุญุฏูˆุซ ู…ุดูƒู„ุฉ ุฅุนุงุฏุฉ ุชู†ููŠุฐ:

  • ุงู„ูˆุธูŠูุฉ solve_one_task()ู‚ูŠุฏ ุงู„ุชุดุบูŠู„ ุจุงู„ูุนู„ ุŒ ู„ูƒู†ู‡ุง ู„ู… ุชูƒู…ู„ ุนู…ู„ู‡ุง ุจุนุฏ ุ›
  • ู„ุฐู„ูƒ ุŒ ููŠ ู‚ุงุนุฏุฉ ุงู„ุจูŠุงู†ุงุช ุŒ ู„ุง ุชุฒุงู„ ุงู„ู…ู‡ู…ุฉ ู…ู…ูŠุฒุฉ ุนู„ู‰ ุฃู†ู‡ุง ู„ู… ูŠุชู… ุชู†ููŠุฐู‡ุง ุ›
  • ุณุชุญุตู„ ุงู„ุฏูˆุฑุฉ ุงู„ุชุงู„ูŠุฉ ุนู„ู‰ ู‡ุฐู‡ ุงู„ู…ู‡ู…ุฉ ู…ุฑุฉ ุฃุฎุฑู‰ ูˆุชู‚ูˆู… ุจุชุดุบูŠู„ ุงู„ูˆุธูŠูุฉ solve_one_task()ู…ุฑุฉ ุฃุฎุฑู‰ ุจู†ูุณ ุงู„ู…ู‡ู…ุฉ.

ุจุงู„ุทุจุน ุŒ ูŠู…ูƒู† ุญู„ ู‡ุฐุง ุŒ ุนู„ู‰ ุณุจูŠู„ ุงู„ู…ุซุงู„ ุŒ ุนู† ุทุฑูŠู‚ ุชุบูŠูŠุฑ ุจุนุถ ุงู„ุญุงู„ุฉ ููŠ ู‚ุงุนุฏุฉ ุงู„ุจูŠุงู†ุงุช ู„ู‡ุฐู‡ ุงู„ู…ู‡ู…ุฉ.

ู„ูƒู†ู†ุง ู„ู† ู†ู‚ูˆู… ุจุชุญู…ูŠู„ ู‚ุงุนุฏุฉ ุงู„ุจูŠุงู†ุงุช: ุจู†ุงุกู‹ ุนู„ู‰ ุงู„ุงุฎุชุจุงุฑ ุงู„ุฐูŠ ุฃุฌุฑูŠุชู‡ ุŒ ูŠู…ูƒู† ู„ู€ MYSQL ู‚ุจูˆู„ ุงู„ุทู„ุจ ุŒ ูˆู„ูƒู† ู„ุง ูŠู…ูƒู†ู‡ ู…ุนุงู„ุฌุชู‡ ุนู„ู‰ ุงู„ููˆุฑ. ูŠู…ูƒู† ุฃู† ูŠุคุฏูŠ ุงู„ุงุฎุชู„ุงู ุญุชู‰ 0.5 ุซุงู†ูŠุฉ ุฅู„ู‰ ุงู„ุชู†ููŠุฐ ุงู„ู…ุชูƒุฑุฑ - ูˆู‡ูˆ ุฃู…ุฑ ุบูŠุฑ ู…ู†ุงุณุจ ุจุดูƒู„ ู‚ุงุทุน.

ุฃูŠุถู‹ุง ููŠ ู‡ุฐู‡ ุงู„ุญุงู„ุฉ ุŒ ู†ุญู† ู†ุชุญุฏุซ ูู‚ุท ุนู† ุญุงู„ุฉ ุงู„ู…ู‡ุงู… ุŒ ู„ุฐุง ู…ู† ุงู„ุฃูุถู„ ุงุณุชุฎุฏุงู… ู†ุธุงู… ุงู„ู…ู„ูุงุช ุงู„ุฎุงุต ุจุงู„ุฎุงุฏู….

ุชู… ุจู†ุงุก ู†ู…ูˆุฐุฌ ุงู„ุชุญู‚ู‚ ุงู„ุฃุณุงุณูŠ ุจุงุณุชุฎุฏุงู… flock- ูˆุธูŠูุฉ ุชุญุฏุฏ ุงู„ู…ู„ู ูˆุชูุชุญู‡.

ููŠ ุชู†ููŠุฐ PHP ุŒ ูŠู…ูƒู† ุชู…ุซูŠู„ ุงู„ูˆุธูŠูุฉ ุนู„ู‰ ุงู„ู†ุญูˆ ุงู„ุชุงู„ูŠ:

$lock_file_abs = 'file'; #  
$fp = fopen($lock_file_abs,"w+"); #   
if (flock($fp, LOCK_EX | LOCK_NB)) { #,    
    solve_one_task($one_task); #  
    flock($fp, LOCK_UN); #   ,     
}
else {
    #,   , ..       
}
fclose($fp); #   
unlink($lock_file_abs); # ,   

ู†ุชูŠุฌุฉ


ุงู„ุนุฑุถ ุงู„ุนุงู… ู„ู„ุฏูˆุฑุฉ ุจุฃูƒู…ู„ู‡ุง ูƒู…ุง ูŠู„ูŠ:

for ($cycle = 1; $cycle <= 6; $cycle++) {
    $all_tasks = get_all_tasks();
    if ($all_tasks) {
        foreach($all_tasks as $one_task) {
            $lock_file_abs = __DIR__.'/locks/run_'.$one_task['id'];
            $fp = fopen($lock_file_abs,"w+");
            if (flock($fp, LOCK_EX | LOCK_NB)) {
                solve_one_task($one_task);
                flock($fp, LOCK_UN);
            }
            else {
                #    
            }
            fclose($fp);
            unlink($lock_file_abs);
        }
    }
    sleep(10);
}

ูˆุจุงู„ุชุงู„ูŠ ุŒ ุชุณู…ุญ ู„ูƒ ู‡ุฐู‡ ุงู„ุฎูˆุงุฑุฒู…ูŠุฉ ุจุจุฏุก ุชู†ููŠุฐ ุฏูˆุฑูŠ ู„ู…ุนุงู„ุฌุฉ ุงู„ู…ู‡ุงู… ูˆู„ุง ุชู‚ู„ู‚ ู…ู† ุฃู† ุงู„ู…ู‡ู…ุฉ ุณุชุชู… ู…ุนุงู„ุฌุชู‡ุง ุฃูƒุซุฑ ู…ู† ู…ุฑุฉ.

ูˆุงู„ุขู† ูŠูƒููŠ ุจุจุณุงุทุฉ ุชุดุบูŠู„ ู‡ุฐุง ุงู„ุฑู…ุฒ ู…ู† ุฎู„ุงู„ cron ูƒู„ ุฏู‚ูŠู‚ุฉ ุŒ ูˆุจุฏูˆุฑู‡ ุŒ ุณูŠุชู… ุชุดุบูŠู„ ุฏูˆุฑุงุช ุฃุตุบุฑ ุจุงู„ูุนู„ ุฏุงุฎู„ ู†ูุณู‡.

All Articles