日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

php任务分配思路_PHP执行定时任务的几种方法思路

發(fā)布時(shí)間:2025/3/12 php 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php任务分配思路_PHP执行定时任务的几种方法思路 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

PHP本身是沒有定時(shí)功能的,PHP也不能多線程。PHP的定時(shí)任務(wù)功能必須通過和其他工具結(jié)合才能實(shí)現(xiàn),例如WordPress內(nèi)置了wp-cron的功能,很厲害。本文,我們就來深入的解析幾種常見的php定時(shí)任務(wù)的思路。

1、Linux服務(wù)器上使用CronTab定時(shí)執(zhí)行php

我們先從相對比較復(fù)雜的服務(wù)器執(zhí)行php談起。服務(wù)器上安裝了php,就可以執(zhí)行php文件,無論是否安裝了nginx或Apache這樣的服務(wù)器環(huán)境軟件。而Linux中,使用命令行,用CronTab來定時(shí)任務(wù),又是絕佳的選擇,而且也是效率最高的選擇。

首先,進(jìn)入命令行模式。作為服務(wù)器的linux一般都默認(rèn)進(jìn)入命令行模式的,當(dāng)然,我們管理服務(wù)器也一般通過putty等工具遠(yuǎn)程連接到服務(wù)器,為了方便,我們用root用戶登錄。在命令行中鍵入:crontab -e

之后就會打開一個(gè)文件,并且是非編輯狀態(tài),則是vi的編輯界面,通過敲鍵盤上的i,進(jìn)入編輯模式,就可以編輯內(nèi)容。這個(gè)文件中的每一行就是一個(gè)定時(shí)任務(wù),我們新建一行,就是新建一條定時(shí)任務(wù)(當(dāng)然是指這一行內(nèi)按照一定的格式進(jìn)行書寫)。我們現(xiàn)在來舉個(gè)例子,增加一行,內(nèi)容如下:00 * * * * lynx -dump https://www.yourdomain.com/script.php

這是什么意思呢?實(shí)際上上面這一行由兩部分組成,前面一部分是時(shí)間,后面一部分是操作內(nèi)容。例如上面這個(gè),00 * * * *

就是指當(dāng)當(dāng)前時(shí)間的分鐘數(shù)為00時(shí),執(zhí)行該定時(shí)任務(wù)。時(shí)間部分由5個(gè)時(shí)間參數(shù)組成,分別是:分 時(shí) 日 月 周

第1列表示分鐘1~59 每分鐘用或者 */1表示,/n表示每n分鐘,例如*/8就是每8分鐘的意思,下面也是類推

第2列表示小時(shí)1~23(0表示0點(diǎn))

第3列表示日期1~31第4列表示月份1~12第5列標(biāo)識號星期0~6(0表示星期天)

整個(gè)句子的后面部分就是操作的具體內(nèi)容。lynx -dump https://www.yourdomain.com/script.php

意思就是說通過lynx訪問這個(gè)url。我們在使用中主要用到lynx、curl、wget來實(shí)現(xiàn)對url的遠(yuǎn)程訪問,而如果要提高效率,直接用php去執(zhí)行本地php文件是最佳選擇,例如:00 */2 * * * /usr/local/bin/php /home/www/script.php

這條語句就可以在每2小時(shí)的0分鐘,通過linux內(nèi)部php環(huán)境執(zhí)行script.php,注意,這里可不是通過url訪問,通過服務(wù)器環(huán)境來執(zhí)行哦,而是直接執(zhí)行,因?yàn)槔@過了服務(wù)器環(huán)境,所以效率當(dāng)然要高很多。

好了,已經(jīng)添加了幾條需要的定時(shí)任務(wù)了吧。點(diǎn)擊鍵盤上的Esc鍵,輸入“:wq”回車,這樣就保存了設(shè)置的定時(shí)任務(wù),屏幕上也能看到提示創(chuàng)建了新的定時(shí)任務(wù)。接下來就是好好寫你的script.php了。

關(guān)于CronTab的更多用法這里就不介紹了,如果你想更靈活的使用這個(gè)定時(shí)任務(wù)功能,應(yīng)該自己再去深入學(xué)習(xí)一下crontab。

2、Windows服務(wù)器上使用bat定時(shí)執(zhí)行php

windows上和linux上有一個(gè)類似的cmd和bat文件,bat文件類似于shell文件,執(zhí)行這個(gè)bat文件,就相當(dāng)于依次執(zhí)行里面的命令(當(dāng)然,還可以通過邏輯來實(shí)現(xiàn)編程),所以,我們可以利用bat命令文件在windows服務(wù)器上面實(shí)現(xiàn)PHP定時(shí)任務(wù)。實(shí)際上在windows上定時(shí)任務(wù),和linux上道理是一樣的,只不過方法和途徑不同。好了下面開始。

首先,在一個(gè)你覺得比較適當(dāng)?shù)奈恢脛?chuàng)建一個(gè)cron.bat文件,然后用文本編輯器打開它(記事本都可以),在里面寫上這樣的內(nèi)容:D:\php\php.exe -q D:\website\test.php

這句話的意思就是,使用php.exe去執(zhí)行test.php這個(gè)php文件,和上面的contab一樣,繞過了服務(wù)器環(huán)境,執(zhí)行效率也比較高。寫好之后,點(diǎn)擊保存,關(guān)閉編輯器。

接下來就是設(shè)置定時(shí)任務(wù)來運(yùn)行cron.bat。依次打開:“開始–>控制面板–>任務(wù)計(jì)劃–>添加任務(wù)計(jì)劃”,在打開的界面中設(shè)置定時(shí)任務(wù)的時(shí)間、密碼,通過選擇,把cron.bat掛載進(jìn)去。確定,這樣一個(gè)定時(shí)任務(wù)就建立好了,在這個(gè)定時(shí)任務(wù)上右鍵,運(yùn)行,這個(gè)定時(shí)任務(wù)就開始執(zhí)行了,到點(diǎn)時(shí),就會運(yùn)行cron.bat處理,cron.bat再去執(zhí)行php。

3、非自有服務(wù)器(虛擬主機(jī))上實(shí)現(xiàn)php定時(shí)任務(wù)

如果站長沒有自己的服務(wù)器,而是租用虛擬主機(jī),就無法進(jìn)入服務(wù)器系統(tǒng)進(jìn)行上述操作。這個(gè)時(shí)候應(yīng)該如何進(jìn)行php定時(shí)任務(wù)呢?其實(shí)方法又有多個(gè)。

4、使用ignore_user_abort(true)和sleep死循環(huán)

在一個(gè)php文檔的開頭直接來一句:ignore_user_abort(true);

這時(shí),通過url訪問這個(gè)php的時(shí)候,即使用戶把瀏覽器關(guān)掉(斷開連接),php也會在服務(wù)器上繼續(xù)執(zhí)行。利用這個(gè)特性,我們可以實(shí)現(xiàn)非常牛的功能,也就是通過它來實(shí)現(xiàn)定時(shí)任務(wù)的激活,激活之后就隨便它自己怎么辦了,實(shí)際上就有點(diǎn)類似于后臺任務(wù)。

而sleep(n)則是指當(dāng)程序執(zhí)行到這里時(shí),暫時(shí)不往下執(zhí)行,而是休息n秒鐘。如果你訪問這個(gè)php,就會發(fā)現(xiàn)頁面起碼要加載n秒鐘。實(shí)際上,這種長時(shí)間等待的行為是比較消耗資源的,不能大量使用。

那么定時(shí)任務(wù)到底怎么實(shí)現(xiàn)呢?使用下面的代碼即可實(shí)現(xiàn):<?php

ignore_user_abort(true);

set_time_limit(0);

date_default_timezone_set('PRC'); // 切換到中國的時(shí)間$run_time = strtotime('+1 day'); // 定時(shí)任務(wù)第一次執(zhí)行的時(shí)間是明天的這個(gè)時(shí)候$interval = 3600*12; // 每12個(gè)小時(shí)執(zhí)行一次if(!file_exists(dirname(__FILE__).'/cron-run')) exit(); // 在目錄下存放一個(gè)cron-run文件,如果這個(gè)文件不存在,說明已經(jīng)在執(zhí)行過程中了,該任務(wù)就不能再激活,執(zhí)行第二次,否則這個(gè)文件被多次訪問的話,服務(wù)器就要崩潰掉了do { if(!file_exists(dirname(__FILE__).'/cron-switch')) break; // 如果不存在cron-switch這個(gè)文件,就停止執(zhí)行,這是一個(gè)開關(guān)的作用 $gmt_time = microtime(true); // 當(dāng)前的運(yùn)行時(shí)間,精確到0.0001秒 $loop = isset($loop) && $loop ? $loop : $run_time - $gmt_time; // 這里處理是為了確定還要等多久才開始第一次執(zhí)行任務(wù),$loop就是要等多久才執(zhí)行的時(shí)間間隔 $loop = $loop > 0 ? $loop : 0; if(!$loop) break; // 如果循環(huán)的間隔為零,則停止

sleep($loop);

// ... // 執(zhí)行某些代碼 // ...

@unlink(dirname(__FILE__).'/cron-run'); // 這里就是通過刪除cron-run來告訴程序,這個(gè)定時(shí)任務(wù)已經(jīng)在執(zhí)行過程中,不能再執(zhí)行一個(gè)新的同樣的任務(wù) $loop = $interval;

} while(true);

通過執(zhí)行上面這段php代碼,即可實(shí)現(xiàn)定時(shí)任務(wù),直到你刪除cron-switch文件,這個(gè)任務(wù)才會停止。

但是有一個(gè)問題,也就是如果用戶直接訪問這個(gè)php,實(shí)際上沒有任何作用,頁面也會停在這個(gè)地方,一直處于加載狀態(tài),有沒有一種辦法可以消除這種影響呢?fsockopen幫我們解決了這個(gè)問題。

fsockopen可以實(shí)現(xiàn)在請求訪問某個(gè)文件時(shí),不必獲得返回結(jié)果就繼續(xù)往下執(zhí)行程序,這是和curl通常用法不一樣的地方,我們在使用curl訪問網(wǎng)頁時(shí),一定要等curl加載完網(wǎng)頁后,才會執(zhí)行curl后面的代碼,雖然實(shí)際上curl也可以實(shí)現(xiàn)“非阻塞式”的請求,但是比fsockopen復(fù)雜的多,所以我們優(yōu)先選擇fsockopen,fsockopen可以在規(guī)定的時(shí)間內(nèi),比如1秒鐘以內(nèi),完成對訪問路徑發(fā)出請求,完成之后就不管這個(gè)路徑是否返回內(nèi)容了,它的任務(wù)就到這里結(jié)束,可以繼續(xù)往下執(zhí)行程序了。利用這個(gè)特性,我們在正常的程序流中加入fsockopen,對上面我們創(chuàng)建的這個(gè)定時(shí)任務(wù)php的地址發(fā)出請求,即可讓定時(shí)任務(wù)在后臺執(zhí)行。如果上面這個(gè)php的url地址是www.yourdomain.com/script.php,那么我們在編程中,可以這樣:// ...// 正常的php執(zhí)行程序// ..// 遠(yuǎn)程請求(不獲取內(nèi)容)函數(shù),下面可以反復(fù)使用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);//設(shè)置超時(shí)

$header = "GET $path HTTP/1.1\r\n";

$header.="Host: $host\r\n";

$header.="Connection: close\r\n\r\n";//長連接關(guān)閉

fwrite($fp, $header);

usleep(1000); // 這一句也是關(guān)鍵,如果沒有這延時(shí),可能在nginx服務(wù)器上就無法執(zhí)行成功

fclose($fp); return array('error_code' => 0);

}

}

_sock('www.yourdomain.com/script.php');// ...// 繼續(xù)執(zhí)行其他動作// ..

把這段代碼加入到某個(gè)定時(shí)任務(wù)提交結(jié)果程序中,在設(shè)置好時(shí)間后,提交,然后執(zhí)行上面這個(gè)代碼,就可以激活該定時(shí)任務(wù),而且對于提交的這個(gè)用戶而言,沒有任何頁面上的堵塞感。

5、借用用戶的訪問行為來執(zhí)行某些延遲任務(wù)

但是上面使用sleep來實(shí)現(xiàn)定時(shí)任務(wù),是效率很低的一種方案。我們希望不要使用這種方式來執(zhí)行,這樣的話就可以解決效率問題。我們借用用戶訪問行為來執(zhí)行任務(wù)。用戶對網(wǎng)站的訪問其實(shí)是一個(gè)非常豐富的行為資源,包括搜索引擎蜘蛛對網(wǎng)站的訪問,都可以算作這個(gè)類型。在用戶訪問網(wǎng)站時(shí),內(nèi)部加一個(gè)動作,去檢查任務(wù)列表中是否存在沒有被執(zhí)行的任務(wù),如果存在,就將這個(gè)任務(wù)執(zhí)行。對于用戶而言,利用上面所說的fsockopen,根本感覺不到自己的訪問竟然還做出了這樣的貢獻(xiàn)。但是這種訪問的缺點(diǎn)就是訪問很不規(guī)律,比如你希望在凌晨2點(diǎn)執(zhí)行某項(xiàng)任務(wù),但是這個(gè)時(shí)間段非常倒霉,沒有用戶或任何行為到達(dá)你的網(wǎng)站,直到早上6點(diǎn)才有一個(gè)新訪問。這就導(dǎo)致你原本打算2點(diǎn)執(zhí)行的任務(wù),到6點(diǎn)才被執(zhí)行。

這里涉及到一個(gè)定時(shí)任務(wù)列表,也就是說你需要有一個(gè)列表來記錄所有任務(wù)的時(shí)間、執(zhí)行什么內(nèi)容。一般來說,很多系統(tǒng)會采用數(shù)據(jù)庫來記錄這些任務(wù)列表,比如wordpress就是這樣做的。我則利用文件讀寫特性,提供了托管在github上的開源項(xiàng)目php-cron,你可以去看看。總之,如果你想要管理多個(gè)定時(shí)任務(wù),靠上面的單個(gè)php是無法合理布局的,必須想辦法構(gòu)建一個(gè)schedules列表。由于這里面的邏輯比較復(fù)雜,就不再詳細(xì)闡述,我們僅停留在思路層面上。

6、借用第三方定時(shí)任務(wù)跳板

很好玩的是,一些服務(wù)商提供了各種類型的定時(shí)任務(wù),例如阿里云的ACE提供了單獨(dú)的定時(shí)任務(wù),你可以填寫自己應(yīng)用下的某個(gè)uri。百度云BCE提供了服務(wù)器監(jiān)測功能,每天會按照一定的時(shí)間規(guī)律訪問應(yīng)用下的固定uri。類似的第三方平臺上還有很多定時(shí)任務(wù)可以用。你完全可以用這些第三方定時(shí)任務(wù)作為跳板,為你的網(wǎng)站定時(shí)任務(wù)服務(wù)。比如說,你可以在阿里云ACE上建立一個(gè)每天凌晨2點(diǎn)的定時(shí)任務(wù),執(zhí)行的uri是/cron.php。然后你創(chuàng)建一個(gè)cron.php,里面則采用fsockopen去訪問你真正要執(zhí)行某些任務(wù)的網(wǎng)站的url,例如上面的www.yourdomain.com/script.php,而且在cron.php中還可以訪問多個(gè)url。然后把cron.php上傳到你的ACE上面去,讓ACE的定時(shí)任務(wù)去訪問/cron.php,然后讓cron.php去遠(yuǎn)程請求目標(biāo)網(wǎng)站的定時(shí)任務(wù)腳本。

7、循環(huán)利用include包含文件(待驗(yàn)證)

php面向過程的特性使得其程序是從上往下執(zhí)行的,利用這個(gè)特性,在我們使用include某個(gè)文件時(shí),就會執(zhí)行被引入的文件,知道include的文件內(nèi)程序執(zhí)行完之后,再往下執(zhí)行。如果我們創(chuàng)建一個(gè)循環(huán),再利用sleep,不斷的include某個(gè)文件,使循環(huán)執(zhí)行某段程序,則可以達(dá)到定時(shí)執(zhí)行的目的。我們再進(jìn)一步,并不是利用while(true)來實(shí)現(xiàn)循環(huán),而是利用被include文件本身再include自身來實(shí)現(xiàn)循環(huán),比如我們創(chuàng)建一個(gè)do.php,它的內(nèi)容如下:if(...) exit(); // 通過某個(gè)開關(guān)來關(guān)閉執(zhí)行// ...

// 執(zhí)行某些程序// ...

sleep($loop); // 這個(gè)$loop在include('do.php');之前賦值

include(dirname(__FILE__).'/do.php');

其實(shí)通過這種方法執(zhí)行和while的思路也像。而且同樣用到sleep,效率低。

PHP定時(shí)任務(wù)是一個(gè)非常有意思的東西,雖然說實(shí)話,用系統(tǒng)的php.exe去直接執(zhí)行php文件的效率更高,但是對于很多普通站長而言,虛擬主機(jī)是無法做到直接php執(zhí)行原生程序的。本文僅提供一些解決的思路,我也僅僅是在學(xué)習(xí)中,有很多問題或表述都不正確,希望你指出來;你可以通過本文的思路,開發(fā)出自己的一種解決方案,希望你能將方案發(fā)布,并與我一起探討。

相關(guān)推薦:

總結(jié)

以上是生活随笔為你收集整理的php任务分配思路_PHP执行定时任务的几种方法思路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久午夜影院 | 国产性xxxx高清 | 日韩少妇毛片 | 黄色的毛片 | 成人一区二区三区四区 | 视频福利在线 | www.毛片.com| 在线观看免费高清视频 | 成人亚洲天堂 | 国产精品一 | 强伦人妻一区二区三区 | 色综合久久久无码中文字幕波多 | 日韩美女视频一区 | 九九久久视频 | 天天插插| 激情福利视频 | julia一区| 免费在线黄色av | 午夜资源站 | 国产中文字幕乱人伦在线观看 | 蜜臀久久99精品久久久久宅男 | 奇米精品一区二区三区四区 | 一区二区日韩电影 | 懂色一区二区 | 五月天婷婷色 | 人人人爽 | 日本激情视频一区二区三区 | 手机看片福利一区 | 久久人人干 | 欧美操女人 | 青青视频免费观看 | 麻豆精品国产精华精华液好用吗 | 日本理论片午伦夜理片在线观看 | 亚洲AV成人无码一二三区在线 | 超碰在线视屏 | 国产伦精品一区二区三区在线观看 | 播播成人网 | 免费在线黄色网址 | 中文字幕精品久久久久人妻红杏ⅰ | 91国产丝袜在线播放 | 日韩成人在线视频观看 | 欧美极品少妇xxxxⅹ猛交 | 最新日韩中文字幕 | 福利社区一区二区 | 色小姐综合网 | 久久激情av | 毛片最新网址 | 欧美日本一区二区 | 免费一区 | 韩国女主播一区 | 日韩免费av在线 | 国产剧情av麻豆香蕉精品 | 三级黄色在线播放 | 亚洲高清久久久 | 天天操天天舔天天干 | 国产精品丝袜在线观看 | 大吊一区二区三区 | 丰满人妻一区二区三区大胸 | 奇米四色网 | 久久中文字幕无码 | 亚洲欧洲久久久 | 波多野一区二区三区 | 国产精品久久久久影院色老大 | 国产精品爽爽久久久久久 | 在线观看国产一区二区 | 丁香婷婷久久 | 日韩无码专区 | 超碰在线网址 | 午夜精品久久久久久久久久久 | 黄色a网站| 国产毛片久久久 | 成人欧美一区二区三区黑人动态图 | 奴性女会所调教 | 国产亚洲一区二区三区四区 | 久色福利 | 欧美日韩四区 | 秋霞在线视频 | 狠狠摸狠狠操 | 国产精品国产三级国产播12软件 | 亚洲影视一区二区 | av黄色免费网站 | 邻居少妇张开腿让我爽了在线观看 | 日韩性xxxx | 黑人干亚洲女 | 91久久国产综合久久 | 欧美专区一区 | 久久精工是国产品牌吗 | 999视频 | 小泽玛丽亚在线观看 | 中国一级大黄大黄大色毛片 | 黄色片亚洲 | 精品国产乱码久久久久久久软件 | 日韩一区二区三区四区五区六区 | 成人av一区二区三区 | 国产成人黄色 | 欧美99热| 美女扒开尿口让男人桶 | 久综合网 | 黄色永久网站 |