(偽)多線程
利用WEB服務器本身的多線程來處理
QUOTE:
我們知道PHP本身是不支持多線程的
也就是說可以同時讓多人一起訪問
假設我們現在運行的是a
那麼這兩個文件將是同時執行的
(PS: 一個鏈接請求發送之後
有些時候
其實可是通過參數來控制a
下面看一個例子:
<?php
function runThread(){
$fp = fsockopen(
fputs($fp
fclose($fp);
}
function a(){
$fp = fopen(
fputs($fp
fclose($fp);
}
function b(){
$fp = fopen(
fputs($fp
fclose($fp);
}
if(!isset($_GET[
if($_GET[
runThread();
a();
}else if($_GET[
b();
};
?>
打開result_a
上面只是一個簡單的例子
既然PHP中也能多線程了
不 要向同一個文件中寫入數據
說了這麼多
答案是肯定的
本人做的一個能從
多進程
只能用在Unix Like OS
編譯php的時候
以下為簡短的測試代碼
declare(ticks=
$bWaitFlag = FALSE; /// 是否等待進程結束
$intNum =
$pids = array(); /// 進程PID數組
echo ("Startn");
for($i =
$pids[$i] = pcntl_fork();/// 產生子進程
if(!$pids[$i]) {
// 子進程進程代碼段_Start
$str="";
sleep(
for ($j=
echo "$i
exit();
// 子進程進程代碼段_End
}
}
if ($bWaitFlag)
{
for($i =
pcntl_waitpid($pids[$i]
echo "wait $i
}
}
echo ("Endn");
運行結果如下
CODE:[Copy toclipboard][qiao@oicq qiao]$ phptest
Start
End
[qiao@oicq qiao]$ ps
qiao
qiao
qiao
qiao
qiao
qiao
qiao
qiao
qiao
qiao
qiao
[qiao@oicq qiao]$
[qiao@oicq qiao]$
如果$bWaitFlag=TURE
CODE:[Copy toclipboard][qiao@oicq qiao]$ phptest
Start
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
End
[qiao@oicq qiao]$
從 多進程的例子可以看出
更詳細的研究出於時間關系
[文章二] 嘗試php命令行腳本多進程並發執行
除了fork
php不支持多線程
下面是一個例子
被並行調用的子程序代碼
<?php
if($argc==
echo("argvn");
}
$arg = $argv[
for($i=
{
echo($i
if($arg==
sleep(
echo($i
sleep(
}else{
sleep(
}
}
?>
主調用者程序
error_reporting(E_ALL);
$handle
$handle
$handle
echo "
echo "
echo "
//sleep(
while(!feof($handle
{
$read = fgets($handle
echo $read;
$read = fgets($handle
echo $read;
$read = fgets($handle
echo $read;
}
pclose($handle
pclose($handle
pclose($handle
下面是我機器上的輸出
C:my_hunter>php exec
**總結
**主程序循環等待子進程
以後的改進
* popen打開的句柄是單向的
* 使用數組和子函數代替while(!feof($handle
* 用fread一次把子進程已經產生的輸出取完
一個並發執行shell任務的調度者
/*
主任務管理器
並發的執行子任務列表
*/
include("
include("
//開啟的進程數
$exec_number =
/***** main ********/
if($argc==
echo("argvn");
}
$taskfile = $argv[
//tasklist
$tasklist = file($taskfile);
$tasklist_len = count($tasklist);
$tasklist_pos =
$handle_list = array();
while(
{
//子進程列表有空閒
if($exec_number > count($handle_list) &&
$tasklist_pos < $tasklist_len)
{
for($i=$tasklist_pos; $i<$tasklist_len; )
{
$command = $tasklist[$i] ;
$handle_list[] = popen($command
tolog("begin task t "
$i++;
if($exec_number == count($handle_list)) break;
}
$tasklist_pos = $i;
}
//如果子進程列表空
if(
{
break;
}
//檢查子進程列表的輸出
$end_handle_keys = array();
foreach($handle_list as $key => $handle)
{
//$str = fgets($handle
$str = fread($handle
echo($str);
if(feof($handle))
{
$end_handle_keys[] = $key;
pclose($handle);
}
}
//踢出停掉的子進程
foreach($end_handle_keys as $key)
{
unset($handle_list[$key]);
//var_dump($handle_list);
//exit;
}
}
tolog("nn*******************end**********************nn"
附加一段Socket多進程接收的代碼
do {
if (($msgsock = socket_accept($sock)) <
echo "socket_accept() failed: reason: "
break;
}
$pid = pcntl_fork();
if ($pid ==
die(
} else if (!$pid) {
socket_write($msgsock
do {
} while (true);
socket_close($msgsock);
}
} while (true);
From:http://tw.wingwit.com/Article/program/PHP/201311/21087.html