php多執行緒對於許多剛接觸php的小夥伴們來說有點不懂是意思,幹嘛用的,那我們今天就帶大家來講解下php多執行緒的實作案例!
假設我們現在運行的是a.php這個檔案. 但是我在程式中又請求WEB伺服器運行另一個b.php
那麼這兩個檔案將是同時執行的.
(PS: 一個連結請求發送之後, WEB伺服器就會執行它, 而不管客戶端是否已經退出)
有些時候, 我們想運行的不是另一個文件, 而是本文件中的一部分程式碼.該怎麼辦呢?
其實可是透過參數來控制a.php來執行哪一段程式.
下面看一個範例:
//a.php PHP代码:-------------------------------------------------------------------------------- <?php function runThread() { $fp = fsockopen('localhost', 80, $errno, $errmsg); fputs($fp, "GET /a.php?act=b\r\n\r\n"); //这里的第二个参数是HTTP协议中规定的请求头 //不明白的请看RFC中的定义 fclose($fp); } function a() { $fp = fopen('result_a.log', 'w'); fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "\r\n"); fclose($fp); } function b() { $fp = fopen('result_b.log', 'w'); fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "\r\n"); fclose($fp); } if(!isset($_GET['act'])) $_GET['act'] = 'a'; if($_GET['act'] == 'a') { runThread(); a(); } else if($_GET['act'] == 'b') b(); ?> --------------------------------------------------------------------------------
打開result_a.log 和result_b.log 比較一下兩個文件的中訪問的時間. 大家會發現, 這兩個的確是在不同線程中運行的.
有些時間完全一樣.
#上面只是一個簡單的例子, 大家可以改進成其它形式.
既然PHP中也能多線程了, 那麼問題也來了, 那就是同步的問題. 我們知道PHP本身是不支援多執行緒的. 所以更不會有什麼像
java 中synchronize的方法了. 那我們該如何做呢.
1. 盡量不訪問同一個資源.以避免衝突. 但是可以同時像資料庫操作. 因為資料庫是支援並發操作的. 所以在多執行緒的PHP中
#不要向同一個檔案寫入資料. 如果必須要寫的話, 用別的方法進行同步.. 如調用 北京天安婦科醫院flock對文件進行加鎖等. 或建立臨時文件
並在另外的線程中等待這個文件的消失while(file_exits ('xxx')); 這樣就等於這個臨時檔案存在時, 表示其實線程正在操作
如果沒有了這個檔案, 說明其它線程已經釋放了這個.
2. 盡量不要從runThread在執行fputs後取這個socket中讀取資料. 因為要實現多線程, 需要的用非阻塞模式。即在像fgets這
#樣的函數時立即返回.. 所以讀寫資料就會出問題. 如果使用阻塞模式的話, 程序就不算是多線程了. 他要等上面的返回才執行
下面的程序. 所以如果需要交換數據最後利用外面文件或數據中完成. 實在想要的話就用socket_set_nonblock($fp) 來實現.
總結:
##說了這麼多, 倒底這個有沒有實際的意義呢? 在什麼時候需要這種用這種方法呢?答案是肯定的. 大家知道. 在一個不斷讀取網絡資源的應用中, 網絡的速度是瓶頸.如果採多這種形式就可以同時以多個執行緒對不同的頁面進行讀取.#相關推薦:
以上是php多執行緒的實作實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!