首頁  >  文章  >  後端開發  >  php多執行緒的實作實例

php多執行緒的實作實例

黄舟
黄舟原創
2017-11-11 13:32:033648瀏覽

php多執行緒對於許多剛接觸php的小夥伴們來說有點不懂是意思,幹嘛用的,那我們今天就帶大家來講解下php多執行緒的實作案例!

假設我們現在運行的是a.php這個檔案. 但是我在程式中又請求WEB伺服器運行另一個b.php

那麼這兩個檔案將是同時執行的.

(PS: 一個連結請求發送之後, WEB伺服器就會執行它, 而不管客戶端是否已經退出)

有些時候, 我們想運行的不是另一個文件, 而是本文件中的一部分程式碼.該怎麼辦呢?

其實可是透過參數來控制a.php來執行哪一段程式.

下面看一個範例:

//a.php

PHP代码:--------------------------------------------------------------------------------
<?php
    function runThread()
    {
        $fp = fsockopen(&#39;localhost&#39;, 80, $errno, $errmsg);
        
        fputs($fp, "GET /a.php?act=b\r\n\r\n");        //这里的第二个参数是HTTP协议中规定的请求头
                                //不明白的请看RFC中的定义
        
        fclose($fp);
    }
    function a()
    {
        $fp = fopen(&#39;result_a.log&#39;, &#39;w&#39;);
        fputs($fp, &#39;Set in &#39; . Date(&#39;h:i:s&#39;, time()) . (double)microtime() . "\r\n");
        
        fclose($fp);        
    }
    function b()
    {
        $fp = fopen(&#39;result_b.log&#39;, &#39;w&#39;);
        fputs($fp, &#39;Set in &#39; . Date(&#39;h:i:s&#39;, time()) . (double)microtime() . "\r\n");
        
        fclose($fp);        
    }
    if(!isset($_GET[&#39;act&#39;])) $_GET[&#39;act&#39;] = &#39;a&#39;;
    
    if($_GET[&#39;act&#39;] == &#39;a&#39;)
    {
        runThread();
        a();
    }
    else if($_GET[&#39;act&#39;] == &#39;b&#39;) 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多執行緒的處理問題

以上是php多執行緒的實作實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn