最近在做项目的时候,需求有所变动,所以要增加单表字段,这就牵扯到了数据表的更新,但表中数据过于庞大不能单进程取更新数据,否则8w条数据得更新大半天。ps:此方法推荐本地自测用,不适合实际项目应用,还有PCNTL只支持linux,所以用win的朋友们还是循环分批更新吧
首先还是linux中PCNTL拓展安装
1、查询自己的php版本号,我用的是phpstudy php5.4
2、检查是否安装PCNTL扩展(没安装会显示标红段,我已经安装过了)
3、去php.net下载php5.4的tar包(官网现在最低版本的包是5.5版本,所以想要5.3和5.4的请点击下面的链接)
http://pan.baidu.com/s/1geBMW3D 密码:8zd6
4、解压php5.4包
5、解压后进入
6、执行phpize(若执行报错Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this script.请看6.1)
6.1
# yum install m4
# yum install autoconf
7、执行
8、执行
9、复制pcntl.so到extension下
10、打开php.ini编辑,增加最后一行,保存退出
11、phpinfo查看
安装好后就可以进行下面的操作,sql语句请自行填写
header('Content-Type:text/html;charset=utf-8;');
set_time_limit(0);
//mysqli连接数据库
$link = mysqli_connect('192.168.0.168','root','root','tsbbc');
if(!$link)
{
printf("Can't connect to Mysql Server Errocode.%s:",mysqli_connect_error());
die;
}
else
{
echo '数据库连接成功<br /><br />';
}
//common_id是主键
$result = mysqli_query($link,$sql);
$row = mysqli_fetch_all($result);
mysqli_close($link);
echo '开始时间:'.microtime().'<br />';
//数据大约有80000条
$max = count($row);
$worke = 60;
$pids = array();
for($i = 0;$i<$worke;$i++)
{
$pids[$i] = pcntl_fork();
switch ($pids[$i])
{
case -1:
echo 'fork error'.$i.' <br />';
exit;
case 0:
$param = array(
'lastid'=>ceil($max/$work*$i),
'maxid'=>ceil($max/$worke*($i+1))
);
runCommon($row,$param);
exit;
default:
break;
}
}
foreach($pids as $key=>$value)
{
if($value)
{
pcntl_waitpid($value,$status);
}
}
echo '结束时间:'.microtime();
function runCommon($row,$param)
{
$link = mysqli_connect('192.168.0.168','root','root','tsbbc');
for($i=$param['lastid'];$i<$param['maxid'];$i++)
{
$sql = $sql;
$link->multi_query($sql);
}
mysqli_close($link);
}