65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 SQL Anywhere 和 Wordpress 构建博客服务器

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2008 年 5 月 27 日

CPOL

5分钟阅读

viewsIcon

28390

如何使用 SQL Anywhere 和 Wordpress 创建自己的博客平台

在本文中,我们将介绍如何将任何 PHP 数据库应用程序迁移到 SQL Anywhere 的基础知识。SQL Anywhere 是一款占地空间小、自管理、功能齐全的关系型数据库,提供企业级数据库的所有功能,但可以在普通硬件上运行,管理成本极低。此外,SQL Anywhere 还提供强大、高性能的双向同步功能,让您可以轻松地将 SQL Anywhere 数据库应用程序与现有的企业数据中心集成。

我们将使用流行的 PHP 博客应用程序 Wordpress 来演示。我们将为 SQL Anywhere 构建一个插件,该插件可以直接集成到标准的 Wordpress 安装中,并且无需对 Wordpress 代码进行任何其他更改,即可让您使用 SQL Anywhere。本文假设您已经安装并运行了支持 PHP 的 Web 服务器,并且机器上安装了 SQL Anywhere。在我们的设置中,我使用了 Apache 2、PHP 5、Wordpress 2.3.3 和 SQL Anywhere 10,并在 Windows 和 Linux 上测试了该解决方案。

从标准的 Wordpress 安装开始,将 `wp-db.php` 文件从 `wp-admin` 文件夹复制到名为 `wp-content\db.php` 的文件中。此文件名和位置很重要,因为 Wordpress 软件在访问站点时会查找此文件,如果存在,它将使用它而不是默认的 `wp-db.php` 文件。这使您可以为 Wordpress 插入自己的数据库访问层。现在我们需要修改此文件,以便使其与 SQL Anywhere 配合使用。

SQL Anywhere PHP 驱动程序支持与 MySQL 类似的 API,因此快速搜索并替换 `mysql_` 为 `sqlanywhere_` 大部分迁移工作就完成了。

例如:`mysql_connect()` 变为 `sqlanywhere_connect()`

MySQL 和 SQL Anywhere 的连接字符串格式不同,但它们都使用相同的基础数据(用户、密码、服务器位置、数据库)。转换连接字符串非常简单。

//MySQL connection
$this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword);
 
//SQL Anywhere connection
$connstr= 
    "eng=" . $dbhost . ";uid=" . $dbuser . ";pwd=" . 
    $dbpassword . ";dbn=" . $dbname . ";links=shmem,tcpip";

$this->dbh = @sqlanywhere_connect($connstr);

理想情况下,您只需做到这些就够了。但是,在开始撰写博客之前,还需要进行其他一些更改。首先是将数据库模式迁移到 SQL Anywhere 格式。这可以通过使用 SQL Anywhere 迁移向导轻松完成。

image001.jpg

然而,要构建一个更通用的解决方案,以便您可以无缝地在标准 Wordpress 安装中使用 SQL Anywhere,并且任何人都可以通过 Wordpress 应用程序创建新的 Wordpress 博客,还需要更多工作才能使博客创建正常工作。

主要的变化是替换 Wordpress 的 `wp_install()` 函数。对于 SQL Anywhere,将创建一个现有 `wp_install()` 函数的克隆,并添加两个函数并从 `wp_install` 调用它们。

function wp_install($blog_title, $user_name, $user_email, $public, $meta='') {
     global $wp_rewrite, $wpdb;
     wp_cache_flush();
     //Reset schema information
     define_sa_schema();
     make_db_current_silent();
     create_sa_functions();
...

`define_sa_schema()` 过程基本上重新定义了全局变量 `$wp_queries`,以使用 SQL Anywhere 语法创建 Wordpress 模式表,而不是默认的 MySQL 语法。有关该函数的完整列表,请参见此处。

`create_sa_functions()` 过程创建了一些用户定义函数,这些函数在 SQL Anywhere 中不是内置的。SQL Anywhere 支持这些函数的功能,因此我只需将它们添加为具有相同名称的 UDF,并将它们映射到 SQL Anywhere 功能。

例如:

function create_sa_functions() {
    global $wpdb; 
 
    $wpdb->query( " 
        IF NOT EXISTS( select * from sysprocedure where proc_name = 'MD5' ) THEN
            CREATE FUNCTION MD5( str varchar(255) ) 
            RETURNS binary(32)
            BEGIN
                return HASH( str, 'MD5' );
            END;
        END IF;");
...

您可以在此处获取此函数的完整列表。此时,您可以指向您的 Wordpress 主页的浏览器,并成功创建一个新的、空的博客。

现在我们有了一个新博客,为了实际创建/查看博客文章并使用其他 Wordpress 博客管理工具,我们必须修改 MySQL 特定的语法,以便 SQL Anywhere 可以接受。同样,最简单的方法是遍历 Wordpress 安装文件并修改所有不正确的语法以进行修复。但是,对于更通用的解决方案,重写我们 `db.php` 文件中的查询可以更容易地将 SQL Anywhere 作为 DBMS 安装到新的 Wordpress 安装中,并且还可以使 Wordpress 软件的维护和升级更加容易。

幸运的是,这个问题很容易解决,因为 SQL Anywhere 支持 Wordpress 中使用的所有 MySQL 功能。但是,SQL Anywhere 使用不同的语法(SQL Anywhere 在大多数情况下遵循 ANSI,在没有 ANSI 规范的 SQL 结构时,它更接近 Microsoft SQL Server 语法而不是 MySQL 语法)。因此,我们需要一种方法来映射 `db.php` 文件中的语法。通过搜索和替换以及正则表达式。映射语法的最简单方法是构建一个在任何查询执行之前调用的“重写”函数。

幸运的是,在 Wordpress 中,所有查询都通过一个在我们的 `db.php` 文件中实现的“查询”函数,因此我们所要做的就是添加新的重写函数并从 `query()` 函数调用它。

`rewrite_query()` 函数基本上搜索特定的查询结构并将它们重写为所需的格式。例如,`LIMIT` 子句在 Wordpress 中被广泛使用。SQL Anywhere 使用 `TOP N` 子句具有等效的行为。要重写这些查询,我在重写函数中使用了以下代码。

//Find LIMIT clause integer arguments and replace with TOP N START AT m
//MySQL syntax for LIMIT is:
//  LIMIT {[offset,] row_count | row_count OFFSET offset}]
//Note that the LIMIT clause is at the end of the query
 
// pattern is LIMIT followed by an integer, possibly 
// followed by a comma and another integer
$pattern = "/LIMIT\s*(\d+)((\s*,?\s*)(\d+)*)/i";  
$matched = preg_match( $pattern, $query, $limitmatches );
if( $matched == 1 ) {
    //Remove the LIMIT statement, replace offset 0 with 1
    $query = preg_replace( $pattern, '', $query);
    if( count( $limitmatches ) == 5 ) {
        if( $limitmatches[1] == '0' ) {
            $limitmatches[1] = '1';
        }
        $replacement = 'SELECT TOP '.$limitmatches[4].' START AT '.$limitmatches[1].' ';
    } else {
        $replacement = 'SELECT TOP '.$limitmatches[1].' ';
    }    
    $query = preg_replace( '/^\s*SELECT\s*/i', $replacement, $query );

我必须对其他几个构造执行此操作,但完成后,我将它们打包到 `rewrite_query()` 函数中。有关重写函数的完整列表,请参见此处的。

此时,博客已完全可用。您可以创建新博客,并运行所有管理功能。最棒的部分是,您有一个单一文件(`db.php`),您可以将其放入任何 Wordpress 安装中,将其从 MySQL 迁移到 SQL Anywhere。使用 SQL Anywhere 迁移向导,您还可以迁移现有博客,包括带有博客条目的内容到 SQL Anywhere 数据库。您还可以使用此相同技术将任何基于 PHP 的数据库应用程序迁移到 SQL Anywhere。

要查看使用此修改版本的 Wordpress 的博客示例,请在此处访问。

联系作者以获取 `db.php` 完整文件的最新修订版本。

© . All rights reserved.