目錄
An alternative solution
PHP check if a timestamp matches a given cron schedule
效果:
首頁 php教程 php手册 【转载】PHP使用1个crontab管理多个crontab任务

【转载】PHP使用1个crontab管理多个crontab任务

Jun 06, 2016 pm 07:45 PM
crontab php 任務 使用 多個 管理

http://www.cnblogs.com/showker/archive/2013/09/01/3294279.html http://www.binarytides.com/php-manage-multiple-cronjobs-with-a-single-crontab-entry/ In many php applications there are multiple tasks that need to be run via cron at different

http://www.cnblogs.com/showker/archive/2013/09/01/3294279.html

 

http://www.binarytides.com/php-manage-multiple-cronjobs-with-a-single-crontab-entry/

 

In many php applications there are multiple tasks that need to be run via cron at different times. In a typical application you may be doing the following tasks via cronjobs : 

1. Backup database.
2. Send out email to subscribers.
3. Clear temporary files.
4. Fetch xml feeds from some source and store them in database.

So if you had separate php files doing these tasks , and had a cronjob entry for each , your cronjob could look like this :

MAILTO="happy@birthday.com"
0 0 * * * /var/www/my_app/backup_database.php
12 2 * * * /var/www/my_app/email_to_subscribers.php
10 5 * * * /var/www/my_app/clear_temp_files.php
10 7 * * * /var/www/my_app/fetch_xml_feeds.php

The above is the simplest approach to manage multiple cronjobs for your php application. However this approach has many drawbacks :

1. Multiple entries in crontabs means more time and effort needed to edit the crontab and maintain it.

- Since this approach involves writing each task separately in the cron list , it becomes difficult to maintain.

2. The crontab command has to be used everytime a change is to be made.

- You need to either manually do a `crontab -t` in the shell prompt or make your php application do it , everytime there is a change in either the tasks or their timing.

3. If the script name changes then have to edit the crontab file again.
4. A log email would be generated for every cron run, creating multiple log emails.

- Every task that is running would generate a cronlog and email itself to the email specified

5. Inefficient when there are 10s or 100s of tasks to be run via cron.

- Do you think it is a good idea if you had many many tasks to do.

An alternative solution

How about having only 1 entry in the cronjobs, and that 1 cronjob manages the rest of the cronjobs.

1. Add only 1 task to the crontab rule say :

<span>1</span> * * * * * php /path/to/cronjob.php
登入後複製

The cronjob.php file would run all the tasks that need to be run via cron. Its important to note that this cronjob.php will run every minute and forever. Do not be worried about it eating too much of system resources. It is a faily light thing and does not load your CPU or RAM with anything heavy.(注意这个cronjob.php会每分钟执行一次,而且一直会一直这样。不必担心这会消耗太多系统资源,这是一个非常轻量级的东西,它不会额外占用你的CPU和内存)

Now the next thing would be to make sure cronjob.php can run all the tasks at the right time.

2. Now we need to have different tasks have a different cron schedule. Lets say there are 3 different tasks to run at 3 different times :

0 5 * * * database_backup
0 5 1,15 * * monthly_sales_report
0 10 15 02 * purchase_report

登入後複製

 

The cronjob.php that runs every minute should have an array like this :

<span>1</span> <span>$cronjobs = array();
</span><span>2</span>  
<span>3</span> <span>$cronjobs['database_backup'] = '0 5 * * *';
</span><span>4</span> <span>$cronjobs['monthly_sales_report'] = '0 5 1,15 * *';
</span><span>5</span> $cronjobs['purchase_report'] = '0 10 15 02 *';
登入後複製

Now we test each job/task for the timestamp and run it like this :

<span>1</span> <span>foreach</span>(<span>$cronjobs</span> <span>as</span> <span>$method</span> => <span>$cron</span><span>)
</span><span>2</span> <span>{
</span><span>3</span>     <span>$time</span> = <span>time</span><span>();
</span><span>4</span>         <span>if</span>( is_time_cron(<span>$time</span> , <span>$cron</span><span>) )
</span><span>5</span> <span>    {
</span><span>6</span>         <span>$result</span> = <span>$method</span><span>();
</span><span>7</span>         <span>echo</span> <span>$result</span><span>;
</span><span>8</span> <span>    }
</span><span>9</span> }
登入後複製

is_time_cron checks if the current timestamp matches the cron schedule or not. If it matches , then the task is executed. Theis_time_cron method can be found in the previous post here.

In this approach the benefits are :

1. Only 1 crontab entry.

The crontab list is clean and your application does not overload it.

2. Easy to maintain , does not need any modification unless the script path/name changes.

The crontab once created does not need any change unless the name or path of 'cronjob.php' changes. Meanwhile the jobs inside cronjob.php can change their names , schedules and anything very easily.

3. To add/edit/remove tasks or change their time schedules only the cronjob.php needs to be changed.

This means easier modification , maintenance and the application can provide simple user interface to make changes anytime without the need to use crontab commands or anything as such.

The above mentioned approach can be applied to any language , not just php.

 

 

 

附加:判断当前时间蹉是否符合某个cronjob

http://www.binarytides.com/php-check-if-a-timestamp-matches-a-given-cron-schedule/

PHP check if a timestamp matches a given cron schedule

<span>1</span> <span>desktop:~$ php -a
</span><span>2</span> <span>Interactive shell
</span><span>3</span>  
<span>4</span> <span>php > echo time();
</span><span>5</span> <span>1319362432
</span><span>6</span> php > 
登入後複製

 

 

Above is an example of a given timestamp.

And a cron schedule can look like this 0 5 * * * - which means run everyday at 5 hours and 0 minutes.

Now in a php application you may need to test if a given timestamp , say 1319362432 matches a given cron schedule like 0 5 * * *.

Here is a quick php function that can do this task.

<span> 1</span> <span>/*</span><span>*
</span><span> 2</span> <span>    Test if a timestamp matches a cron format or not
</span><span> 3</span> <span>    //$cron = '5 0 * * *';
</span><span> 4</span> <span>*/</span>
<span> 5</span> <span>function</span> is_time_cron(<span>$time</span> , <span>$cron</span><span>) 
</span><span> 6</span> <span>{
</span><span> 7</span>     <span>$cron_parts</span> = <span>explode</span>(' ' , <span>$cron</span><span>);
</span><span> 8</span>     <span>if</span>(<span>count</span>(<span>$cron_parts</span>) != 5<span>)
</span><span> 9</span> <span>    {
</span><span>10</span>         <span>return</span> <span>false</span><span>;
</span><span>11</span> <span>    }
</span><span>12</span>      
<span>13</span>     <span>list</span>(<span>$min</span> , <span>$hour</span> , <span>$day</span> , <span>$mon</span> , <span>$week</span>) = <span>explode</span>(' ' , <span>$cron</span><span>);
</span><span>14</span>      
<span>15</span>     <span>$to_check</span> = <span>array</span>('min' => 'i' , 'hour' => 'G' , 'day' => 'j' , 'mon' => 'n' , 'week' => 'w'<span>);
</span><span>16</span>      
<span>17</span>     <span>$ranges</span> = <span>array</span><span>(
</span><span>18</span>         'min' => '0-59' ,
<span>19</span>         'hour' => '0-23' ,
<span>20</span>         'day' => '1-31' ,
<span>21</span>         'mon' => '1-12' ,
<span>22</span>         'week' => '0-6' ,
<span>23</span> <span>    );
</span><span>24</span>      
<span>25</span>     <span>foreach</span>(<span>$to_check</span> <span>as</span> <span>$part</span> => <span>$c</span><span>)
</span><span>26</span> <span>    {
</span><span>27</span>         <span>$val</span> = $<span>$part</span><span>;
</span><span>28</span>         <span>$values</span> = <span>array</span><span>();
</span><span>29</span>          
<span>30</span>         <span>/*</span>
<span>31</span> <span>            For patters like 0-23/2
</span><span>32</span>         <span>*/</span>
<span>33</span>         <span>if</span>(<span>strpos</span>(<span>$val</span> , '/') !== <span>false</span><span>)
</span><span>34</span> <span>        {
</span><span>35</span>             <span>//</span><span>Get the range and step</span>
<span>36</span>             <span>list</span>(<span>$range</span> , <span>$steps</span>) = <span>explode</span>('/' , <span>$val</span><span>);
</span><span>37</span>              
<span>38</span>             <span>//</span><span>Now get the start and stop</span>
<span>39</span>             <span>if</span>(<span>$range</span> == '*'<span>)
</span><span>40</span> <span>            {
</span><span>41</span>                 <span>$range</span> = <span>$ranges</span>[<span>$part</span><span>];
</span><span>42</span> <span>            }
</span><span>43</span>             <span>list</span>(<span>$start</span> , <span>$stop</span>) = <span>explode</span>('-' , <span>$range</span><span>);
</span><span>44</span>                  
<span>45</span>             <span>for</span>(<span>$i</span> = <span>$start</span> ; <span>$i</span> $stop ; <span>$i</span> = <span>$i</span> + <span>$steps</span><span>)
</span><span>46</span> <span>            {
</span><span>47</span>                 <span>$values</span>[] = <span>$i</span><span>;
</span><span>48</span> <span>            }
</span><span>49</span> <span>        }
</span><span>50</span>         <span>/*</span>
<span>51</span> <span>            For patters like :
</span><span>52</span> <span>            2
</span><span>53</span> <span>            2,5,8
</span><span>54</span> <span>            2-23
</span><span>55</span>         <span>*/</span>
<span>56</span>         <span>else</span>
<span>57</span> <span>        {
</span><span>58</span>             <span>$k</span> = <span>explode</span>(',' , <span>$val</span><span>);
</span><span>59</span>              
<span>60</span>             <span>foreach</span>(<span>$k</span> <span>as</span> <span>$v</span><span>)
</span><span>61</span> <span>            {
</span><span>62</span>                 <span>if</span>(<span>strpos</span>(<span>$v</span> , '-') !== <span>false</span><span>)
</span><span>63</span> <span>                {
</span><span>64</span>                     <span>list</span>(<span>$start</span> , <span>$stop</span>) = <span>explode</span>('-' , <span>$v</span><span>);
</span><span>65</span>                  
<span>66</span>                     <span>for</span>(<span>$i</span> = <span>$start</span> ; <span>$i</span> $stop ; <span>$i</span>++<span>)
</span><span>67</span> <span>                    {
</span><span>68</span>                         <span>$values</span>[] = <span>$i</span><span>;
</span><span>69</span> <span>                    }
</span><span>70</span> <span>                }
</span><span>71</span>                 <span>else</span>
<span>72</span> <span>                {
</span><span>73</span>                     <span>$values</span>[] = <span>$v</span><span>;
</span><span>74</span> <span>                }
</span><span>75</span> <span>            }
</span><span>76</span> <span>        }
</span><span>77</span>          
<span>78</span>         <span>if</span> ( !<span>in_array</span>( <span>date</span>(<span>$c</span> , <span>$time</span>) , <span>$values</span> ) and (<span>strval</span>(<span>$val</span>) != '*'<span>) ) 
</span><span>79</span> <span>        {
</span><span>80</span>             <span>return</span> <span>false</span><span>;
</span><span>81</span> <span>        }
</span><span>82</span> <span>    }
</span><span>83</span>      
<span>84</span>     <span>return</span> <span>true</span><span>;
</span><span>85</span> <span>}
</span><span>86</span>  
<span>87</span> <span>var_dump</span>(<span>time</span>() , '0 5 * * *');  <span>//</span><span>true or false</span>
登入後複製

How does it work

The above code uses the date format specifiers as follows :
'min' => 'i' ,
'hour' => 'G' ,
'day' => 'j' ,
'mon' => 'n' ,
'week' => 'w'

over the timestamp to extract the minute , hour , day , month and week of a timestamp

Then it checks the cron format by splitting it into parts like 0 , 5 , * , * , * and then tests each part for the corresponding value from timestamp.

 

效果:

crontab命令:

<span>1</span> * * * * * php /home/wwwroot/crontabs/cronjob.php
登入後複製

查看:

<span>1</span> crontab -l
登入後複製

编辑:

<span>1</span> crontab -e
登入後複製

参数:

<span> 1</span> <span>    5       *       *       *     *     ls             指定每小时的第5分钟执行一次ls命令
</span><span> 2</span> <span>    30     5       *        *     *     ls             指定每天的 5:30 执行ls命令
</span><span> 3</span> <span>    30     7       8        *     *     ls             指定每月8号的7:30分执行ls命令
</span><span> 4</span> <span>    30     5       8        6     *     ls             指定每年的6月8日5:30执行ls命令
</span><span> 5</span> <span>    30     6       *        *     0     ls             指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1, 以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]
</span><span> 6</span> <span>    30     3     10,20      *     *     ls     每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段]
</span><span> 7</span> <span>    25     8-11     *       *     *     ls       每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段]
</span><span> 8</span> <span>    */15   *       *        *     *     ls         每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]
</span><span> 9</span> <span>    30     6     */10       *     *     ls       每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls 命令。 ]
</span><span>10</span>     50     7       *        *     *     root     run-parts     /etc/cron.daily   每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件[ 注:run-parts参数表示,执行后面目录中的所有可执行文件。 ]
登入後複製

 

<span> 1</span> <span>$time</span> = <span>date</span>('YmdHi-s', <span>time</span><span>());
</span><span> 2</span> <span>$filename</span> = <span>$time</span> . '.txt'<span>;
</span><span> 3</span> <span>//</span><span>$fp = fopen("/home/wwwroot/crontabs/{$filename}", "w+"); //打开文件指针,创建文件
</span><span> 4</span> <span>//file_get_contents($fp,'sssss');</span>
<span> 5</span> <span>#</span><span>#####################################################################</span>
<span> 6</span> <span>$cronjobs</span> = <span>array</span><span>();
</span><span> 7</span> 
<span> 8</span> <span>$cronjobs</span>['database_backup'] = '*/2 * * * *'<span>;
</span><span> 9</span> <span>$cronjobs</span>['stttt'] = '*/3 * * * *'<span>;
</span><span>10</span> <span>$cronjobs</span>['monthly_sales_report'] = '0 5 1,15 * *'<span>;
</span><span>11</span> <span>$cronjobs</span>['purchase_report'] = '0 10 15 02 *'<span>;
</span><span>12</span> 
<span>13</span> 
<span>14</span> 
<span>15</span> 
<span>16</span> 
<span>17</span> <span>function</span><span> database_backup(){
</span><span>18</span>     <span>$r</span>=  <span>rand</span>(200, 9000<span>);
</span><span>19</span>     <span>$fp</span> = <span>fopen</span>("/home/wwwroot/crontabs/database_backup{<span>$r</span>}", "w+"); <span>//</span><span>打开文件指针,创建文件</span>
<span>20</span> <span>}
</span><span>21</span> <span>function</span><span> stttt(){
</span><span>22</span>     <span>$r</span>=  <span>rand</span>(200, 9000<span>);
</span><span>23</span>     <span>$fp</span> = <span>fopen</span>("/home/wwwroot/crontabs/stttt{<span>$r</span>}", "w+"); <span>//</span><span>打开文件指针,创建文件</span>
<span>24</span> }
登入後複製

【转载】PHP使用1个crontab管理多个crontab任务

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1246
24
在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP的持久相關性:它還活著嗎? PHP的持久相關性:它還活著嗎? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

See all articles