一般來說,php中的程式是單一進程的,執行完一句之後才會再執行下一句。但如果卡在某一個環節,那麼這個程式就沒有辦法執行了,我們就需要另一個機制來解決這個問題,這就是非同步。
一般情況下的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)){ echo "使用内存: ".memory_get_usage()."\n"; //这里看下使用了多少内存 echo "收到的消息: $data\n"; //收到的消息在这里 }
透過執行程式可以發現,發送訊息和接受訊息遵循佇列的標準FIFO,這樣我們就根據這些特點就可以設計一個非同步的系統。
怎麼用這些特性的,這樣想想,在程式執行的時候一定會有很多操作,有些操作是必須時時執行的,而有些操作則是可以有延遲的,更有些操作本來就不重要還會花很多時間的。
比如說記錄登陸日誌,記錄遊戲詳細,這個時候我們就可以不必在那裡等待程序執行完畢(等的話還會有可能出問題,當不重要操作特別多的時候就會浪費很多時間),而是直接把要操作的東西丟到佇列裡。
然後在後台單獨開啟一個進程來執行收到的訊息,就像receive.php中一樣,一直在那裡等待,有訊息來的時候他就運行,沒有的時候就阻塞,這樣是不是就成功解決了程式運行時非馬上執行程式浪費時間的問題。
推薦學習:php影片教學
以上是異步在單一進程中有那麼重要嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!