<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                **一. 簡單直接不顧后果型** **缺點:** 啟動之后,便無法控制, 除非終止 PHP 宿主. 不要采用這樣方法, 除非你是黑客. ``` <?php ignore_user_abort();//關掉瀏覽器,PHP腳本也可以繼續執行. set_time_limit(0);// 通過set_time_limit(0)可以讓程序無限制的執行下去 ini_set('memory_limit','512M'); // 設置內存限制 $interval=60*30;// 每隔半小時運行 do{ //ToDo sleep($interval);// 等待5分鐘 } while(true); ``` **二. 簡單可控型** 通過 改變config.php 的`return 0`, 來實現停止程序. 一個可行的辦法是config.php文件和某個特殊表單交互, 通過HTML頁面設置一些變量來進行配置 **缺點:** 占系統資源, 長時間運行,會有一些意想不到的隱患。比如內存管理方面的問題 . ``` config.php <?php return 1; ?> cron.php ignore_user_abort();//關掉瀏覽器,PHP腳本也可以繼續執行. set_time_limit(0);// 通過set_time_limit(0)可以讓程序無限制的執行下去 $interval=60*30;// 每隔半小時運行 do{ $run = include 'config.php'; if(!$run) die('process abort'); //ToDo sleep($interval);// 等待5分鐘 } while(true); ``` **三. 簡單改進型** php腳本sleep 一段時間之后通過訪問自身的方式繼續執行. 就好像接力賽跑一樣..這樣就能保證每個PHP腳本執行時間不會太長. 也就不受`time_out`的限制了. 因為每一次一次循環php文件都是獨立執行,所以這種方法,避免了`time_out`的限制. 但是最好和上邊一樣 加上控制代碼. cofig.php , 以便能夠終止進程 ``` <?php $time=15; $url="http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; /* function */ sleep($time); file_get_contents($url); ?> ``` ## **四. 服務器定時任務** **、在Linux的Crontab中使用PHP執行腳本** 就像在Crontab中調用普通的shell腳本一樣(具體Crontab用法),使用PHP程序來調用PHP腳本,每一小時執行 myscript.php 如下: ``` # crontab -e 00 * * * * /usr/local/bin/php /home/john/myscript.php ``` `/usr/local/bin/php`為PHP程序(相當于window的exe路徑)的路徑。 **2、在Crontab中使用URL執行腳本** 如果你的PHP腳本可以通過URL觸發,你可以使用 lynx 或 curl 或 wget 來配置你的Crontab。 下面的例子是使用Lynx文本瀏覽器訪問URL來每小時執行PHP腳本。Lynx文本瀏覽器默認使用對話方式打開URL。但是,像下面的,我們在lynx命令行中使用-dump選項來把URL的輸出轉換來標準輸出。 ``` 00 * * * * lynx -dump http://www.sf.net/myscript.php ``` 下面的例子是使用 CURL 訪問URL來每5分執行PHP腳本。Curl默認在標準輸出顯示輸出。使用 "curl -o" 選項,你也可以把腳本的輸出轉儲到臨時文件temp.txt。 ``` */5 * * * * /usr/bin/curl -o temp.txt http://www.sf.net/myscript.php ``` 下面的例子是使用WGET訪問URL來每10分執行PHP腳本。-q 選項表示安靜模式。"-O temp.txt" 表示輸出會發送到臨時文件。 ``` */10 * * * * /usr/bin/wget -q -O temp.txt http://www.sf.net/myscript.php ``` ## Windows服務器上使用bat定時執行php 首先,在一個你覺得比較適當的位置創建一個cron.bat文件,然后用文本編輯器打開它(記事本都可以),在里面寫上這樣的內容: ``` D:\php\php.exe -q D:\website\test.php ``` 接下來就是設置定時任務來運行cron.bat。依次打開:“開始–>控制面板–>任務計劃–>添加任務計劃”,在打開的界面中設置定時任務的時間、密碼,通過選擇,把cron.bat掛載進去。確定,這樣一個定時任務就建立好了,在這個定時任務上右鍵,運行,這個定時任務就開始執行了,到點時,就會運行cron.bat處理,cron.bat再去執行php。 ## 非自有服務器(虛擬主機)上實現php定時任務 在一個php文檔的開頭加上`ignore_user_abort(true);` 通過url訪問這個php的時候,即使用戶把瀏覽器關掉(斷開連接),php也會在服務器上繼續執行 ``` <?php ignore_user_abort(true); set_time_limit(0); date_default_timezone_set('PRC'); // 切換到中國的時間 $run_time = strtotime('+1 day'); // 定時任務第一次執行的時間是明天的這個時候 $interval = 3600*12; // 每12個小時執行一次 if(!file_exists(dirname(__FILE__).'/cron-run')) exit(); // 在目錄下存放一個cron-run文件,如果這個文件不存在,說明已經在執行過程中了,該任務就不能再激活,執行第二次,否則這個文件被多次訪問的話,服務器就要崩潰掉了 do { if(!file_exists(dirname(__FILE__).'/cron-switch')) break; // 如果不存在cron-switch這個文件,就停止執行,這是一個開關的作用 $gmt_time = microtime(true); // 當前的運行時間,精確到0.0001秒 $loop = isset($loop) && $loop ? $loop : $run_time - $gmt_time; // 這里處理是為了確定還要等多久才開始第一次執行任務,$loop就是要等多久才執行的時間間隔 $loop = $loop > 0 ? $loop : 0; if(!$loop) break; // 如果循環的間隔為零,則停止 sleep($loop); // ... // 執行某些代碼 // ... @unlink(dirname(__FILE__).'/cron-run'); // 這里就是通過刪除cron-run來告訴程序,這個定時任務已經在執行過程中,不能再執行一個新的同樣的任務 $loop = $interval; } while(true); ``` 通過執行上面這段php代碼,即可實現定時任務,直到你刪除cron-switch文件,這個任務才會停止。 但是有一個問題,也就是如果用戶直接訪問這個php,實際上沒有任何作用,頁面也會停在這個地方,一直處于加載狀態,有沒有一種辦法可以消除這種影響呢?fsockopen幫我們解決了這個問題。 fsockopen可以實現在請求訪問某個文件時,不必獲得返回結果就繼續往下執行程序,這是和curl通常用法不一樣的地方,我們在使用curl訪問網頁時,一定要等curl加載完網頁后,才會執行curl后面的代碼,雖然實際上curl也可以實現“非阻塞式”的請求,但是比fsockopen復雜的多,所以我們優先選擇fsockopen,fsockopen可以在規定的時間內,比如1秒鐘以內,完成對訪問路徑發出請求,完成之后就不管這個路徑是否返回內容了,它的任務就到這里結束,可以繼續往下執行程序了。利用這個特性,我們在正常的程序流中加入fsockopen,對上面我們創建的這個定時任務php的地址發出請求,即可讓定時任務在后臺執行。如果上面這個php的url地址是www.yourdomain.com/script.php,那么我們在編程中,可以這樣: ``` // ... // 正常的php執行程序 // .. // 遠程請求(不獲取內容)函數,下面可以反復使用 function _sock($url) { $host = parse_url($url,PHP_URL_HOST); $port = parse_url($url,PHP_URL_PORT); $port = $port ? $port : 80; $scheme = parse_url($url,PHP_URL_SCHEME); $path = parse_url($url,PHP_URL_PATH); $query = parse_url($url,PHP_URL_QUERY); if($query) $path .= '?'.$query; if($scheme == 'https') { $host = 'ssl://'.$host; } $fp = fsockopen($host,$port,$error_code,$error_msg,1); if(!$fp) { return array('error_code' => $error_code,'error_msg' => $error_msg); } else { stream_set_blocking($fp,true);//開啟了手冊上說的非阻塞模式 stream_set_timeout($fp,1);//設置超時 $header = "GET $path HTTP/1.1\r\n"; $header.="Host: $host\r\n"; $header.="Connection: close\r\n\r\n";//長連接關閉 fwrite($fp, $header); usleep(1000); // 這一句也是關鍵,如果沒有這延時,可能在nginx服務器上就無法執行成功 fclose($fp); return array('error_code' => 0); } } _sock('www.yourdomain.com/script.php'); // ... // 繼續執行其他動作 // .. ``` 把這段代碼加入到某個定時任務提交結果程序中,在設置好時間后,提交,然后執行上面這個代碼,就可以激活該定時任務,而且對于提交的這個用戶而言,沒有任何頁面上的堵塞感。 ## 借用用戶的訪問行為來執行某些延遲任務 但是上面使用sleep來實現定時任務,是效率很低的一種方案。我們希望不要使用這種方式來執行,這樣的話就可以解決效率問題。我們借用用戶訪問行為來執行任務。用戶對網站的訪問其實是一個非常豐富的行為資源,包括搜索引擎蜘蛛對網站的訪問,都可以算作這個類型。在用戶訪問網站時,內部加一個動作,去檢查任務列表中是否存在沒有被執行的任務,如果存在,就將這個任務執行。對于用戶而言,利用上面所說的fsockopen,根本感覺不到自己的訪問竟然還做出了這樣的貢獻。但是這種訪問的缺點就是訪問很不規律,比如你希望在凌晨2點執行某項任務,但是這個時間段非常倒霉,沒有用戶或任何行為到達你的網站,直到早上6點才有一個新訪問。這就導致你原本打算2點執行的任務,到6點才被執行。 這里涉及到一個定時任務列表,也就是說你需要有一個列表來記錄所有任務的時間、執行什么內容。一般來說,很多系統會采用數據庫來記錄這些任務列表,比如wordpress就是這樣做的。我則利用文件讀寫特性,提供了托管在github上的開源項目[php-cron](https://github.com/tangshuang/php-cron),你可以去看看。總之,如果你想要管理多個定時任務,靠上面的單個php是無法合理布局的,必須想辦法構建一個schedules列表。由于這里面的邏輯比較復雜,就不再詳細闡述,我們僅停留在思路層面上。 ## 借用第三方定時任務跳板 很好玩的是,一些服務商提供了各種類型的定時任務,例如阿里云的ACE提供了單獨的定時任務,你可以填寫自己應用下的某個uri。百度云BCE提供了服務器監測功能,每天會按照一定的時間規律訪問應用下的固定uri。類似的第三方平臺上還有很多定時任務可以用。你完全可以用這些第三方定時任務作為跳板,為你的網站定時任務服務。比如說,你可以在阿里云ACE上建立一個每天凌晨2點的定時任務,執行的uri是/cron.php。然后你創建一個cron.php,里面則采用fsockopen去訪問你真正要執行某些任務的網站的url,例如上面的www.yourdomain.com/script.php,而且在cron.php中還可以訪問多個url。然后把cron.php上傳到你的ACE上面去,讓ACE的定時任務去訪問/cron.php,然后讓cron.php去遠程請求目標網站的定時任務腳本。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看