当某些表数据量超大的情况下,用web请求来跑php很可能会超时.用shell就不会.
下面是我在厦门小鱼网在测试
升级的时候写的一个shell来驱动php来跑升级程序的一个step.可以使用其他的step 改下就好
.sh脚本的文件代码如下:
- #!/bin/sh
- #增量开始mid
- START=14503407;
- #增量前开始mid
- #START=0;
- #pw_msg最大mid
- MAXMID=15803407;
- #增量前最大mid
- #MAXMID=14503407;
- #批量执行条数
- RECORD=10000;
- PERCOUNT=10000;
- #转换程序step值
- STEP=30;
- if [ $START -eq 0 ];then
- #同步系统网络时间
- ntpdate 210.72.145.44;
- fi
- while [ $START -le $MAXMID ]
- do
- END=`expr $START + $RECORD`;
- if [ $END -ge $MAXMID ]; then
- END=$MAXMID;
- RECORD=`expr $END - $START`;
- fi
- echo "起始mid:"$START" 截止mid:"$END" 当前时间: "`date +%Y-%m-%d/%H:%M:%S`;
- #执行升级程序
- /usr/local/php/bin/php -e /home/wwwroot/pw/pw75/up75to85_msg.php $STEP $START $RECORD
- START=`expr $START + $PERCOUNT`;
- done
- echo "短消息数据升级完成,当前时间: "`date +%Y-%m-%d/%H:%M:%S`;
然后升级程序
脚本 需要改一下:
找到:
- foreach ($defined_vars as $_key => $_value) {
- if (!in_array($_key,array('GLOBALS','_POST','_GET','_COOKIE','_SERVER'))) {
- ${$_key} = '';
- unset(${$_key});
- }
- }
下下下方添加如下代码:
- //up75to85_msg.sh部分 by rickyleo
- $step = $GLOBALS['_SERVER']['argv']['1'];
- $start = $GLOBALS['_SERVER']['argv']['2'];
- $record = $GLOBALS['_SERVER']['argv']['3'];
- //sh end
然后找到:
- InitGP(array('step','start'));
注释掉.
升级脚本可以重命名一个,将原先的升级脚本的这一步骤直接跳过。然后这步单独拿出来跑,最后会有这么三个文件:
up75to85.php up75to85_msg.php up75to85_msg.sh
up75to85.php:修改就是将step=30的那步直接跳过
up75to85_msg.php:由up75to85_msg.sh来调用,在up75to85_msg.sh控制好start和end的区间值
上面加入了系统时间的更新和每次跳转结束时的时间,这样php就不会超时 跳转的时间也省了.这个拿来改下可以试用转换程序的一些需要增量转换的表 而且可以同时进行跑 挑战php和mysql的性能极限。最好是独立的服务器 可以将php和mysql的配置改的高一点比如:
php的memory_limit改的高一点,mysql的max_allowed_packet改的大一点,key_buffer_size和其他的buffersize改的高一点
升级另外整理了一份up75to85.sql的命令行文件用来改表结构和索引 也是可以大大提高
大站升级速度的.
最后附上整理好的脚本文件 75to85的版本
执行顺序:
1、up75to85.sql(mysql -uroot -ppassword --default-character-set=gbk 目标数据库 < 路径/up75to85.sql)
2、up75to85.php(web执行,注意要覆盖下升级包的lang和lib文件夹,lang下面还有自己的php脚本要跑,上次
华商网就是因为没跑吃了一次亏)
3、up75to85_msg.sh (驱动up75to85_msg.php)