php多線程的實現執行個體

來源:互聯網
上載者:User
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多線程的處理問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.