亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

異步運行PHP任務

異步運行PHP任務

PHP
慕絲7291255 2019-07-11 16:01:04
異步運行PHP任務我在一個有點大的Web應用程序上工作,后端主要是PHP。在代碼中有幾個地方我需要完成一些任務,但我不想讓用戶等待結果。例如,當創建一個新的帳戶,我需要給他們一個歡迎電子郵件。但是當他們按下“完成注冊”按鈕時,我不想讓他們等到電子郵件被實際發送之后,我只想啟動這個過程,并立即向用戶返回一條消息。到目前為止,在某些地方,我一直在使用與exec()類似的黑客攻擊?;旧鲜沁@樣做的:exec("doTask.php $arg1 $arg2 $arg3 >/dev/null 2>&1 &");這似乎有效,但我想知道是否有更好的方法。我正在考慮編寫一個在MySQL表中排隊任務的系統,以及一個單獨的長期運行的PHP腳本,該腳本每秒查詢該表一次,并執行它找到的任何新任務。如果需要的話,這樣做還可以讓我將來將任務分給幾臺工人機器。我在重新發明方向盤嗎?有比exec()黑客或MySQL隊列更好的解決方案嗎?
查看完整描述

3 回答

?
largeQ

TA貢獻2039條經驗 獲得超8個贊

我使用了排隊方法,它可以很好地工作,因為您可以將處理推遲到服務器負載空閑時,如果您可以輕松地將“不緊急的任務”分區,則可以非常有效地管理負載。

滾動自己并不是太棘手,這里有一些其他選項可以查看:

  • 吉爾曼

    -這個答案是在2009年寫的,從那以后,GearMan看起來是一個很受歡迎的選擇,見下面的評論。
  • ActiveMQ

    如果您想要一個完整的開放源碼消息隊列。
  • ZeroMQ

    -這是一個非常酷的套接字庫,它可以輕松地編寫分布式代碼,而不必過于擔心套接字編程本身。您可以將它用于單個主機上的消息隊列?您只需讓您的webapp將某些內容推送到一個隊列中,在下一個合適的機會下,一個連續運行的控制臺應用程序就會使用該
  • 貝斯塔克

    -只在寫這個答案時找到了這個,但看起來很有趣
  • 落差

    是一個基于PHP的消息隊列項目,但自2010年9月以來一直沒有得到積極維護
  • PHP-隊列

    是最近(2017年)維護的針對各種隊列系統的包裝器。
  • 最后,一篇關于使用

    消息隊列的memcached

另一個,也許更簡單的方法是使用忽略用戶中止-一旦將頁面發送給用戶,就可以進行最終處理,而不必擔心過早終止,盡管從用戶的角度看,這確實會延長頁面加載的時間。


查看完整回答
反對 回復 2019-07-11
?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

當您只想執行一個或幾個HTTP請求而不必等待響應時,也有一個簡單的PHP解決方案。

在調用腳本中:

$socketcon = fsockopen($host, 80, $errno, $errstr, 10);if($socketcon) {   
   $socketdata = "GET $remote_house/script.php?parameters=... HTTP 1.1\r\nHost: $host\r\nConnection: Close\r\n\r\n";      
   fwrite($socketcon, $socketdata); 
   fclose($socketcon);}// repeat this with different parameters as often as you like

在被調用的script.php上,您可以在第一行調用這些PHP函數:

ignore_user_abort(true);set_time_limit(0);

這將導致在HTTP連接關閉時腳本不受時間限制地繼續運行。


查看完整回答
反對 回復 2019-07-11
  • 3 回答
  • 0 關注
  • 669 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號