PHP實現(xiàn)多線程的方法技巧_第1頁
PHP實現(xiàn)多線程的方法技巧_第2頁
PHP實現(xiàn)多線程的方法技巧_第3頁
PHP實現(xiàn)多線程的方法技巧_第4頁
PHP實現(xiàn)多線程的方法技巧_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

本文格式為Word版,下載可任意編輯——PHP實現(xiàn)多線程的方法技巧PHP+shell實現(xiàn)多線程的方法先寫個簡樸的php代碼,這里為了讓腳本執(zhí)行時間更長,便當(dāng)看效果。我們給大家?guī)砹司实腜HP實現(xiàn)多線程,下面大家一起來看看吧!

test.php的代碼:lsPHP代碼:

for$i=0;$i10;$i++

echo$i;

sleep10;

?在看下shell腳本的代碼,分外簡樸#!/bin/bash

foriin12345678910

do

/usr/bin/php-q/var//html/test.php

done留神到在苦求php代碼的那行有一個符號嗎,這個是關(guān)鍵,不加的話是不能舉行多線程的,表示講服務(wù)推送到后臺執(zhí)行,因此,在shell的每次的循環(huán)中不必等php的代碼全部執(zhí)行完在苦求下一個文件,而是同時舉行的,這樣就實現(xiàn)了多線程,下面運(yùn)行下shell看下效果,這里你將看到10個test.php進(jìn)程再跑,再利用linux的定時器,定時苦求這個shell,在處理一些需要多線程的任務(wù),例如,批量下載時,分外好用!php中用WEB服務(wù)器實現(xiàn)多線程假設(shè)我們現(xiàn)在運(yùn)行的是a.php這個文件.但是我在程序中又苦求WEB服務(wù)器運(yùn)行另一個b.php,那么這兩個文件將是同時執(zhí)行的.PS:一個鏈接苦求發(fā)送之后,WEB服務(wù)器就會執(zhí)行它,而不管客戶端是否已經(jīng)退出有些時候,我們想運(yùn)行的不是另一個文件,而是本文件中的一片面代碼.該怎么辦呢?

其實可是通過參數(shù)來操縱a.php來運(yùn)行哪一段程序.下面看一個例子://a.php,b.phpPHP代碼:

functionrunThread

$fp=fsockopenlocalhost,80,$errno,$errmsg;

fputs$fp,GET/b.php?act=brnrn;//這里的其次個參數(shù)是HTTP協(xié)議中規(guī)定的苦求頭

//不明白的請看RFC中的定義

fclose$fp;

functiona

$fp=fopenresult_a.log,w;

fputs$fp,Setin.Dateh:i:s,time.doublemicrotime.rn;

fclose$fp;

functionb

$fp=fopenresult_b.log,w;

fputs$fp,Setin.Dateh:i:s,time.doublemicrotime.rn;

fclose$fp;

if!isset$_GET[act]$_GET[act]=a;

if$_GET[act]==a

runThread;

a;

elseif$_GET[act]==bb;

?

開啟result_a.log和result_b.log對比一下兩個文件的中訪問的時間.大家會察覺,這兩個確實是在不同線程中運(yùn)行的.有些時間完全一樣.上面只是一個簡樸的例子,大家可以提升成其它形式.

既然PHP中也能多線程了,那么問題也來了,那就是同步的問題.我們知道PHP本身是不支持多線程的.所以更不會有什么像Java中synchronize的方法了.那我們該如何做呢.1.盡量不訪問同一個資源.以制止沖突.但是可以同時像數(shù)據(jù)庫操作.由于數(shù)據(jù)庫是支持并發(fā)操作的.所以在多線程的PHP中不要向同一個文件中寫入數(shù)據(jù).假設(shè)務(wù)必要寫的話,用別的方法舉行同步..如調(diào)用flock對文件舉行加鎖等.或建立臨時文件并在另外的線程中等待這個文件的消散whilefile_exitsxxx;這樣就等于這個臨時文件存在時,表示其實線程正在操作假設(shè)沒有了這個文件,說明其它線程已經(jīng)釋放了這個.2.盡量不要從runThread在執(zhí)行fputs后取這個socket中讀取數(shù)據(jù).由于要實現(xiàn)多線程,需要的用非阻塞模式.即在像fgets這樣的函數(shù)時立刻返回..所以讀寫數(shù)據(jù)就會出問題.假設(shè)使用阻塞模式的話,程序就不算是多線程了.他要等上面的返回才執(zhí)行下面的程序.所以假設(shè)需要交換數(shù)據(jù)結(jié)果利用外面文件或數(shù)據(jù)中完成.實在想要的話就用socket_set_nonblock$fp來實現(xiàn).

說了這么多,倒底這個有沒有實際的意義呢?在什么時候需要這種用這種方法呢?

答案是斷定的.大家知道.在一個不斷讀取網(wǎng)絡(luò)資源的應(yīng)用中,網(wǎng)絡(luò)的速度是瓶頸.假設(shè)采多這種形式就可以同時以多個線程對不同的頁面舉行讀取.本人做的一個能從8848、soaso這些商城網(wǎng)站探尋信息的程序。還有一個從阿里巴巴網(wǎng)站上讀取商業(yè)信息和公司目次的程序也用到了此技術(shù)。由于這兩個程序都是要不斷的鏈接它們的服務(wù)器讀取信息并保存到數(shù)據(jù)庫。利用此技術(shù)正好消釋了在等待響應(yīng)時的瓶頸。

php模擬實現(xiàn)多線程的三種方法PHP語言本身是不支持多線程的.總結(jié)了一下網(wǎng)上關(guān)于PHP模擬多線程的方法,總的來說,都是利用了PHP的好伙伴們本身所具有的多線程才能.PHP的好伙伴指的就是LINUX和APACHE啦,LAMP嘛.另外,既然是模擬的,就不是真正的多線程.其實只是多進(jìn)程.進(jìn)程和線程是兩個不同的概念.好了,以下方法都是從網(wǎng)上找來的.1.利用LINUX操作系統(tǒng)

for$i=0;$i10;$i++

echo$i;

sleep5;

?上面存成test.php,然后寫一段SHELL代碼#!/bin/bash

foriin12345678910

do

php-qtest.php

done2.利用fork子進(jìn)程其實同樣是利用LINUX操作系統(tǒng)

declareticks=1;

$bWaitFlag=FALSE;///是否等待進(jìn)程終止

$intNum=10;///進(jìn)程總數(shù)

$pids=array;///進(jìn)程PID數(shù)組

echoStartn;

for$i=0;$i$intNum;$i++

$pids[$i]=pcntl_fork;///產(chǎn)生子進(jìn)程,而且從當(dāng)前行之下開試運(yùn)行代碼,而且不繼承父進(jìn)程的數(shù)據(jù)信息

if!$pids[$i]

//子進(jìn)程進(jìn)程代碼段_Start

$str=;

sleep5+$i;

for$j=0;$j$i;$j++$str.=*;

echo$i-.time.$strn;

exit;

//子進(jìn)程進(jìn)程代碼段_End

if$bWaitFlag

for$i=0;$i$intNum;$i++

pcntl_waitpid$pids[$i],$status,WUNTRACED;

echowait$i-.time.n;

echoEndn;

?3.利用WEBSERVER,PHP不支持多線程,A

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論