如果你是擔(dān)心臟數(shù)據(jù)。那么可以在SQL語(yǔ)句上做改動(dòng)。例如:
成都創(chuàng)新互聯(lián)公司主營(yíng)成縣網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,App定制開(kāi)發(fā),成縣h5成都小程序開(kāi)發(fā)搭建,成縣網(wǎng)站營(yíng)銷(xiāo)推廣歡迎成縣等地區(qū)企業(yè)咨詢(xún)
假設(shè)表名為table1,發(fā)布數(shù)量字段為total,用戶(hù)ID字段為user_id,值為10,則
update table1 set total = total - 1 where user_id = 10;
以下都是轉(zhuǎn)載, 簡(jiǎn)單說(shuō)下, php是不支持多線(xiàn)程的。。。。
PHP語(yǔ)言本身是不支持多線(xiàn)程的. 總結(jié)了一下網(wǎng)上關(guān)于PHP模擬多線(xiàn)程的方法, 總的來(lái)說(shuō), 都是利用了PHP的好伙伴們本身所具有的多線(xiàn)程能力. PHP的好伙伴指的就是LINUX和APACHE啦, LAMP嘛.
另外, 既然是模擬的, 就不是真正的多線(xiàn)程. 其實(shí)只是多進(jìn)程. 進(jìn)程和線(xiàn)程是兩個(gè)不同的概念. 好了, 以下方法都是從網(wǎng)上找來(lái)的.
1. 利用LINUX操作系統(tǒng)
?php
for ($i=0;$i10;$i++) {
echo $i;
sleep(5);
}
?
上面存成test.php, 然后寫(xiě)一段SHELL代碼
#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
php -q test.php
done
2. 利用fork子進(jìn)程(其實(shí)同樣是利用LINUX操作系統(tǒng))
?php
declare(ticks=1);
$bWaitFlag = FALSE; /// 是否等待進(jìn)程結(jié)束
$intNum = 10; /// 進(jìn)程總數(shù)
$pids = array(); /// 進(jìn)程PID數(shù)組
echo ("Startn");
for($i = 0; $i $intNum; $i++) {
$pids[$i] = pcntl_fork();/// 產(chǎn)生子進(jìn)程,而且從當(dāng)前行之下開(kāi)試運(yùn)行代碼,而且不繼承父進(jìn)程的數(shù)據(jù)信息
if(!$pids[$i]) {
// 子進(jìn)程進(jìn)程代碼段_Start
$str="";
sleep(5+$i);
for ($j=0;$j$i;$j++) {$str.="*";}
echo "$i - " . time() . " $str n";
exit();
// 子進(jìn)程進(jìn)程代碼段_End
}
}
if ($bWaitFlag)
{
for($i = 0; $i $intNum; $i++) {
pcntl_waitpid($pids[$i], $status, WUNTRACED);
echo "wait $i - " . time() . "n";
}
}
echo ("Endn");
?
3. 利用WEB SERVER, PHP不支持多線(xiàn)程, APACHE可是支持的, 呵呵.
假設(shè)我們現(xiàn)在運(yùn)行的是a.php這個(gè)文檔. 但是我在程式中又請(qǐng)求WEB服務(wù)器運(yùn)行另一個(gè)b.php
那么這兩個(gè)文檔將是同時(shí)執(zhí)行的.
?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();
?
當(dāng)然啦,也可以把需要多線(xiàn)程處理的部分交給JAVA去處理, 然后在PHP里調(diào)用, 哈哈.
?php
system('java multiThread.java');
?
如果你是Linux下執(zhí)行的PHP
你看看手冊(cè)的pcntl_fork pcntl_wait 函數(shù)
如果是windows,沒(méi)辦法
pcntl_fork(PHP 4 = 4.1.0, PHP 5)pcntl_fork — 在當(dāng)前進(jìn)程當(dāng)前位置產(chǎn)生分支(子進(jìn)程)。譯注:fork是創(chuàng)建了一個(gè)子進(jìn)程,父進(jìn)程和子進(jìn)程 都從fork的位置開(kāi)始向下繼續(xù)執(zhí)行,不同的是父進(jìn)程執(zhí)行過(guò)程中,得到的fork返回值為子進(jìn)程 號(hào),而子進(jìn)程得到的是0。
說(shuō)明int pcntl_fork ( void )pcntl_fork()函數(shù)創(chuàng)建一個(gè)子進(jìn)程,這個(gè)子進(jìn)程僅PID(進(jìn)程號(hào)) 和PPID(父進(jìn)程號(hào))與其父進(jìn)程不同。fork怎樣在您的系統(tǒng)工作的詳細(xì)信息請(qǐng)查閱您的系統(tǒng) 的fork(2)手冊(cè)。
返回值成功時(shí),在父進(jìn)程執(zhí)行線(xiàn)程內(nèi)返回產(chǎn)生的子進(jìn)程的PID,在子進(jìn)程執(zhí)行線(xiàn)程內(nèi)返回0。失敗時(shí),在 父進(jìn)程上下文返回-1,不會(huì)創(chuàng)建子進(jìn)程,并且會(huì)引發(fā)一個(gè)PHP錯(cuò)誤。
范例Example #1 pcntl_fork() 示例
?php
$pid = pcntl_fork();
//父進(jìn)程和子進(jìn)程都會(huì)執(zhí)行下面代碼
if ($pid == -1) {
//錯(cuò)誤處理:創(chuàng)建子進(jìn)程失敗時(shí)返回-1.
die('could not fork');
} else if ($pid) {
//父進(jìn)程會(huì)得到子進(jìn)程號(hào),所以這里是父進(jìn)程執(zhí)行的邏輯
pcntl_wait($status); //等待子進(jìn)程中斷,防止子進(jìn)程成為僵尸進(jìn)程。
} else {
//子進(jìn)程得到的$pid為0, 所以這里是子進(jìn)程執(zhí)行的邏輯。
}
?
多線(xiàn)程數(shù)據(jù)填充一般都是一個(gè)線(xiàn)程在讀取數(shù)據(jù),一個(gè)線(xiàn)程去更新數(shù)據(jù)。以下是一個(gè)簡(jiǎn)單的模型:publicclassworker{publicstaticListsourceData;publicvoidReaddata(){for(inti=0;i10000;i++){//讀取第i批次的數(shù)據(jù)lock(sourceData){//將這些數(shù)據(jù)放入sourceData}}}publicvoidrender(){while(true){lock(sourceData){//從sourcedata中取出新的數(shù)據(jù)}//將數(shù)據(jù)填充道UI}}}調(diào)用者workerwk=newworker();Threadth1=newThread(newThreadStart(wk.Readdata));Threadth2=newThread(newThreadStart(wk.render));th1.Start();th2.Start();