#!/usr/bin/env?php
創(chuàng)新互聯(lián)是一家專業(yè)提供梅河口企業(yè)網(wǎng)站建設,專注與成都網(wǎng)站設計、成都做網(wǎng)站、H5網(wǎng)站設計、小程序制作等業(yè)務。10年已為梅河口眾多企業(yè)、政府機構(gòu)等服務。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進行中。
?php
$cmds=array(
array('/apps/bin/launcher.php','charge/promotion_props_stat.php','mobile',1),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php','mobile',2),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php','click',1),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php','click',2),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php',1),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php',2)
);
foreach($cmds?as?$cmd){
$pid=pcntl_fork();
if($pid==-1){?//進程創(chuàng)建失敗
die('fork?child?process?failure!');
}
else?if($pid){?//父進程處理邏輯
pcntl_wait($status,WNOHANG);
}
else{?//子進程處理邏輯
pcntl_exec('/usr/local/bin/php',$cmd);
}
}
/*
*flock(file,lock,block)
*file 必需,規(guī)定要鎖定或釋放的已打開的文件
*lock 必需。規(guī)定要使用哪種鎖定類型。
*block 可選。若設置為 1 或 true,則當進行鎖定時阻擋其他進程。
*lock
*LOCK_SH 要取得共享鎖定(讀取的程序)
*LOCK_EX 要取得獨占鎖定(寫入的程序)
*LOCK_UN 要釋放鎖定(無論共享或獨占)
*LOCK_NB 如果不希望 flock() 在鎖定時堵塞
/*
if (flock($file,LOCK_EX))
{
fwrite($file,'write more words');
flock($file,LOCK_UN);
}
else
{
//處理錯誤邏輯
}
fclose($file);
)
?php /**
* File name:client.php
* 客戶端代碼
*
* @author guisu.huang
* @since 2012-04-11
*/ set_time_limit(0);
$host = "127.0.0.1";
$port = 2046;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)or die("Could not create socket\n"); // 創(chuàng)建一個Socket
$connection = socket_connect($socket, $host, $port) or die("Could not connet server\n"); // 連接 socket_write($socket, "hello socket") or die("Write failed\n"); // 數(shù)據(jù)傳送 向服務器發(fā)送消息 while ($buff = socket_read($socket, 1024, PHP_NORMAL_READ)) {
echo("Response was:" . $buff . "\n");
}
socket_close($socket);
利用WEB服務器本身的多線程來處理,從WEB服務器多次調(diào)用我們需要實現(xiàn)多線程的程序。
PHP中也能多線程了,那么問題也來了,那就是同步的問題。曲靖電腦培訓知道PHP本身是不支持多線程的,所以更不會有什么像Java中synchronize的方法了。那我們該如何做呢?
1.盡量不訪問同一個資源。以避免沖突。但是可以同時像數(shù)據(jù)庫操作。因為數(shù)據(jù)庫是支持并發(fā)操作的。所以在多線程的PHP中不要向同一個文件中寫入數(shù)據(jù)。如果必須要寫的話,用別的方法進行同步。如調(diào)用flock對文件進行加鎖等?;蚪⑴R時文件,并在另外的線程中等待這個文件的消失while(file_exits('xxx'));這樣就等于這個臨時文件存在時,表示其實線程正在操作。如果沒有了這個文件,說明其它線程已經(jīng)釋放了這個。
2.盡量不要從runThread在執(zhí)行fputs后取這個socket中讀取數(shù)據(jù)。因為要實現(xiàn)多線程,需要的用非阻塞模式。即在像fgets這樣的函數(shù)時立即返回。。所以讀寫數(shù)據(jù)就會出問題。如果使用阻塞模式的話,程序就不算是多線程了。他要等上面的返回才執(zhí)行下面的程序。所以如果需要交換數(shù)據(jù)最后利用外面文件或數(shù)據(jù)中完成。實在想要的話就用socket_set_nonblock($fp)來實現(xiàn)。
說了這么多,倒底這個有沒有實際的意義呢?在什么時候需要這種用這種方法呢?
答案是肯定的。大家知道。在一個不斷讀取網(wǎng)絡資源的應用中,網(wǎng)絡的速度是瓶頸。如果采多這種形式就可以同時以多個線程對不同的頁面進行讀取。
你先告訴我你要交換些什么數(shù)據(jù)嘛
請看這個例子:
幾個人要共用一段數(shù)據(jù):
Mysql數(shù)據(jù)表:share
字段:id,value
這樣一設計你就可以用ID來獲得一段數(shù)據(jù)
假設id=5 那么你就在每個用戶里面都用select * from share where id=5
就可以查詢獲得這個公共數(shù)據(jù)了,如果想每個人都更改那么你可以用update share set value=*** where id=5
當然最好不好讓每個人都可以delete,否則其它用戶可能因查詢不到數(shù)據(jù)而出錯。