随着网站的成长,网站改版也是常事儿。有时候不得不对数据进行迁移,对于从A库转移到B库,从A表转移到B表。咱们通常的想法就是写一个PHP脚本而后再浏览器窗口进行循环进行导入。可是浏览器执行php要走dns、http协议这些,无形中处理数据的效率会大打折扣。那何不在linux下面直接执行php脚本呢? php
遇到的问题
1.如何像在浏览器中那样得到$_GET参数呢?
须要使用$argv - 传递给脚本的参数数组
linux
[root@bogon wwwroot]# php test.php page 1 cateid 120 Array ( [0] => test.php [1] => page [2] => 1 [3] => cateid [4] => 120 )test.php源码
<?php print_r($argv);2.如何记录php运行日志呢?
一开始,我是在php中写脚本,将执行完的数据id存储到一个文本中,循环一次就是执行一次文本操做。这种方式虽然能够实现个人要求,可是不够灵活,须要考虑文本文件是否可写。如今的解决办法是让php脚本把记录id echo 出来而后用下面这个命令就能够实现日记记录啦。 shell
/usr/local/php/bin/php /usr/local/src/work.php > id.log
是否是很方便呢? 数组
3.如何让php脚本后台执行呢?
在本机的虚拟机上执行php脚本,下班后电脑一关就没有办法执行了。而导数据是一个慢功夫,可能须要一天一晚上,因此通常都是部门内部的服务器上执行php脚本,可是我已关闭终端,脚本就再也不执行了。所以,如何关闭终端后脚本还正常执行呢?如上面提到的命令,能够进行一些改造。 浏览器
nohup /usr/local/php/bin/php /usr/local/src/work.php > id.log &这样即使是关闭了终端,这个命令也能够做为一个后台进程继续执行下去。知道把数据处理完成为止。
4.数据转移就是一条条数据的转移确定是要用到循环的,这循环怎么写呢?这个页码又该如何保持呢?
先看一段伪代码吧 服务器
while (1) { if ($page < $count) { 执行处理的脚本 } else { break; } }使用while(1)做为死循环,只要不知足跳出的条件就一直执行下去。那个$page每循环一次都要加1的,而这个$page能够存到内存中,一开始我采用的是将$page的值存到memcache里面,虽然能够实现可是,代码的移植性不好,何不把$page的值存到静态变量里面呢,其实静态变量是内存中开了一个空间而已,并且实现起来也比较简单。由于个人到数据脚本是面向过程的,没有专门去研究如何封装,反正也不让别人用本身用着顺手就好了,因此代码质量比较槽,不过能完整需求。我专门写了一个计数器类。代码以下:
class counter { public static $counter = 0; function __construct($counter = 0) { self::$counter = $counter; } public static function getCounter() { self::$counter ++; return self::$counter; } }以上内容是我我的的一些总结,可能不够专业,但愿给位oschina的高手们多指点。