摘要:服務器定時任務服務器定時任務需要你是獨立的服務器,或者是,總之就是對系統(tǒng)的配置有足夠的權(quán)限,虛擬空間就不要折騰這個方法了,因為你沒有權(quán)限。
文章轉(zhuǎn)載自:問說網(wǎng) ? 詳解PHP設置定時任務的實現(xiàn)方法
地址:http://www.uedsc.com/php-timing-task.html
定時運行任務對于一個網(wǎng)站來說,是一個比較重要的任務,比如定時發(fā)布文檔,定時清理垃圾信息等,現(xiàn)在的網(wǎng)站大多數(shù)都是采用PHP動態(tài)語言開發(fā)的,而對于PHP的實現(xiàn)決定了它沒有Java和.Net這種AppServer的概念,而http協(xié)議是一個無狀態(tài)的協(xié)議,PHP只能被用戶觸發(fā),被調(diào)用,調(diào)用后會自動退出內(nèi)存,沒有常駐內(nèi)存。
如果非要PHP去設置定時任務, 可以有以下三個方法:
1、用戶觸發(fā)定時
通過掛載到網(wǎng)頁里面,判斷當前的時間,然后運行PHP代碼,缺點是每一次加載網(wǎng)頁,都需要加載這個PHP頁面,而對于人氣不旺的網(wǎng)站,這樣的延時可能會更加的嚴重,畢竟是用戶的HTTP請求去觸發(fā)這個PHP代碼的運行,Discuz!論壇程序是判斷在00:00之后,第一個用戶訪問請求去執(zhí)行定時的PHP代碼。
2、常駐內(nèi)存運行
PHP是可以常駐內(nèi)存運行程序的,下面的這段代碼,可以在當前文件夾下,生成一個test.txt,并每隔20秒,往里面寫入一個時間戳,無論客戶端是否關閉瀏覽器。
關鍵的兩個函數(shù)
ignore_user_abort(true),這個函數(shù)的作用是,無論客戶端是否關閉瀏覽器,下面的代碼都將得到執(zhí)行。
set_time_limit(0),這個函數(shù)的作用是,取消PHP文件的執(zhí)行時間,如果沒有這個函數(shù)的話,默認PHP的執(zhí)行時間是30秒,也就是說30秒后,這個文件就會從內(nèi)存中刪除。
另外usleep函數(shù)是在PHP5.0后的版本中加入的函數(shù),支持Windows操作系統(tǒng),設置代碼運行的時間,單位是毫秒(MS)。
如何停止定時
但是當我執(zhí)行腳本的時候,即使我關閉了瀏覽器,我根本就沒法去停止這段程序了,所以你需要一個執(zhí)行腳本的開關,你可以用外部文件引入的方法來實現(xiàn),在while循環(huán)的時候,include開關變量即可。那么就可以這樣實現(xiàn):
建立外部引入變量文件 switch.php 內(nèi)容如下:
這個腳本只是測試可行,具體效率應該不高,對于lamp,你完全可以使用crontab 來實現(xiàn)。
3、服務器定時任務
服務器定時任務需要你是獨立的服務器,或者是VPS,總之就是對系統(tǒng)的配置有足夠的權(quán)限,虛擬空間就不要折騰這個方法了,因為你沒有權(quán)限。
Windows平臺
在 Windows 平臺下您可以將cliphp.exe 和 .php 文件的雙擊屬性相關聯(lián),您也可以編寫一個批處理文件來用 PHP 執(zhí)行腳本。我們把寫好的程序放在一個目錄下如 E:webmail.php 。
然后寫一個windows批處理文件內(nèi)容如下:
@D:phpcliphp.exe E:webmail.php >d:phpclisendmail.log
Pause
那個 D:phpcliphp.exe 是我的PHP安裝文件所在目錄。Php.exe 就是windows PHP命令行模式的程序。
好的,我們保存這個文件為 mail.bat 然后的windows中的計劃任務中添加一個任務,讓操作系統(tǒng)在某個時間來運行這個批處理文件。
Unix平臺
如果您使用 Unix 系統(tǒng),您需要在您的 PHP 腳本的最前面加上一行特殊的代碼,使得它能夠被執(zhí)行,這樣系統(tǒng)就能知道用什么樣的程序要運行該腳本。為 Unix 系統(tǒng)增加的第一行代碼不會影響該腳本在 Windows 下的運行,因此您也可以用該方法編寫跨平臺的腳本程序。
在Crontab中使用PHP執(zhí)行腳本
就像在Crontab中調(diào)用普通的shell腳本一樣(具體Crontab用法),使用PHP程序來調(diào)用PHP腳本,每一小時執(zhí)行 myscript.php 如下:
# crontab -e 00 * * * * /usr/local/bin/php /home/john/myscript.php
/usr/local/bin/php為PHP程序的路徑。
在Crontab中使用URL執(zhí)行腳本
如果你的PHP腳本可以通過URL觸發(fā),你可以使用 lynx 或 curl 或 wget 來配置你的Crontab。
下面的例子是使用Lynx文本瀏覽器訪問URL來每小時執(zhí)行PHP腳本。Lynx文本瀏覽器默認使用對話方式打開URL。但是,像下面的,我們在lynx命令行中使用-dump選項來把URL的輸出轉(zhuǎn)換來標準輸出。
00 * * * * lynx -dump http://www.uedsc.net/myscript.php
下面的例子是使用 CURL 訪問URL來每5分執(zhí)行PHP腳本。Curl默認在標準輸出顯示輸出。使用 "curl -o" 選項,你也可以把腳本的輸出轉(zhuǎn)儲到臨時文件。
*/5 * * * * /usr/bin/curl -o temp.txt http://www.uedsc.net/myscript.php
下面的例子是使用WGET訪問URL來每10分執(zhí)行PHP腳本。-q 選項表示安靜模式。"-O temp.txt" 表示輸出會發(fā)送到臨時文件。
*/10 * * * * /usr/bin/wget -q -O temp.txt http://www.uedsc.net/myscript.php
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21302.html
摘要:本文,我們就來深入的解析幾種常見的定時任務的思路。借用第三方定時任務跳板很好玩的是,一些服務商提供了各種類型的定時任務,例如阿里云的提供了單獨的定時任務,你可以填寫自己應用下的某個。比如說,你可以在阿里云上建立一個每天凌晨點的定時 PHP本身是沒有定時功能的,PHP也不能多線程。PHP的定時任務功能必須通過和其他工具結(jié)合才能實現(xiàn),例如WordPress內(nèi)置了wp-cron的功能,很厲害...
摘要:高性能高精度定時服務,輕松管理千萬級定時任務。支持任務到期觸發(fā)和。支持創(chuàng)建延時任務和定時到期任務,和原生保持相同接口,輕松使用。不支持任務輸出任務鉤子及維護模式。是不指定任務名時自動生成,每個任務名必須唯一,相同任務名重復定義將會自動覆蓋。 Forsun高性能高精度定時服務,輕松管理千萬級定時任務。 定時服務項目地址:https://github.com/snower/forsun l...
摘要:為系統(tǒng)增加的第一行代碼不會影響該腳本在下的運行,因此您也可以用該方法編寫跨平臺的腳本程序。指定會話頁面在客戶端中的有限期分鐘缺省下為分鐘。最原始的博主沒有找到,只能在此聲明,特為轉(zhuǎn)載。 這幾天需要用PHP寫一個定時抓取網(wǎng)頁的服務器應用. 在網(wǎng)上搜了一下解決辦法, 發(fā)現(xiàn)OSchina的 一個問題的解答很精彩(值得一看,謝謝大牛們的精彩回答O(∩_∩)O~), 提出幾種解決辦法.現(xiàn)總結(jié)如下...
摘要:可變隊列會對長期沒有更新動態(tài)的那部分不活躍用戶進行減緩速度,減緩對他們微博的獲取頻率,同時加大對活躍用戶的獲取頻率。 注:本文為轉(zhuǎn)載,原文請查看star7th的個人博客。 一、什么是 HTQ 先介紹下基本概念。 我們在編寫程序時,偶爾會遇到需要用到異步隊列的情況。比如說,我發(fā)送一萬封郵件,如果單純使用一個for循環(huán)來發(fā)送,則執(zhí)行時間要很長,要等很久才能發(fā)完,同時很容易導致阻塞、超時等問...
閱讀 2215·2021-11-25 09:43
閱讀 1181·2021-11-23 09:51
閱讀 3514·2021-11-23 09:51
閱讀 3643·2021-11-22 09:34
閱讀 1576·2021-10-09 09:43
閱讀 2138·2019-08-30 15:53
閱讀 3173·2019-08-30 14:07
閱讀 582·2019-08-28 18:14