skip to content

pmwiki 昨天说到已经将我的主页改为PmWiki的构架,刚才忙活了一晚上,终于全部搞定了,于是写下来。

PmWiki 简介:PmWiki 是一个不需要数据库的以PHP为主要语言编写的wiki,遵循General Public License (GPL)协议,小巧方便,很适合个人网站用来制作规模不大的互动资源平台。

我的安装平台:Windows XP Pro SP1 + Apache-1.3.* + PHP-4.3.* 理论上可拖宽为:Windows + Apache/IIS + PHP 本文不讨论 PmWiki 的使用问题,几乎任何使用上的问题都可以在其帮助文档中找到详细的说明,并且已经有人开始汉化这些文档了,还可以参见zhengPmWiki 学习笔记

下载&安装

  1. 下载 PmWiki 的最新版,我使用的是目前最新的 0.5.27 版:pmwiki-0.5.27.zip
  2. 解压缩至目标文件夹,或解压缩之后 FTP 上传到你的服务器的相应目录。
  3. 无需任何配置,直接使用浏览器访问 pmwiki.php,如果一切正常,应该看到一个默认的欢迎页面说你已经安装成功了。

呵呵,就是那么容易上手。不过要在 windows 下能够完全使用 PmWiki,并且让他对于简体中文有良好的支持的话,还必须进行一些必要的设置。接下去的工作稍微有点繁琐。

默认的 PmWiki 需要 Web 服务器开启 PATH_INFO,以支持类似http://www.xdanger.com/index.php/Main/HomePage这样的 URL 美化。关于为何要以这样的形式表现 URL,PATH_INFO 的具体介绍以及如何在 IIS 上利用 PHP 支持 PATH_INFO,可以参考车东的文章:“Search Engine Friendly 的 URL 设计”。虽然 PmWiki 会自动测试服务器是否开启 PATH_INFO 而输出不同的 URL 格式,但是强烈建议你尽量开启使用这一功能,原因还是参见车东的这篇文章。

PATH_INFO 是一个 CGI 1.1 的标准,在 Apache 1.3.*上默认开启,但是在 Apache-2.*上默认是不开启的,需要在 http.conf 中的相应位置设置

AcceptPathInfo on

如果是虚拟主机用户的话,只能期望于你的 Apache 在你 web 目录下设置了

AllowOverride FileInfo

这样就可以上传一个.htaccess 的文件到 pmwiki 的目录下,内容为

AcceptPathInfo on

否则就只能放弃这一功能。

配置 local.php

PmWiki 允许你将配置文件单独存放于 local/目录下,或者是 PmWiki 的根目录,命名为 local.php(可以将 scripts/sample-local.php 移动到 PmWiki 安装的根目录或 local/ 目录,改名即可)。这样可以避免直接修改 pmwiki.php 的主程序,以防升级时被覆盖掉。你可以将 pmwiki.php 内主程序之前的所有 php 内容(原版 pmwiki.php 的第 29-210 行)都复制出来,放在 local.php 内,并且以 php 标识符 <?PHP ?> 包裹起来(好的习惯是 PHP 三个字母大写,原因这里就不说了)。然后就可以在 local.php 内修改一些参数。以下只介绍常用的一些:

  • $WikiTitle :所有页面的 <title></title> 都会以这个字符串开始。可以放上网站的名称,我的就是 <font color="#0000ff">:+:xdanger:+:</font> :-)。

  • $ScriptUrl :pmwiki.php 的 URL。可以填:

    $ScriptUrl = 'http://'.$HTTP_SERVER_VARS['HTTP_HOST'].$HTTP_SERVER_VARS['SCRIPT_NAME'];

    如果是 PHP 4.1.0+ 的话,建议使用:

    $ScriptUrl = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'];
  • $ScriptDir :如果你修改过$ScriptUrl,那就必须增加次项:

    $ScriptDir = preg_replace("#/[^/]*$#","",$ScriptUrl,1);
  • $WikiImgUrl :默认左上角 Logo 的图片路径。

  • $DiffKeepDays :页面修改历史的保存天数。

  • $WikiDir :自定义页面的存放路径。

  • $WikiLibDirs :默认存在的页面的存放路径,此项和$WikiDir 分开设置是为了防止升级时覆盖已有页面。如果你在上面修改过$WikiDir,那就必须设置此项:

    $WikiLibDirs = array(&$WikiDir,"wikilib.d");
  • $SysDiffCmd :这个参数和以下的$SysPathCmd 在 Windows 下必须修改,后文会提到如何配置。

  • $SysPatchCmd

  • $DefaultPasswords :密码的概念有点复杂,详细的文档可以参考PmWiki 的帮助文档,这里有一个汉化的版本

  • 还有一些页面显示的参数,基本都很容易看懂。

解决 Windows 下 Page Revisions 无效

关于这个问题的解决,完全参考了王建硕的文章:PmWiki Successfully Installed on Windows 2000。不过由于是英文的,我再简单地描述一遍。

情况:随意编辑一个页面,保存,然后在页面的右上或左下有一个”Edit Page”的连接,进入后随意编辑,保存。然后点 Page Revisions,看到的都是一个空的表格。再多编辑几次,这页始终都是一个个空的表格,只有日期,并没有页面修改的历史记录,而正常的情况应该是这样的。不能显示编辑记录当然就不能随意开放编辑权限,否则辛辛苦苦整理的东东随时可能被人家有意或无意地删除掉而不能恢复。不开放编辑功能就不能谈得上是 Wiki 了。不过还好,这个问题还是比较容易地解决了。

  1. sf.net下载GNU 的 Win32版本。快捷链接:diffutilspatch

  2. 双击下载的 diffutils-2.8.1-3-bin.exe 安装。建议修改默认的安装目录

    C:\Program Files\GnuWin32\

    C:\GnuWin32\

    这些*nix 转化过来的程序最好绝对路径中都不要包含空格,否则基本都会出错。这个也不例外,虽然可以成功安装,但是等一下还是无法使用。

  3. 将下载的 patch-2.5.4-3-bin.exe 更名为 patch.exe 放到 C:\GnuWin32\bin\下。

  4. 设置 local.php,加上刚才没有设置的 SysDiffCmdSysDiffCmd 和 DefaultPasswords:

    $SysDiffCmd = 'C:\\GnuWin32\\bin\\diff.exe';
    $SysPatchCmd = 'C:\\GnuWin32\\bin\\patch.exe';

解决与简体中文的不兼容

关于解决这个问题,可以参考这篇文章:http://www.pmichaud.com/wiki/Cookbook/ChineseSupportGB2312

主要就是内建的换行符需要改一下,修改 pmwiki.php,他的是按照 0.5.5 版的,我稍加修改了几个函数,行号对应于 0.5.7 版,步骤如下:

  1. Line 207~209:

    $Newline = "\262";
    $KeepToken = "\263";
    $LinkToken = "\264";

    改为

    $Newline = "\x81"; //$Newline = "\262";
    $KeepToken = "\x82"; //$KeepToken = "\263";
    $LinkToken = "\x83"; //$LinkToken = "\264";
  2. 新建函数 Patch_GB2312() 和 Patch_BackOld():

    function Patch_GB2312($pagefilename){
    global $Newline,$KeepToken,$LinkToken,$WikiLibDirs;
    if (file_exists($WikiLibDirs[1]."/".$pagefilename)&!file_exists($WikiLibDirs[0]."/".$pagefilename)){
    $Newline = "\262";
    $KeepToken = "\263";
    $LinkToken = "\264";
    }
    }
    function Patch_BackOld(){
    global $Newline,$KeepToken,$LinkToken;
    $Newline = "\262";
    $KeepToken = "\263";
    $LinkToken = "\264";
    }
  3. 修改 HandleBrowse() 的 Line867 和 HandleEdit() 的 Line 890:

    if (!$page) {Abort("Invalid page name");}

    改为

    if (!$page) {Abort("Invalid page name");}
    Patch_GB2312($pagename);
  4. 修改 Line 897:

    $HTMLTitle = "Edit $pagename";$GCount = 0;

    改为:

    $HTMLTitle = "Edit $pagename";$GCount = 0;
    Patch_BackOld();
  5. 最后别忘了在HTTPHeaders(如果local.php里有的HTTPHeaders(如果 local.php 里有的HTTPHeaders 话,在 local.php 里修改)中,将 charset 设为 gb2312。

这个方法不适合 UTF-8 的编码方式。