為了網站SEO的需要,我在Drupal中安裝了第三方模塊pathauto,用于在頁面生成時自動産生一個帶有關鍵詞的URL别名。不過前一陣子導入數據的時候,pathauto的事先設置沒有做好,必須在設置好了以後将前面不符合規範的别名都删除,然後重新生成。
在菜單中有批量生成Alias的功能,但默認是每次生成50個,可以修改為幾百,再多了就會超時報錯,而且當需要重新生成的數量到10萬的時候,需要在Web頁面上操作數百次以上,很不現實,隻有設法編個程序來做了。
好在Drupal的用戶數量很大,被數十萬個網站采用,所以各種英文資料比較齊全,讨論留言中也可以找到很多有用信息。于是我搞了下面這個小程序來實現批量生成:
<?php
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秒,所以整個耗時還是很長的,如果中途遇到數據庫負載過高而連接中斷,可以重新繼續運行。
评论