为了网站SEO的需要,我在Drupal中安装了第三方模块pathauto,用于在页面生成时自动产生一个带有关键词的URL别名。不过前一阵子导入数据的时候,pathauto的事先设置没有做好,必须在设置好了以后将前面不符合规范的别名都删除,然后重新生成。
在菜单中有批量生成Alias的功能,但默认是每次生成50个,可以修改为几百,再多了就会超时报错,而且当需要重新生成的数量到10万的时候,需要在Web页面上操作数百次以上,很不现实,只有设法编个程序来做了。
好在Drupal的用户数量很大,被数十万个网站采用,所以各种英文资料比较齐全,讨论留言中也可以找到很多有用信息。于是我搞了下面这个小程序来实现批量生成:
include_once './includes/bootstrap.inc';
include_once './sites/all/modules/pathauto/pathauto.inc';
include_once './sites/all/modules/pathauto/pathauto_node.inc';
// The URL how you would normaly access your drupal site with a browser
$province="shanghai";
$once=100;
$times=1000;
$url = "http://$province.youbianku.com";
$drupal_base_url = parse_url($url);
$_SERVER['HTTP_HOST'] = $drupal_base_url['host'];
$_SERVER['PHP_SELF'] = $drupal_base_url['path'].'/index.php';
$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] = $_SERVER['PHP_SELF'];
$_SERVER['REMOTE_ADDR'] = NULL;
$_SERVER['REQUEST_METHOD'] = NULL;
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
variable_set('pathauto_max_bulk_update', $once);
for ($i=1;$i<=$times;$i++)
{
$start=time();
echo "$province: $i/$times*$once";
_pathauto_include();
$count=node_pathauto_bulkupdate();
if ($count==0) {exit('0 alias, Done!\n');}
$stop=time();
$pass=$stop-$start;
echo "; count=$count aliases; time=$pass seconds;\n";
}
echo "Done!\n";
?>
上面是以上海为例,每次生成100个,最多运行1000次。实际使用中每次都需要10-20秒,所以整个耗时还是很长的,如果中途遇到数据库负载过高而连接中断,可以重新继续运行。