本文目錄一覽:
用php怎樣做多線程的方法
php(做為現在的主流開發語言)中實現多線程? 看到這個標題, 你一定以為我瘋了..但是事實上我真的這麼做了.
下面是我的一些做法, 已經實驗過. 確實可以的.
我們知道php(做為現在的主流開發語言)本身是不支持多線程的, 但是我們的WEB服務器是支持多線程的.
也就是說可以同時讓多人一起訪問. 這也是我在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 “); //這裡的第二個參數是HTTP協議中規定的請求頭
//不明白的請看RFC中的定義
fclose($fp);
}
function a()
{
$fp = fopen(result_a.log, w);
fputs($fp, Set in . Date(h:i:s, time()) . (double)microtime() . ” “);
fclose($fp);
}
function b()
{
$fp = fopen(result_b.log, w);
fputs($fp, Set in . Date(h:i:s, time()) . (double)microtime() . ” “);
php中怎麼實現多線程
php 是不支持多線程的,可以利用APACHE實現,以下是網上找到的代碼
假設我們現在運行的是a.php這個文檔. 但是我在程式中又請求WEB服務器運行另一個b.php
那麼這兩個文檔將是同時執行的.
?php
function runThread()
{
$fp = fsockopen(‘localhost’, 80, $errno, $errmsg);
fputs($fp, “GET /a.php?act=brnrn”);
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();
?
曲靖java培訓學校告訴你PHP中的(偽)多線程與多進程?
利用WEB服務器本身的多線程來處理,從WEB服務器多次調用我們需要實現多線程的程序。
PHP中也能多線程了,那麼問題也來了,那就是同步的問題。曲靖電腦培訓知道PHP本身是不支持多線程的,所以更不會有什麼像Java中synchronize的方法了。那我們該如何做呢?
1.盡量不訪問同一個資源。以避免衝突。但是可以同時像數據庫操作。因為數據庫是支持並發操作的。所以在多線程的PHP中不要向同一個文件中寫入數據。如果必須要寫的話,用別的方法進行同步。如調用flock對文件進行加鎖等。或建立臨時文件,並在另外的線程中等待這個文件的消失while(file_exits(‘xxx’));這樣就等於這個臨時文件存在時,表示其實線程正在操作。如果沒有了這個文件,說明其它線程已經釋放了這個。
2.盡量不要從runThread在執行fputs後取這個socket中讀取數據。因為要實現多線程,需要的用非阻塞模式。即在像fgets這樣的函數時立即返回。。所以讀寫數據就會出問題。如果使用阻塞模式的話,程序就不算是多線程了。他要等上面的返回才執行下面的程序。所以如果需要交換數據最後利用外面文件或數據中完成。實在想要的話就用socket_set_nonblock($fp)來實現。
說了這麼多,倒底這個有沒有實際的意義呢?在什麼時候需要這種用這種方法呢?
答案是肯定的。大家知道。在一個不斷讀取網絡資源的應用中,網絡的速度是瓶頸。如果采多這種形式就可以同時以多個線程對不同的頁面進行讀取。
PHP使用Pthread實現的多線程操作實例
本文實例講述了PHP使用Pthread實現的多線程操作。分享給大家供大家參考,具體如下:
?php
class
vote
extends
Thread
{
public
$res
=
”;
public
$url
=
array();
public
$name
=
”;
public
$runing
=
false;
public
$lc
=
false;
public
function
__construct($name)
{
$this-res
=
‘暫無,第一次運行.’;
$this-param
=
0;
$this-lurl
=
0;
$this-name
=
$name;
$this-runing
=
true;
$this-lc
=
false;
}
public
function
run()
{
while
($this-runing)
{
if
($this-param
!=
0)
{
$nt
=
rand(1,
10);
echo
“線程[{$this-name}]收到任務參數::{$this-param},需要{$nt}秒處理數據.\n”;
$this-res
=
rand(100,
999);
sleep($nt);
$this-lurl
=
$this-param;
$this-param
=
”;
}
else
{
echo
“線程[{$this-name}]等待任務..\n”;
}
sleep(1);
}
}
}
//這裡創建線程池.
$pool[]
=
new
vote(‘a’);
$pool[]
=
new
vote(‘b’);
$pool[]
=
new
vote(‘c’);
//啟動所有線程,使其處於工作狀態
foreach
($pool
as
$w)
{
$w-start();
}
//派發任務給線程
for
($i
=
1;
$i
10;
$i++)
{
$worker_content
=
rand(10,
99);
while
(true)
{
foreach
($pool
as
$worker)
{
//參數為空則說明線程空閑
if
($worker-param==”)
{
$worker-param
=
$worker_content;
echo
“[{$worker-name}]線程空閑,放入參數{$worker_content},上次參數[{$worker-lurl}]結果[{$worker-res}].\n”;
break
2;
}
}
sleep(1);
}
}
echo
“所有線程派發完畢,等待執行完成.\n”;
//等待所有線程運行結束
while
(count($pool))
{
//遍歷檢查線程組運行結束
foreach
($pool
as
$key
=
$threads)
{
if
($worker-param==”)
{
echo
“[{$threads-name}]線程空閑,上次參數[{$threads-lurl}]結果[{$threads-res}].\n”;
echo
“[{$threads-name}]線程運行完成,退出.\n”;
//設置結束標誌
$threads-runing
=
false;
unset($pool[$key]);
}
}
echo
“等待中…\n”;
sleep(1);
}
echo
“所有線程執行完畢.\n”;
希望本文所述對大家php程序設計有所幫助。
原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/127782.html