當前位置:首頁 » 編程語言 » php任務隊列

php任務隊列

發布時間: 2022-07-08 18:34:04

『壹』 php隊列計劃任務怎麼做呢,用的是ignore

回答你第一個問題:其實文件名稱不要改成html還是php但是,這瀏覽器中確實可以輸入html來執行php文件有一個方法就是對伺服器進行設置,也就是常說的偽靜態比如:RewriteRule (\d+).html$ /index.php?id=$1這樣,所有名稱為數字的html請求,都會執行index.php文件,並提供參數id,值就是那個htm的文件名換句話說,這瀏覽器中訪問 123.html 其實訪問的url是 index.php?id=123 至於優點缺點,其實也沒什麼,只是偽裝成html,一個是網址更好記,一個是對於搜索引擎來說,有益於優化至於模板的問題,不做評論,自己體會!詳細的話樓主還是去後盾人自學一下吧

『貳』 php怎麼把各種任務做成多個任務隊列,每3秒任務執行程序輪一次,分別按順序從各隊列里提取一個任務來執行

可以使用數組模擬隊列,給定多個數組,然後將任務放入各個數組中,每次循環遍歷數組,從數組中獲取任務,然後調度執行。

對於每3秒執行一次,可以使用定時器。或者寫一個死循環,循環裡面執行一次程序,然後睡眠3秒,這樣就可以簡單實現每隔3秒的任務循環調度。

『叄』 PHP使用Beanstalkd做任務隊列,是不是代表需要有一個PHP常駐進程

不是必須,你可以用Beanstalkd支持的任何語言

這里有一份Client Libraries清單:https://github.com/kr/beanstalkd/wiki/client-libraries

『肆』 請教PHP+Redis實現任務隊列的思路

// 創建請求ID標志, uniqid 無法保證唯一, 自己去搜索生成唯一的方法
$uuid = uniqid();
$tsk_name = "mytask";
$time_out = 30000; // 超時策略: 30秒
$time_start = time();
$redis->rPush($tsk_name, $uuid); // 右(後)插入隊列

// 堵塞等待隊列中第一個和$uuid匹配的(到我了)
while($uuid != $redis->lGet($tsk_name, 0)){
if((time()-$time_start)> $time_out) {
break; // 超時跳出(某些原因隊列異常了, 可能永遠取不到)
}
usleep(10); // sleep 10ms, 再次嘗試
}

// 這里執行任務的處理代碼....

// $response 已拼裝好要返回的內容
// 處理完成後(資料庫等已入庫更新), 需要:
if($redis->lGet($tsk_name, 0) == $uuid){ // 再次確認第一個是本請求
$redis->lPop($tsk_name); // 完成任務了, 從隊列中移除
}else{
// 出現這種情況, 是因為超時了, 或前面的$uuid沒有被消費
// 若不清除, 後續的請求, 都將無法正常進入隊列執行
// 取隊列中的所有$uuid
$queues = $redis->lRange($tsk_name, 0, -1);
foreach($queues as $i=>$uid){
if($uid==$uuid){

『伍』 PHP-php 怎麼實現消息隊列

消息隊列
消息隊列是線程間通訊的手段:

import java.util.*

public class MsgQueue{

private Vector queue = null;
public MsgQueue(){
queue = new Vector();
}
public synchronized void send(Object o)
{
queue.addElement(o);
}
public synchronized Object recv()
{
if(queue.size()==0)
return null;
Object o = queue.firstElement();
queue.removeElementAt(0);//or queue[0] = null can also work
return o;
}
}

因為java中是locked by object的所以添加synchronized 就可以用於線程同步鎖定對象
可以作為多線程處理多任務的存放task的隊列。他的client包括封裝好的task類以及thread類

『陸』 PHP隊列執行任務的時候,如何防止進程之間搶奪資源

實際上有一個非常簡單的辦法,你可以利用資料庫操作的原子性來實現,不需要那麼復雜的鎖機制,甚至隊列。就按你的方法來,假設任務數據表 task 里有兩個欄位 id, status,我們定義status三個狀態
0: 待處理1: 正在處理2: 處理完成

假設你有一堆 PHP 進程都用如下 SQL 語句去取出資料庫里的待處理任務
SELECT * FROM task WHERE status = 0

取出來以後,我們為了防止其他用戶不再重復取出要把它的狀態標記為 1
UPDATE task SET status = 1 WHERE id = xxx

但是等等,這樣就會產生如你所說的資源搶奪,但如果加上一個簡單的技巧就可以避免,你把語句變成這樣
UPDATE task SET status = 1 WHERE id = xxx AND status = 0

熟悉一點資料庫的人可能會說這樣還是避免不了搶奪,只是避免了重復寫入。
我要說的是,能避免重復寫入就夠了,我們的進程在執行完這條操作後,去獲取 affected_rows ,即更新的條數,根據資料庫的原子性,只有第一個搶占的進程才會返回 1,它可以進行後面的操作。而剩下返回 0 的進程,直接進入下一個等待流程即可。

『柒』 利用php +swoole如何實現非同步任務隊列

  • class msgServer

  • {

  • private $serv;

  • function __construct()

  • {

  • $this->serv = new SwooleServer("127.0.0.1", 9501);//創建一個服務

  • $this->serv->set(array('task_worker_num' => 4)); //配置task進程的數量

  • $this->serv->on('receive', array($this, 'onReceive'));//有數據進來的時候執行

  • $this->serv->on('task', array($this, 'onTask'));//有任務的時候執行

  • $this->serv->on('finish', array($this, 'onFinish'));//任務結束時執行

  • $this->serv->start();

  • }

  • public function onReceive($serv, $fd, $from_id, $data)

  • {

  • $data = json_decode($data, true);

  • $task_id = $serv->task($data);//這里發起了任務,於是上面的on('task', array($this, 'onTask'))就會執行

  • }

  • public function onTask($serv, $task_id, $from_id, $data)

  • {

  • $data['send_res'] = $this->sendMsg($data); //發送簡訊

  • //1.7.3之前,是$serv->finish("result");

  • return "result.";//這里告訴任務結束,於是上面的on('finish', array($this, 'onFinish'))就會執行

  • }

  • public function onFinish($serv, $task_id, $data)

  • {

  • $this->addSendLog($data); //添加簡訊發送記錄

  • }

  • }

『捌』 PHP當中,怎麼使用 beanstalk 來做隊列如何在 TP 中簡單引入呢

消息隊列Beanstalk詳解
先從安裝開始
##Githubhttps://github.com/kr/beanstalkd
cdbeanstalkd-1.10
make或者makeCFLAGS=-O2

注意,你不需要運行configure命令哦,因為對應的makefie已經是建立好了的。make之後在當前目錄下生成了beanstalkd可執行程序,你也可以makeinstall一下讓它安裝到/usr/local/bin中,或者你自己拷貝到一個自定義目錄中即可。
./beanstalkd-hUse:./beanstalkd[OPTIONS]Options:-bDIRwaldirectory-(use-f0for"alwaysfsync")-Fneverfsync(default)-lADDRlistenonaddress(defaultis0.0.0.0)-pPORTlistenonport(defaultis11300)-uUSERbecomeuserandgroup-(defaultis65535)-sBYTESsetthesizeofeachwalfile(defaultis10485760)()-ccompactthebinlog(default)-ndonotcompactthebinlog-vshowversioninformation-Vincreaseverbosity-hshowthishelp##b設置二進制日誌文件目錄,Beanstalk支持把任務寫入日誌文件,便於恢復##l設置監聽地址##p設置監聽埠##v查看版本################啟動不指定任何參數,表示在0.0.0.0埠11300監聽./beanstalkd&./beanstalkd-l127.0.0.111301&./beanstalkd-l192.168.1.16811302&在實際中應該監控這個進程,防止意外終止退出。為了更好理解Beanstalk的原理,建議閱讀官方文檔:github.com/kr/beanstalkd/blob/master/doc/protocol.md,以下是我個人的學習筆記:當Put一個job時,取決於是否設置了delay,job可能進入READY或DELAYED狀態,DELAYED的job超時後(或者調用kick)變成READY,reserve命令取一個最新的READY的job並把其變為RESERVED狀態(這個時候是被取出執行),RESERVED狀態的job可以發送delete刪除,也可以使用release釋放,根據是否設置delay時間,可能變成READY或DELAYED狀態,也可以調用bury命令讓job進入休眠,休眠中的job可以被delete也可以用kick命令讓其變為READY。當reserve一個READY狀態的job去執行時,如果設置的運行超時時間,則在取出時開始計時,如果超時則會從新放回到READY隊列。job的運行的剩餘時間可以通過stats-job命令來查看。如果要分配更多時間給job,可以發送touch命令。命令reserve取job時,這個job可能來自任一tube(當前鏈接的watchlist是多個時),默認,一個新鏈接watch一個叫default的tube。可以使用watch命令添加一個新的tube到watchlist中(如果這樣,一般就不要試圖使用tube的名字來區分要執行的任務,比如有兩個tubeA和B,當reserve取job時,這個job可能來自A也可以來自B,不過前提是A和B都在watchlist中)。如果要取指定tube的job,明確使用use即可,這樣只會獲取指定tube的job。可以在消費方建立新鏈接後,watch某個tube以期望獲取它的job(也可以使用use只獲取特定tube的job)。同樣道理,要put某個job都某個tub,需要先使用use命令,否則就是put到默認的叫default的tube中。reserve命令只是取狀態為READY的job,如果要去其它狀態的job,則需要使用peek和peek-xxxx命令(peek-readypeek-delayedpeek-buried)。job取出後根據它的狀態可以做相應操作,比如deletereleaseburykick。PHP框架Phalcon中提供對Beanstalk的客戶端庫://Connecttothequeue$queue=newPhalconQueueBeanstalk(array('host'=>'127.0.0.1','port'=>11300));鏈接到Beanstalk只有兩個參數,並沒有驗證等信息,以上指定的就是默認值。Beanstalk是支持多host的,PhalconQueueBeanstalk看來並沒有實現這個。在調用put執行,應該首先調用choose()方法指定tube,否則就是使用default這個tube。(這個所謂的choose實際就是發送use命令)然後再調用put把job添加到你期望的tube中:1$qid=$queue->put("QueueMessage");注意,put成功就返回job的標識符。以下展示一個完整的例子:$queue=newPhalconQueueBeanstalk(array('host'=>'127.0.0.1','port'=>11300));$queue->choose("my_tube");for($i=0;$i<10;$i++){$qid=$queue->put("Mytube--QueueMeaage$i");echo$qid." ";}$queue->choose("default");for($i=0;$i<10;$i++){$qid=$queue->put("Defaulttube--QueueMeaage$i");echo$qid." ";}切換到消費端,首先要使用choose()來獲取來自哪個tube的job(按照道理應該是調用watch()方法,但是實際測試,watch()沒有起作用,只好換成choose指定特定tube),然後調用peekReady()獲取一個PhalconQueueBeanstalkJob對象,當然如果失敗就返回false,Job對象獲取後,可以操作自然就有delete()release()bury()touch()kick()和getBody(),其中getBody()獲取Job的實際內容。$queue=newPhalconQueueBeanstalk();//$queue->watch("my_tube");$queue->choose("my_tube");while(true){if(($job=$queue->peekReady())!==false){$message=$job->getBody();echo$message." ";$job->delete();}else{usleep(200000);}}PhalconQueueBeanstalk提供了Beanstalk協議的大部分內容,但是狀態相關的沒有實現。為了詳細查看Beanstalk,可以使用一個第三方的PHP程序(github.com/ptrofimov/beanstalk_console):

『玖』 PHP 做任務隊列,現在常用的是哪個

生產環境用過 Gearman + Redis。

Gearman 用來做 worker 的調度,Redis 保存 workload。持久化用 MySQL 慢慢倒騰。
如對您有幫助,望採納,謝謝

熱點內容
在線支付php 發布:2024-04-28 20:20:10 瀏覽:541
安卓車機開機動畫一般什麼格式 發布:2024-04-28 20:11:21 瀏覽:286
jnic調用java 發布:2024-04-28 20:09:24 瀏覽:278
mpc源碼 發布:2024-04-28 20:08:27 瀏覽:426
windows7python 發布:2024-04-28 19:59:22 瀏覽:616
文件夾2寸 發布:2024-04-28 19:42:48 瀏覽:657
怎麼用伺服器的ip做內網穿透 發布:2024-04-28 19:28:52 瀏覽:925
常用的單向哈希演算法有 發布:2024-04-28 19:16:04 瀏覽:116
牛貝微信淘客源碼 發布:2024-04-28 19:09:16 瀏覽:34
傳奇裝備強化腳本 發布:2024-04-28 18:34:29 瀏覽:329