1. 程式人生 > >tp5.1 php計劃任務crontab

tp5.1 php計劃任務crontab

tp5.1中的php 計劃任務的實現,本質上可以分為兩種第一種封裝在框架內部,在crontab -e中只要新增一條,然後在框架內去擴充套件內容就好了(Laravel的schedule,任務排程),這種自由度比較高,也比較方便。第二種:建立好PHP的執行指令碼,在crontab中執行指令碼,或者再寫一個.sh 在crontab中執行,這種就需要在伺服器上去執行一些檔案,相對而言,比較麻煩,當然效果還是一樣的。

方法1.建立一個php指令碼,1.php,建立一個test.sh ,賦予許可權 chmod + x test.sh ,其中有個注意點 當時我去執行cd 命令的時候直接報錯了,後來原因找到了,是由於你寫*.sh的檔案 是在windows ,然後在上傳到liunx 伺服器. windows 的編碼格式是docs 而liunx 只能是unix. 解決辦法:1. vi  test.sh 檔案  2.通過  :set ff   你會發現該檔案的格式fomat=docs 3. 通過 :set ff=unix  然後  :x或:wq 儲存並退出。

#!/bin/bash
# cd /data/wwwroot/default
/usr/bin/php /data/wwwroot/default/1.php 

最後在crontab中,一分鐘執行一次,輸出到log中去,查驗效果就可以了。簡單自測的方法 直接在test.sh 所在目錄直接./test.sh或者是sh test.sh 就可以檢視指令碼執行結果了

*/1 * * * * sh /data/wwwroot/default/test.sh 2 >>/data/wwwroot/default/log.txt  

方法2.利用tp自帶的think自定義command 功能,在application/模組/新建一個command資料夾/Crontab.class.php,其中的class可以省略,假如在配置的app.php中關閉了class_suffix,修改檔名為Crontab.php

<?php
    namespace app\api\command; 
    use think\console\Command;
    use think\console\Input;
    use think\console\Output;
     
    class Crontab extends Command
    {
        protected function configure(){
            $this->setName('Crontab')->setDescription("計劃任務 Crontab");
        }
     
        protected function execute(Input $input, Output $output){
            $output->writeln('Date Crontab job start...');
            /*** 這裡寫計劃任務列表集 START ***/
     
            $this->test();
     
            /*** 這裡寫計劃任務列表集 END ***/
            $output->writeln('Date Crontab job end...');
        }
     
        private function test(){
            echo "test\r\n";
        }
    }

配置command.php檔案,位置在application/command.php

return ['app\api\command\Crontab'];

開啟命令列,執行php think Test命令test命令execute方法中執行的方法就會執行。剩下來的就是寫一個Crontab.sh來執行,注意格式

#!/bin/bash
cd /data/wwwroot/default/purenfort-api
/usr/bin/php think Crontab

最後在crontab中,一分鐘執行一次,輸出到log中去,查驗效果就可以了簡單自測的方法直接在Crontab.sh所在目錄直接 ./Crontab.sh或者是sh Crontab.sh 就可以檢視指令碼執行結果了 。注意php在shell指令碼中要寫全路徑,注意.sh指令碼許可權、編碼格式問題。其他就沒啥了。