PHP初學者,在做項目的時候涉及到定時觸發,就是說,提醒用戶有私信消息,請教後台是不是PHP應付不來?需要 Python 這樣的語言支持?


先搞清楚站內消息即時通信的原理,才是解決這個問題的關鍵.

這裡只考慮最廣泛的HTTP協議,不考慮HTML5 WebSocket協議.

定時AJAX輪詢,是一個最簡單的方法,大家應該都能想得到.

但"定時AJAX輪詢"最大的缺陷就是實時性不好,無法實現"即時"通訊.

要保證"即時",可以使用基於一個HTTP長連接的AJAX長輪詢.

也就是瀏覽器端通過AJAX發起一個請求,伺服器端維持這個連接,直到有消息才返回數據.

上面解決了瀏覽器和伺服器之間的即時通信,但仍然沒有實現伺服器上面不同請求之間的即時通信.要解決這個問題,需要用到一個名叫"發布訂閱"的模式,Redis這個中間件內置的PubSub功能就實現了這個模式,包括PHP在內的大多數語言都能使用Redis這個PubSub功能.具體的工作原理就是:

PHP向Redis發出一個subscribe訂閱一個頻道,比如用戶1的頻道:

redis-cli SUBSCRIBE webim:user:1:channel

其他用戶或系統發送消息給用戶1時,使用publish,如:

redis-cli PUBLISH webim:user:1:channel "{"code":0,"msg":"Hello"}"

subscribe操作在收到消息時會回調執行一個函數用於處理收到消息的事件,比如結束請求,把消息返回給瀏覽器,這也就實現了即時通訊.

我所說的上面的這些操作,在最傳統的PHP運行模式Apache MOD_PHP和PHP-FPM中都可以跑,完全不需要使用Swoole和WorkerMan.但使用Swoole的好處是什麼呢?就是你可以在一個Swoole的工作進程中發起成千上萬個subscribe訂閱操作,並且維持成千上萬個HTTP長連接,而這就是非同步非阻塞的威力.而原始PHP中,發起一個subscribe訂閱操作,維持一個HTTP長連接,就需要一個PHP-FPM工作進程.

Ubuntu 安裝 Swoole:
sudo apt-get install build-essential php7.0-cli php7.0-dev (Ubuntu 16.04)
sudo apt-get install build-essential php5-cli php5-dev (Ubuntu 14.04)
sudo pecl install swoole


在前端用ajax定時輪循。如果一定要在後端做,用crontab。實在不行可以自己寫個腳本在伺服器上循環觸發某個頁面請求。


使用Ajax無刷新技術...定時循環抓取資料庫的內容


提醒用戶有私信消息,這一功能實現方式有很多

  • 消息存入資料庫,瀏覽器端 AJAX 定期輪詢或者 Comet

  • 消息隊列通知
  • 緩存系統

這些 PHP 都能實現。

和定時功能(crontab)沒什麼直接關係。


這個完全可以應付的過來吧,本質是對資料庫的讀取,而單秒對資料庫的讀取可以達到幾千次,網站不大的話,不會是瓶頸問題。何況,如果達到瓶頸,用python也未必能解決問題。


js不停的重複執行某個函數 然後從後台拿東西這樣


看網站項目程度 php也沒你想像的那麼弱

既然是初學 那麼傳統的客戶端輪詢應該可以完全滿足樓主練手

如果你真的需要用伺服器推送技術的話

可以考慮用nginx 的http_push_module

http://pushmodule.slact.net/

或者上node.js

ps: 建議樓主google 一下comet技術 先惡補一點基礎知識。


這個可以用ajax做,可以在客戶端定時發送ajax請求,比如每5秒發送一次請求,如果伺服器端的php程序判斷到有新的私信的話,擇返回數據在客戶端上顯示。


沒那麼 複雜了, 用操作系統定時任務crontab調起PHP程序即可.


站內信啊 像@eechen的回答就可以. ajax的長輪詢+Redis的訂閱. 但這麼做在FASTCGI模式下有個坑就是 非常佔用PHP-FPM 很容易就把伺服器的php-fpm進程佔滿. 因為如果處理的不好, 用戶主動斷開連接或者不斷刷新頁面就會造成後台一堆的PHP-FPM進程, 而且進程內的訂閱是阻塞式的,只有有消息出現或者運行到腳本超時才會釋放進程. 如果進程滿了, 整個網站就卡主了. 這種推送建議還是用swoole或者workman來最好, 如果用戶群體的遊覽器都支持websocket 那就更好不過啦.

當然具體情況還要看需求和網站規模, 小網站的話, ajax輪詢+mysql足以


前端可以用ajax輪詢

websocket可以實現實時通信

後端的話 可以crontab *****

也可以寫個消息隊列,如果有私信,就往redis隊列里push ,然後while一個死循環去隊列里pop

新手 求指正


我是寫介面,crontab定時打開的方式做的


系統定時任務,定時觸發訪問某個URL即可。


實在沒有想明白為啥要定時觸發。

看項目大小和實際的需求吧,有幾種解決方案。

  1. 不需要實時提醒新消息,只需要用戶刷新時候提醒就可以:看具體存儲量大不大,不大可以像discuz那樣把消息都存到資料庫中,加個is_read欄位,然後再弄個匯總表直接記錄每個用戶有多少條未讀消息,當用戶有新消息或者讀取消息時更新該匯總表。如果想快一點可以把匯總表放到redis裡面。如果消息量比較多,除了像discuz那種分表的做法以外,還可以選用其他資料庫,比如mongo等。
  2. 不需要太實時的消息提醒:在上述的基礎上,再加上輪詢,通過Ajax輪詢查看有沒有新的消息,有的話前端更新。如果需要通知更多渠道(比如是有新消息通知郵件/簡訊等),可以做成消息隊列分發給各個負責的系統推送消息。
  3. 實時的消息提醒:可以把Ajax改成是WebSocket,等有新消息就能立馬通知。


PHP完全可以解決!

如果前端需要實時接收到消息.則可以使用swoole 或者 workerman 寫一些socker服務。

swoole性能更好 workerman 更容易使用。

既然是初學則推薦workerman。通俗易懂 就算你不知道 socket 是什麼也能完成


php7 + swoole + websocket


不過感覺這樣的效率很底下


弱智問題,百度一下workerman swoole


題主,開發APP時需要用到APP數據統計分析工具吧,不知道你們是自己部署還是用第三方系統。給你推薦個開源版的APP數據統計分析工具Cobub Razor,開源地址https://github.com/cobub/razor


推薦閱讀:

初學php,求各位大神解答?
rabbitmq與gearman有什麼不同之處?
寫了個基於 PHP 的 Linux 圖形化性能監視器 Holy Lance

TAG:PHP | PHP開發 | PHP學習 |