非同步在單程序系統中的重要性

2022-03-09 12:48:29 字數 1586 閱讀 4590

一般情況下的php中的程式是單程序的,執行完一句再接著下一句(這裡不用php的pcntl_fork()系列的函式,我的這種做法比那種好多了),就像一群很有素質的很餓的人(不吃這對飯就可能掛掉,大家都希望盡可能快的吃上這頓飯)排著隊去買飯一樣,必須乙個買完了下乙個再買,如果乙個人拿了全是1角的零錢,也必須1角1角的數完了才能下乙個,在實際排隊買飯中遲一下兩下可能沒問題,但是要在乙個要給使用者快速響應的系統中,如果出現這種現象就麻煩了,就像乙個完整的登入操作分為好多步驟,要是按部就班的執行,要是卡在乙個環節就完蛋了,這個使用者就會看到loading按鈕一直轉啊轉的……這個時候就需要一種機制來解決這個問題。

首先我們了解下php的程序間通訊擴充套件,sysvmsg,這裡要注意這個擴充套件只能在linux/uinux中使用,在其他平台無效,我的環境是centos6.3,安裝這個擴充套件很簡單:

yum -y install php-process

當然了前提是你已經安裝了php,執行完之後在用下面的命令檢視是否安裝成功:

php -m | grep

sysvmsg

#若果看到sysvmsg說明安裝成功了

#或者也可以這樣

php -r '

var_dump(function_exists("msg_get_queue"))';

#若果看到true說明安裝成功了

當然了,上面的命令需要把php路徑加入到系統環境變數中。

這個擴充套件可以在程序間進行通訊,下面來看個例子。

傳送,send.php

#!/usr/bin/php

#上面的是我自己的php路徑

<?php

$ip = msg_get_queue(12340

);//

建立乙個佇列

msg_send($ip,1,"

test a message

",false,false

,$err);

//像佇列中塞一條訊息

接受,receive.php

#!/usr/bin/php

<?php

$ip = msg_get_queue(12340

);//

建立訊息佇列,和傳送的要一致,不然收不到訊息

while(msg_receive($ip,0,$msgtype,512,$data,false,null

,$err))

通過執行程式可以發現,傳送訊息和接受訊息遵循佇列的標準fifo,這樣我們根據這些特點就可以設計乙個非同步的系統。

怎麼用這些特性的,這樣想想,在程式執行的時候肯定會有很多操作,有些操作是必須時時執行的,而有些操作則是可以有延遲的,更有些操作本來就不重要還會花費很多時間的,比如說記錄登陸日誌,記錄遊戲詳細,這個時候我們就可以不必在那裡等待程式執行完畢(等的話還會有可能出問題,當不重要操作特別多的時候就會浪費很多時間),而是直接把要操作的東西丟到佇列裡,然後在後台單獨開啟乙個程序來執行收到的訊息,就像receive.php中一樣,一直在那裡等待,有訊息來的時候他就執行,沒有的時候就阻塞,這樣是不是就成功解決了程式執行時非馬上執行程式浪費時間的問題。

要具體怎麼實現,下次接著寫

send me~

DBA在系統設計 開發中的重要性

一 現階段dba對系統效能及穩定性所做的調整工作 目前dba對系統效能的調整工作大致是這麼幾個方面 1 在硬體層面進行調優,這通常就是直接花錢,買裝置 擴容。2 在db層面進行調優,比如調整初始化引數,調整資料庫物理結構。3 對應用的sql進行優化,比如在資料庫分析statspack,調整top s...

DNS在活動目錄中的重要性

我們都知道dns對於活動目錄來講是非常重要的,要想部署活動目錄,就必須搭建dns伺服器,通常的做法是在搭建第一台dc的時候自動安裝dns,之所以都這麼做是因為它簡單 方便,但也有缺點。也許你遇到過這樣的問題,比如機房停電,所有伺服器都必須關機,來電後需要啟動所有的伺服器,這時如果你先啟動額外域控制器...

論場景在研發中的重要性

隨著中國改革開放程度的加深,網際網路行業也逐漸出現變革,典型的變化就是由原來的低端重複性造輪子,逐步轉向高階,以技術創新為主導。乙個有力的證明就是近年來以技術驅動的創業公司越來越多,這在10年前是不可想象的。在人才要求上,對工作經驗不再那麼看重,而更加重視求職者的學歷,專業,背景。在這樣的背景下,一...