php(做為現在的主流開發語言)中實現多線程? 看到這個標題, 你一定以為我瘋了..但是事實上我真的這么做了.
鳳岡ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為創新互聯公司的ssl證書銷售渠道,可以享受市場價格4-6折優惠!如果有意向歡迎電話聯系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
下面是我的一些做法, 已經實驗過. 確實可以的.
我們知道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配置的連接數
如果是連接數滿了,簡單粗暴的方式,修改連接數配置。如果是mysql所消耗的內存服務問題,就要修改mysql內存,加大配置。優化一下耗時長的業務,這個和程序端的代碼,是否為多線程沒有太大的關系,從你發出來的情況,就是1個請求耗時太長,讓后其他請求沒有返回,要么是web服務內存吃緊,要么是mysql服務壓力過大,連接數用滿的情況,應該不太可能。
本文實例講述了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程序設計有所幫助。
利用WEB服務器本身的多線程來處理,從WEB服務器多次調用我們需要實現多線程的程序。
PHP中也能多線程了,那么問題也來了,那就是同步的問題。
廈門電腦培訓知道PHP本身是不支持多線程的,所以更不會有什么像Java中synchronize的方法了。
那我們該如何做呢?1.盡量不訪問同一個資源。
以避免沖突。
但是可以同時像數據庫操作。
因為數據庫是支持并發操作的。
所以在多線程的PHP中不要向同一個文件中寫入數據。
如果必須要寫的話,用別的方法進行同步。
如調用flock對文件進行加鎖等。
或建立臨時文件,并在另外的線程中等待這個文件的消失while(file_exits('xxx'));這樣就等于這個臨時文件存在時,表示其實線程正在操作。
如果沒有了這個文件,說明其它線程已經釋放了這個。
2.盡量不要從runThread在執行fputs后取這個socket中讀取數據。
因為要實現多線程,需要的用非阻塞模式。
即在像fgets這樣的函數時立即返回。
。
所以讀寫數據就會出問題。
如果使用阻塞模式的話,程序就不算是多線程了。
他要等上面的返回才執行下面的程序。
所以如果需要交換數據最后利用外面文件或數據中完成。
實在想要的話就用socket_set_nonblock($fp)來實現。
說了這么多,倒底這個有沒有實際的意義呢?在什么時候需要這種用這種方法呢?答案是肯定的。
大家知道。
在一個不斷讀取網絡資源的應用中,網絡的速度是瓶頸。
如果采多這種形式就可以同時以多個線程對不同的頁面進行讀取。
這個不要多線程。
?php
set_time_limit(0);
// intignore_user_abort([ string$value] ) 設置關閉 瀏覽器是否一直執行
function aaa(){
你的代碼
}
while(1){
aaa();
sleep(30);
}
?
把這個加入定時任務中就行。
標題名稱:php的多線程操作數據庫,php是多線程還是單線程
網站路徑:http://m.newbst.com/article34/hsdose.html
成都網站建設公司_創新互聯,為您提供網站設計公司、軟件開發、關鍵詞優化、自適應網站、網站導航、搜索引擎優化
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯