PHP中的(偽)多線程與多進程

來源:互聯網
上載者:User

[學習] PHP中的(偽)多線程與多進程

已經因為沒怎麼需要,所以沒有查這個的資料。最近有一個項目卻是需要這樣子的功能。

查看了PHP的手冊和他人的例子,瞭解到基本的兩種方法:

(偽)多線程:藉助外力
利用WEB伺服器本身的多線程來處理,從WEB伺服器多次調用我們需要實現多線程的程式。
我們知道PHP本身是不支援多線程的, 但是我們的WEB伺服器是支援多線程的.

也就是說可以同時讓多人一起訪問. 這也是我在PHP中實現多線程的基礎.

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

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

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

有些時候, 我們想啟動並執行不是另一個檔案, 而是本檔案中的一部分代碼.該怎麼辦呢?

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

下面看一個例子:

//a.php

<?php
function runThread()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg);
fputs($fp, "GET /a.php?act=brnrn"); //這裡的第二個參數是HTTP協議中規定的要求標頭
//不明白的請看RFC中的定義
fclose($fp);
}

function a()
{
$fp = fopen('result_a.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}

function b()
{
$fp = fopen('result_b.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
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本身是不支援多線程的. 所以更不會有什麼像

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.