php多線程對於很多剛剛接觸php的小夥伴們來說有點不明白是意思,幹什麼用的,那麼我們今天就帶大家講解下php多線程的實現案例!
假設我們現在啟動並執行是a.php這個檔案. 但是我在程式中又請求WEB伺服器運行另一個b.php
那麼這兩個檔案將是同時執行的.
(PS: 一個連結請求發送之後, WEB伺服器就會執行它, 而不管用戶端是否已經退出)
有些時候, 我們想啟動並執行不是另一個檔案, 而是本檔案中的一部分代碼.該怎麼辦呢?
其實可是通過參數來控制a.php來運行哪一段程式.
下面看一個例子:
//a.phpPHP代碼:--------------------------------------------------------------------------------<?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多線程一種實現方法—shell
PHP多線程小案例
關於PHP多線程的處理問題