紫岩

紫岩
posts - 3, comments - 1, trackbacks - 0, articles - 8
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2007年6月28日

原文:http://xajax.sourceforge.net/
英文原版:Copyright © 2005 J. Max Wilson
简体中文翻译:HonestQiao(乔楚)/2005-12-7 17:23/(第一版)
什么是xajax?
xajax如何工作?
为什么我要使用xajax代替其他PHP的Ajax库?
如何在我的PHP脚本之中使用xajax?
如何异步更新内容?
如何异步处理表单数据?
如何给xajax增加定制功能?
我能在私有或者收费产品之中使用xajax吗?
什么是xajax?
Xajax是一个开源的 PHP 类库 它能够让你黏合HTML、CSS、JavaScript和PHP,轻而易举的开发功能强大、基于WEB的AJAX应用软件. 使用xajax开发的应用软件,无需重新调入页面,就能够异步调用服务器端的PHP函数和更新内容.

xajax 如何工作?
你的应用软件需要异步调用的PHP函数, xajax的PHP对象都生成了对应的封装好了的JavaScript函数. 当被调用时,封装的函数使用JavaScript的XMLHttpRequest对象与服务器异步通讯,调用xajax对象对应的PHP函数. 调用结束后, PHP函数由xajax返回一个xajax的XML响应传递给应用程序. XML响应包含了特定的指令和数据,他们可以被xajax的JavaScript消息分析器解析,并且被用于更新你的应用程序的内容.


为什么我要使用xajax代替其他PHP的ajax库?
你应该选择一个最是和你的项目需要的库.
xajax 提供了以下的功能, 它们使得ajax富有特色而又功能强大:

Xajax特殊的 XML 响应 / javascript 消息分析系统 帮助你做到, 自动的处理函数返回的数据,按照PHP函数返回的指令更新内容或者状态. 因为xajax作了这些工作Because xajax does the work, 你不需要写javascript的回调处理函数.

Xajax反对将代码和数据紧密地杂糅在一起的主张, 并且保持xajax的代码从与他代码分离. 因为它是对象构造的, 你可以加上自己定制的功能给xajax去扩展xajaxResponse 类和使用addScript方法.
xajax 可以工作在 Firefox, Mozilla, 大部分基于 Mozilla 的浏览器, Internet Explorer, 和 Safari.

除了更新元素的值和内含的HTML内容(innerHTML), xajax 还能用于更新样式(styles), css 类, 多选和单选按钮选择,甚至可以更新任何元素的属性.

xajax 支持使用一维或者多维数组、关联数组(哈希数组) 作为xajax函数的参数从javascript传送给PHP. 反之Additionally, 如果你传送一个javascript的对象给xajax函数,PHP函数将接受一个描叙对象属性的关联数组(哈希数组).

xajax 提供了一种简单的异步表单处理方式. 使用 xajax.getFormValues() javascript 方法, 你可以轻而易举的在表单之中提交一个描绘值的数组作为参数传送到xajax异步处理函数:
xajax_processForm(xajax.getFormValues('formId');
它可以处理复杂的input 元素名称 ,例如 "checkbox[][]" 或者 "name[first]" 产生的多维或者关联数组(哈希数组), 就是普通提交表单那样使用PHP的$_GET数组

使用xajax你可以动态的发送附加的javascript作为请求的响应到你的应用软件中运行,而这就和动态的更新元素的属性一样方便.

Xajax会自动比较PHP函数返回的数据与你已经标记需要修改的元素属性. 只有当新的数据确实可以改变现有的属性,属性才会真的被更新. 这将可消除程序在一定时间间隔内更新与当前内容相同或者不同的内容而出现的明显的闪烁.

每一个通过xajax简单注册的函数都可以有不同的请求方式. 所有的函数默认使用POST方式,除非你明确的指定使用GET方式. 如果使用GET请求,你必须非常明确的考虑它确实是你所需要的

如果没有指定URI,xajax将设法自动确定脚本的URI. Xajax的自动确定算法经过了充分的验证,确保在大部分HTTPS或者未知端口的HTTP服务器上也可以正常的工作.

Xajax使用UTF8编码所有的请求和响应,以确保支持绝大部分的字符和语言. Xajax已经成功测试了多种不同的UNICODE字符,包括Spanish, Russian, Arabic, and Hebrew

几乎所有xajax生成的javascript都可以通过动态的外部javascript包含到你的web程序之中. 当你在浏览器之中查看程序的源代码时,不会有JavaScript的函数定义混杂在HTML标记之中.

Xajax可以使用在Smarty模板系统之中,仅仅需要创建一个smarty变量就可以包含xajax的javascript:
$smarty->assign('xajax_javascript', $xajax->getJavascript());
然后你可以使用在header模版之中使用
{$xajax_javascript}
从而把xajax应用到你的站点.


如何在我的PHP脚本之中使用xajax?
Xajax的设计是如此的富有特色,以至于不管是已有的web程序还是新的项目,它都能够被极其简单的部署和应用. 仅仅需要七步,你就可以在几乎任何PHP脚本之中加入xajax的强大功能:


包含xajax类库:
require_once("xajax.inc.php");
实例化xajax 对象:
$xajax = new xajax();
注册你需要通过xajax调用的PHP函数的名称:
$xajax->registerFunction("myFunction");
编写注册的PHP函数,并且在函数之中使用xajaxResponse 对象返回XML指令:
function myFunction($arg)
{
   // 对$arg做一些基本处理例如从数据库检索数据
   // 然后把结果赋值给变量,例如$newContent
  
   // 实例化xajaxResponse 对象
   $objResponse = new xajaxResponse();
  
   // 添加指令到响应之中,用于指派
   //指定元素(例如id="SomeElementId")的innerHTML属性的新的内容
   $objResponse->addAssign("SomeElementId","innerHTML", $newContent);
  
   //返回xajaxResponse 对象生成的XML响应
   return $objResponse->getXML();
}
在你的脚本输出任何信息之前,调用xajax用于接管请求:
$xajax->processRequests();
在页面的 <head></head> 标签之间, 告诉xajax生成所必需的JavaScript:
<?php $xajax->printJavascript(); ?>
在程序中,从JavaScript事件或者函数调用前面注册的函数:
<div id="SomeElementId"></div>
<button onclick="xajax_myFunction(SomeArgument);">


就这么简单. xajax 会处理其他所有的事情. 你所要做的主要工作就是编写PHP函数,然后从函数之中返回xajax的XML响应。而后者通过xajaxResponse类可以非常简单的生成.


如何异步更新内容?
Xajax最富有特色的功能或许就是xajaxResponse类. 其他的Ajax库需要你自己编写JavaScript的回调句柄去处理一个异步请求返回的数据并更新内容. xajax, 从另外一个角度来说, 允许你使用PHP简单的控制内容. xajaxResponse 让你在PHP函数之中创建XML指令返回给你的程序. XML将被xajax的消息分析器解析,指令将告诉xajax如何更新程序的内容和状态. xajaxResponse类目前提供了以下指令:


addAssign($sTargetId,$sAttribute,$sData)
给命名为$sTargetId的元素的$sAttribute属性赋值$sData
$objResponse->addAssign("contentDiv","innerHTML","Some Text");
$objResponse->addAssign("checkBox1","checked","true");

addAppend($sTargetId,$sAttribute,$sData)
给命名为$sTargetId的元素的$sAttribute属性追加值$sData
$objResponse->addAppend("contentDiv","innerHTML","Some Text");

addPrepend($sTargetId,$sAttribute,$sData)
预备给命名为$sTargetId的元素的$sAttribute属性赋值$sData
$objResponse->addPrepend("contentDiv","innerHTML","Some Text");

addReplace($sTargetId,$sAttribute,$sSearch,$sData)
替换命名为$sTargetId的元素的$sAttribute属性的值之中的$sSearch为$sData
$objResponse->addReplace("contentDiv","innerHTML","text","<strong>text</strong>");

addClear($sTargetId,$sAttribute)
清空命名为$sTargetId的元素的$sAttribute属性的值
$objResponse->addClear("Input1","value");

addCreate($sParentId, $sTagname, $sId, $sType)
在已经存在的命名为$sParentId的元素下添加一个名叫$sTagName的子元素,并且把他的id赋值为$sId,可选的类型赋值为 $sType.
$objResponse->addCreate("form1","input", "pass", "password");

addRemove($sElementId)
从你的程序之中移除命名为$sElementId的元素
$objResponse->addRemove("div1");

addAlert($sMsg)
显示一个内容为 $sMsg 的警告框(JavaScript的Alert)
$objResponse->addAlert("This is some text");

addScript($sJS)
执行JavaScript代码 $sJS (演示代码原文有误)
$objResponse->addScript("var txt = prompt('get some text');");

一个独立的XML响应可能包含多个指令, 他们将按照加入响应的顺序执行. 让我们用一个用户在你的程序之中点击按钮为例来进行说明. Onclick事件调用PHP函数对应的javascript封装.这个封装通过XMLHttpRequest发送异步请求到服务器给xajax调用PHP函数. PHP函数做了一次数据库查询, 处理了一些数据, 或者序列化. 然后你使用xajaxResponse类生成包含多个指令的xajax的XML响应 ,并回送给xajax的消息分析器执行:


    $objResponse = new xajaxResponse();
    $objResponse.addAssign("myInput1","value",$DataFromDatabase);
    $objResponse.addAssign("myInput1","style.color","red");
    $objResponse.addAppend("myDiv1","innerHTML",$DataFromDatabase2);
    $objResponse.addPrepend("myDiv2","innerHTML",$DataFromDatabase3);
    $objResponse.addReplace("myDiv3","innerHTML","xajax","<strong>xajax</strong>");
    $objResponse.addScript("var x = prompt("Enter Your Name");");
           
    return $objResponse->getXML();
 
    $objResponse = new xajaxResponse();
    $objResponse.addAssign("myInput1","value",$DataFromDatabase);
    $objResponse.addAssign("myInput1","style.color","red");
    $objResponse.addAppend("myDiv1","innerHTML",$DataFromDatabase2);
    $objResponse.addPrepend("myDiv2","innerHTML",$DataFromDatabase3);
    $objResponse.addReplace("myDiv3","innerHTML","xajax","<strong>xajax</strong>");
    $objResponse.addScript("var x = prompt("Enter Your Name");");
    return $objResponse->getXML();

xajax消息分析器将会解析XML消息,并执行以下工作:
id为myInput1的元素的值将被赋值为 $DataFromDatabase的数据.
id为myInput1的元素的颜色将会变为red.
$DataFromDatabase2的数据会被追加到id为myDiv1的元素innerHTML之中.
$DataFromDatabase3的数据会被预先赋值给id为myDiv2的元素innerHTML之中.
id为myDiv3的元素的innerHTML 之中所有的"xajax"将被替换为"<strong>xajax</strong>"; 使得所有的单词 xajax 显示加粗.
一个提示框将会显示,用来询问用户姓名,从提示框返回的值会被命名为x的javascript变量接收.
所有这些都由构成的PHP函数在服务器端执行并返回xajax的XML响应.

 

如何异步处理表单数据?
Xajax使得异步处理表单数句非常非常的简单. xajax.getFormValues()方法会自动的从表单提取数据,并作为一个参数提交给xajax注册的PHP函数.
xajax.getFormValues() 仅仅需要一个参数, 可以是你需要处理得表单的id, 或者是一个实际的表单对象. 你也可以使用xajax.getFormValues作为一个参数给xajax 函数, 例如:
xajax_processFormData(xajax.getFormValues('formId'));
xajax 会生成一个与表单数据对应的请求字符串给xajax服务器解析,然后以一个与表单数据对应的数组传递给PHP函数,就想你提交表单使用PHP的$_GET数组那么简单.
Xajax可以处理类似普通多维数组或者联合数组(哈希数组)等形式的复杂输入名字. 例如, 如果一个表单有三个多选框(checkboxes)并且都命名为 "checkbox[]", 但是值分别为 "check1", "check2", 和 "check3", 然后使用 xajax.getFormValues 函数作为参数传递给xajax 函数, 则 PHP 函数会接受到一个如下的数组:
array (
  'checkbox' =>
  array (
    0 => 'check1',
    1 => 'check2',
    2 => 'check3',
  ),
)
作为函数参数的数组的结构与传统意义上提交表单之后的$_GET数组的结构相同. 你可以访问数组之中的checkbox 的数据: $aFormData['checkbox'][0]


如何给xajax增加定制功能?
Xajax可以使用各种服加的用户定制功能进行扩展. 正因为xajax是完全面向对象的,并且可以使用xajaxResponse的addScript()方法,所以他具有无限扩展的可能. 你可以创建你自己的xajax响应类,来继承xajaxResponse 类以及它的方法,并加上你自己定制的响应. 让我们用一个定制的增加选择组合框(select combo boxes)选项的响应指令的例子来说明. 你可以象下面这样扩展xajaxResponse 类:
class myXajaxResponse extends xajaxResponse

  function addAddOption($sSelectId, $sOptionText, $sOptionValue) 
  { 
    $sScript  = "var objOption = new Option('".$sOptionText."','".$sOptionValue."');";
    $sScript .= "document.getElementById('".$sSelectId."').options.add(objOption);";
    $this->addScript($sScript);
  }
}
现在, 取代xajaxResponse 对象的初始化, 把你自己的 myXajaxResponse 对象的初始化定义到你的 xajax PHP 函数之中:
$objResponse = new myXajaxResponse();
$objResponse->addAssign("div1", "innerHTML", "Some Text"); 
$objResponse->addAddOption("select1","New Option","13"); 
 
return $objResponse->getXML();
被调用时,这个方法将会发送需要的javascript到页面并执行. 当然你也有另外一种做法Alternatively, 你可以在你的程序之中创建一个如下的javascript函数:
<script type="text/javascript">
function addOption(selectId,txt,val)
{
        var objOption = new Option(txt,val);
        document.getElementById(selectId).options.add(objOption);
}
</script>
并且使用addScript() 调用这个方法:
$objResponse->addScript("addOption('select1','New Option','13');");


我能在私有或者收费产品之中使用xajax吗?
简而言之: 能,只要你愿意.
xajax PHP 类库的发布遵循 GNU Lesser General Public License (LGPL).
 


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=873441

posted @ 2007-06-28 22:34 紫岩 阅读(130) | 评论 (0)编辑 收藏

2007年6月15日

Linux环境下的软件安装,并不是一件容易的事情;如果通过源代码编译后在安装,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不 离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而解了。Configure脚本配置工具就是基础之一,它是autoconf的工具的基本应用。
  
  与一些技巧相比,Configure显得基础一些,当然使用和学习起来就显得枯燥乏味一些,当然要成为高手,对基础的熟悉不能超越哦。
  
  为此我转载了一篇关于Configure选项配置的详细介绍。供大家参考

   'configure'脚本有大量的命令行选项.对不同的软件包来说,这些选项可能会有变化,但是许多基本的选项是不会改变的.带上'--help'选 项执行'configure'脚本可以看到可用的所有选项.尽管许多选项是很少用到的,但是当你为了特殊的需求而configure一个包时,知道他们的 存在是很有益处的.下面对每一个选项进行简略的介绍:

--cache-file=FILE
  'configure'会在你的系 统上测试存在的特性(或者bug!).为了加速随后进行的配置,测试的结果会存储在一个cache file里.当configure一个每个子树里都有'configure'脚本的复杂的源码树时,一个很好的cache file的存在会有很大帮助.

--help
  输出帮助信息.即使是有经验的用户也偶尔需要使用使用'--help'选项,因为一个复杂的项目会包含附加的选项.例如,GCC包里的'configure'脚本就包含了允许你控制是否生成和在GCC中使用GNU汇编器的选项.

--no-create
  'configure'中的一个主要函数会制作输出文件.此选项阻止'configure'生成这个文件.你可以认为这是一种演习(dry run),尽管缓存(cache)仍然被改写了.

--quiet
--silent
   当'configure'进行他的测试时,会输出简要的信息来告诉用户正在作什么.这样作是因为'configure'可能会比较慢,没有这种输出的话 用户将会被扔在一旁疑惑正在发生什么.使用这两个选项中的任何一个都会把你扔到一旁.(译注:这两句话比较有意思,原文是这样的:If there was no such output, the user would be left wondering what is happening. By using this option, you too can be left wondering!)

--version
  打印用来产生'configure'脚本的Autoconf的版本号.

--prefix=PEWFIX
   '--prefix'是最常用的选项.制作出的'Makefile'会查看随此选项传递的参数,当一个包在安装时可以彻底的重新安置他的结构独立部分. 举一个例子,当安装一个包,例如说Emacs,下面的命令将会使Emacs Lisp file被安装到"/opt/gnu/share":
$ ./configure --prefix=/opt/gnu

--exec-prefix=EPREFIX
  与'--prefix'选项类似,但是他是用来设置结构倚赖的文件的安装位置.编译好的'emacs'二进制文件就是这样一个问件.如果没有设置这个选项的话,默认使用的选项值将被设为和'--prefix'选项值一样.

--bindir=DIR
  指定二进制文件的安装位置.这里的二进制文件定义为可以被用户直接执行的程序.

--sbindir=DIR
  指定超级二进制文件的安装位置.这是一些通常只能由超级用户执行的程序.

--libexecdir=DIR
  指定可执行支持文件的安装位置.与二进制文件相反,这些文件从来不直接由用户执行,但是可以被上面提到的二进制文件所执行.

--datadir=DIR
  指定通用数据文件的安装位置.

--sysconfdir=DIR
  指定在单个机器上使用的只读数据的安装位置.

--sharedstatedir=DIR
  指定可以在多个机器上共享的可写数据的安装位置.

--localstatedir=DIR
  指定只能单机使用的可写数据的安装位置.

--libdir=DIR
  指定库文件的安装位置.

--includedir=DIR
  指定C头文件的安装位置.其他语言如C++的头文件也可以使用此选项.

--oldincludedir=DIR
  指定为除GCC外编译器安装的C头文件的安装位置.

--infodir=DIR
  指定Info格式文档的安装位置.Info是被GNU工程所使用的文档格式.

--mandir=DIR
  指定手册页的安装位置.

--srcdir=DIR
  这个选项对安装没有作用.他会告诉'configure'源码的位置.一般来说不用指定此选项,因为'configure'脚本一般和源码文件在同一个目录下.

--program-prefix=PREFIX
   指定将被加到所安装程序的名字上的前缀.例如,使用'--program-prefix=g'来configure一个名为'tar'的程序将会使安装 的程序被命名为'gtar'.当和其他的安装选项一起使用时,这个选项只有当他被`Makefile.in'文件使用时才会工作.

--program-suffix=SUFFIX
  指定将被加到所安装程序的名字上的后缀.

--program-transform-name=PROGRAM
  这里的PROGRAM是一个sed脚本.当一个程序被安装时,他的名字将经过`sed -e PROGRAM'来产生安装的名字.

--build=BUILD
  指定软件包安装的系统平台.如果没有指定,默认值将是'--host'选项的值.

--host=HOST
  指定软件运行的系统平台.如果没有指定,将会运行`config.guess'来检测.

--target=GARGET
  指定软件面向(target to)的系统平台.这主要在程序语言工具如编译器和汇编器上下文中起作用.如果没有指定,默认将使用'--host'选项的值.

--disable-FEATURE
  一些软件包可以选择这个选项来提供为大型选项的编译时配置,例如使用Kerberos认证系统或者一个实验性的编译器最优配置.如果默认是提供这些特性,可以使用'--disable-FEATURE'来禁用它,这里'FEATURE'是特性的名字.例如:
$ ./configure --disable-gui

-enable-FEATURE[=ARG]
  相反的,一些软件包可能提供了一些默认被禁止的特性,可以使用'--enable-FEATURE'来起用它.这里'FEATURE'是特性的名字.一个特性可能会接受一个可选的参数.例如:
$ ./configure --enable-buffers=128
`--enable-FEATURE=no'与上面提到的'--disable-FEATURE'是同义的.

--with-PACKAGE[=ARG]
   在自由软件社区里,有使用已有软件包和库的优秀传统.当用'configure'来配置一个源码树时,可以提供其他已经安装的软件包的信息.例如,倚赖 于Tcl和Tk的BLT器件工具包.要配置BLT,可能需要给'configure'提供一些关于我们把Tcl和Tk装的何处的信息:
$ ./configure --with-tcl=/usr/local --with-tk=/usr/local
'--with-PACKAGE=no'与下面将提到的'--without-PACKAGE'是同义的.

--without-PACKAGE
  有时候你可能不想让你的软件包与系统已有的软件包交互.例如,你可能不想让你的新编译器使用GNU ld.通过使用这个选项可以做到这一点:
$ ./configure --without-gnu-ld

--x-includes=DIR
   这个选项是'--with-PACKAGE'选项的一个特例.在Autoconf最初被开发出来时,流行使用'configure'来作为Imake的 一个变通方法来制作运行于X的软件.'--x-includes'选项提供了向'configure'脚本指明包含X11头文件的目录的方法.

--x-libraries=DIR
  类似的,'--x-libraries'选项提供了向'configure'脚本指明包含X11库的目录的方法.

   在源码树中运行'configure'是不必要的同时也是不好的.一个由'configure'产生的良好的'Makefile'可以构筑源码属于另一 棵树的软件包.在一个独立于源码的树中构筑派生的文件的好处是很明显的:派生的文件,如目标文件,会凌乱的散布于源码树.这也使在另一个不同的系统或用不 同的配置选项构筑同样的目标文件非常困难.建议使用三棵树:一棵源码树(source tree),一棵构筑树(build tree),一棵安装树(install tree).这里有一个很接近的例子,是使用这种方法来构筑GNU malloc包:
$ gtar zxf mmalloc-1.0.tar.gz
$ mkdir build && cd build
$ ../mmalloc-1.0/configure
creating cache ./config.cache
checking for gcc... gcc
checking whether the C compiler (gcc ) works... yes
checking whether the C compiler (gcc ) is a cross-compiler... no
checking whether we are using GNU C... yes
checking whether gcc accepts -g... yes
checking for a BSD compatible install... /usr/bin/install -c
checking host system type... i586-pc-linux-gnu
checking build system type... i586-pc-linux-gnu
checking for ar... ar
checking for ranlib... ranlib
checking how to run the C preprocessor... gcc -E
checking for unistd.h... yes
checking for getpagesize... yes
checking for working mmap... yes
checking for limits.h... yes
checking for stddef.h... yes
updating cache ../config.cache
creating ./config.status
这样这棵构筑树就被配置了,下面可以继续构筑和安装这个包到默认的位置'/usr/local':
$ make all && make install

posted @ 2007-06-15 10:39 紫岩 阅读(333) | 评论 (0)编辑 收藏

2007年6月14日

/* 养成好习惯,尊重别人也是尊重自己
Author:白开水
QQ:75094040
Email:daheit@163.com
Blog:http://blog.daheit.com
PHP tech:http://php.daheit.com
*/
经过一天一夜、郁闷了N个小时的努力后,总算把linux下的PHP环境配置好了。
兴奋之余,我是真的服了网上的那些自以为是的发配置文件的人了,我在baidu与google中,查找配置步骤与文件的,查了N个小时啊,竟然都说测试很好的,我装了卸,卸了装,苦了我这些为服务器本身就天天受累的人更累,精神又遭受此打击,兄弟们,你们说说,客户在屁股后催得要命似的,可你却为了一条配置编译命令一直过不去,error,error着,那是多么痛苦的事啊。
今天终于把服务器整好了,我把我安装的全过程一步一步记录下来,每一行命令都是经过严格测试后并编译通过的。请大家放心,深受其害后的人,才真的懂得这是多么的不易!!
先准备一下软件:
curl-7.16.2.tar.gz
expat-2.0.0.tar.gz
gzip-1.3.5.tar.gz
libxml2-2.6.23.tar.bz
zlib-1.2.3.tar.gz
jpegsrc.v6b.tar.gz
libpng-1.2.12.tar.gz
freetype-2.3.4.tar.gz
gd-2.0.34.tar.gz
httpd-2.2.4.tar.gz
php-5.2.2.tar.gz
ZendOptimizer-3.2.8-linux-glibc21-i386.tar.gz
linux as4操作系统:界面、应用软件、管理软件、服务器自带软件、其它等通通的不用安装,既然做服务器就要把服务器整理干净,linux自定义安装,我只选择安装了FTp软件(vsftpd)、开发工具包(这个当然必须要选的啊,编译全靠它来为我们出力!)二项,其它什么都不装。(够很吧!!!)
下面所需要的软件一步一步都有文件名,在这先不一一列出,请往下看,建议安装这些软件前,一定要先通读这篇文章的全文,把每一步所需要的软件先准备好。
建议你把软件包选择.tar.gz的,并且统一放到/usr/local/src目录下,一定要养成好习惯,呵呵,这样对自己很有好处的。
一。安装mysql
我用的软件是最新的mysql-5.0.41.tar.gz (大家在网上、mysql官方站上下载时一定要搞清楚了!版本可不能错,因为每一个版本的mysql都有很多种不同的编译版与不用编译版,我用的这个是自编译版的!如果你自行下载的请先解压缩后,用写字版打开包里的configure这个文件,看看是需要编译的还是不用编译的,如果这个文件打开只有十几行E字,告诉你说,此版本不用编译,解开放在目录里就能用了,那样的软件我不能保证在这篇文档里的可用性!)
好,费话少说,开始PHP环境重头戏,mysql的安装,安装好与坏,直接关系到最后PHP的编译成功与否!!
cd /usr/local/src //进入此放软件包的目录
groupadd mysql     // 建立mysql组
useradd mysql -g mysql   //建立mysql用户并且加入到mysql组中
tar -zxvf mysql5.0.41.tar.gz //解压缩
cd mysql5.0.41 //进入解开包的目录
./configure --prefix=/usr/local/mysql --with-charset=gb2312 --with-extra-charsets=gbk,gb2312 //这条命令里的参数一定不能乱写乱搞,不然谁也没法保证你编译的mysql能用。如果你搞不明白这些参数怎样设计、并且E文稍微不错的话,那你就先在本地一台电脑里用记事本、写字板、editplus等任何文本软件打开包里的configure文件,呵呵,都是程序与代码、打开可不是让你去改的啊,呵呵,最好远观可千万别近玩啊!向下看看,你会发现大段的参数,大致在986行开始你会发现”Configuration:“字样,到1193行中间,这一大段的代码大多与配置参数有关的说明,每一个参数都有详细的说明。这里不多做介绍,其它我是让它默认的。我第一次安装编译时参数是--with-charset=gb2312 --with-extra-charsets=all这样做,我是让它默认字符集为gb2312,其它安符扩展全装,我认为把所有的都加进去了,那一定是没有问题的吧,安装编译是顺利完成了,但当进入linux命令行下输入/usr/local/mysql/bin/mysql -u root -p敲回车时,提示一大段的错误信息,说gb2312根本没有被编译进去,你说怪不怪,没办法,只好重新编译,写成./configure --prefix=/usr/local/mysql --with-charset=gb2312 --with-extra-charsets=gbk,gb2312这样。如果顺利执行完毕,没有错误信息提示,那么恭喜你了,但不要高兴太早,下面才很重要呢。
make && make install //安装,如果这一步也很顺利完成,恭喜,mysql基本完成差不多了。下面都很简单了。
cd script //进入到脚本目录下
./mysql_install_db --uer=mysql //安装库文件,应该会提示说OK!的。
cd /usr/local/mysql //进入到安装的mysql软件目录中
chown -R root .   //设定root能访问/usr/local/mysql
chown -R mysql var   //设定mysql用户能访问/usr/local/mysql/var ,里面存的是mysql的数据库文件.这个目录是在/etc/my.cnf中有配置,在mysql_install_db时产生。
chown -R mysql var/. //设定mysql用户能访问/usr/local/mysql/var/mysql下的所有文件  
chgrp -R mysql .   //设定mysql组能够访问/usr/local/mysql
# 上面的已经把mysql完全安装完了,也能正常使用了,但还不够,你要将mysql的数据库启动脚本加入系统启动目录,不然,你总不能每次启动服务器后,都要登陆上去手工启动数据库吧,那还不麻烦死。

cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod 700 /etc/rc.d/init.d/mysqld
ln -s /etc/rc.d/init.d/mysqld /etc/rc.d/rc3.d/S97mysqld
/etc/rc.d/init.d/mysqld start  //来启动mysql进程 然后
/usr/local/mysql/bin/mysqladmin -u root password 'yourpassword' //默认安装密码为空,为了安全你必须马上修改.请注意,你修改执行此命令时,一定不要加yourpassword两边的单引号或者双引号,比如你想设定密码是123456 就直接执行 /usr/local/mysql/bin/mysqladmin -u root password 123456 而不要写成 /usr/local/mysql/bin/mysqladmin -u root password '123456' ,这样加引号,你的密码也是带引号的。我以开始就是,加引号,用123456登陆mysql,怎么也进不去,就是提示密码错误,呵呵。

二。安装php、gd库所需要的配件文件

//注意这些软件的安装步骤及先后顺序,不要乱。特别是jpeg,png,freetye与gd库

A.curl
curl安装
cd /usr/local/src //进入软件存放目录
tar -zxvf curl-7.16.2.tar.gz
./configure --prefix=/usr/local/curl
make && make install //这个小软件很简单,不明白什么意思,到网上查资料吧。
B.expat
cd /usr/local/src
tar -zxvf expat-2.0.0.tar.gz
cd expat-2.0.0
./configure --prefix=/usr/local/expat
make && make install
C.gzip安装
cd /usr/local/src
tar -zxvf gzip-1.3.5.tar.gz
cd /gzip-1.3.5
./configure --prefix=/usr/local/gzip
make && make install
D.libxml2安装
cd /usr/local/src
tar -xjvf libxml2-2.6.23.tar.bz //这个我下的是.bz的,你下的如果是.gz的就执行 tar -zxvf libxml2-6.23.tar.gz
cd /libxml2-2.6.23
./configure --prefix=/usr/local/libxml2
make && make install

E.zlib安装
cd /usr/local/src
tar -zxvf zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure //这个配置编译命令不要加目录参数,我试过的,加上--prefix=/usr/local/zlib这个参数,在这里是一定会顺利编译通的,但可惜的是,到下面你编译gd库时,是不会通过的,到时就是会出问题,也真怪了,这些问题不是摸索出来,我是不会相信的。网友们自己有空了也可以多试试,看看为什么不能加参数。
make && make install

F.安装 jpeg6
CODE:
建立目录:
mkdir -p /usr/local/jpeg6
mkdir -p /usr/local/jpeg6/bin
mkdir -p /usr/local/jpeg6/lib
mkdir -p /usr/local/jpeg6/include
mkdir -p /usr/local/jpeg6/man
mkdir -p /usr/local/jpeg6/man1
mkdir -p /usr/local/jpeg6/man/man1
cd /usr/local/src
tar -zvxf jpegsrc.v6b.tar.gz
cd jpeg-6b
./configure --prefix=/usr/local/jpeg6/ --enable-shared --enable-static
make && make install
G.安装libpng
cd /usr/local/src
tar -zvxf libpng-1.2.12.tar.gz
cd libpng-1.2.12
./configure  //这个如同上面zlib的说明一样,不要带参数,让它默认安装到相应目录
make && make install
H.安装 freetype
cd /usr/local/src
tar -zvxf freetype-2.3.4.tar.gz
cd freetype-2.3.4
mkdir -p /usr/local/freetype
./configure --prefix=/usr/local/freetype
make && make install
I.安装GD库
//下面开始另一个重要的工作,安装gd库,因为gd库在window操作系统下默认是自带有的,但到linux下,必须得自己安装,不然,很多目前流行的论坛图水印功能、缩略图功能等都不能用,打开自己的网站图片大的大小的小,严重变形,影响美观,所以下决心要整冶好gd库。
//这个gd库的安装是目前第四重要的软件。呵呵,第一个当然是php了,老二就是apache了,老三还用说吗是mysql,老四就是gd库了。呵呵。
cd /usr/local/src
tar -zvxf gd-2.0.34.tar.gz
mkdir -p /usr/local/gd
cd gd-2.0.34
./configure --prefix=/usr/local/gd --with-jpeg=/usr/local/jpeg6/ --with-png --with-zlib --with-freetype=/usr/local/freetype/
//大家看到了吧,在这些参数中,由于上面安装zlib、png二个软件没有指定目录,所以这里也不要指定了。
//第一次安装测试时,上面zlib、png都很顺利编译通过,但到了这里,总是提示找不到freetype/png等相应的路径啊什么的。
make && make install
J.apache2安装
//下面进行老二的安装,呵呵。
cd /usr/local/src
tar -zxvf httpd-2.2.4.tar.gz
cd httpd-2.2.4
./configure --prefix=/usr/local/apache2 --enable-module=most --enable-rewrite --enable-shared=max --enable-so
//php的编译参数就更多了,呵呵,自己如果有兴趣就可以专门研究一下,你研究了要告诉我一声。向你学习.
make && make install
//两条命令,注意,最后一个命令是让apache2编译出所有的so文件,apache2以DSO模式运行。
K.php5安装
//下面进入最重要的老大的安装,所以它必须放在最后,呵呵,因为它要用到前面很多软件的。
cd /usr/local/src
tar -zxvf php-5.2.2.tar.gz
cd php-5.2.2
./configure --prefix=/usr/local/php5 --with-apxs2=/usr/local/apache2/bin/apxs --with-freetype=/usr/local/freetype --enable-trace-avrs --with-mysql=/usr/local/mysql --with-zlib --with-libxml=/usr/local/libxml2 --enable-shared --with-curl=/usr/local/curl --with-expat=/usr/local/expat --with-gd=/usr/local/gd --with-jpeg-dir=/usr/local/jpeg6 --with-png --enable-mbstring=all --enable-mbregex --enable-so
//这里的参数指定,我是看了又看,唯恐写错一个字符,害了大家啊。这里千万不能错。等你有经验写文档时,请一定也要尊重你的读者,不然害人可不浅啊,等别人拿着你的文档编译时,就是编译不了,你说,当时他会急成什么样,特别是如我一族,没有人在旁边指导啊!
make && make install
cp php.ini-dist /usr/local/php/lib/php.ini

L。Zend的安装
cd /usr/local/src
tar -zxvf ZendOptimizer-3.2.8-linux-glibc21-i386.tar.gz
cd ZendOptimizer-3.2.8-linux-glibc21-i386
./install //执行这个安装命令就可以了,哎,上帝啊,什么时候php、mysql、apache、gd这几大软件在linux下也能像Zend这样自动啊,一个命令,下面就是下一步下一步,我们这等小民也不会那么受罪与累了。
//在这里下一步的过程中,一定要明白你的php.ini的路径是在/usr/local/php/lib/目录下,不能填错了。

//另外的话:
到这里,如果你还像我说的一样,顺利的话,恭喜恭喜恭喜你,你太有才了,真不容易走这一关。
至于怎么配置php.ini与虚拟主机httpd-vhost.conf那就等我有空专门整理成篇再说好吗各位(最重要的是,配置这二个文件就很简单了,并且网上一般错的很少,呵呵)?
你如果整理的很好、或者急需要知道怎样配置的话,可以在下面给我留言。
当然,如果大家要转载这个文章,请一定要加上
/*  养成好习惯,尊重别人也是尊重自己
Author:白开水
QQ:75094040
Email:[email=daheit@163.com?subject=%u4EA4%u6D41WEB%u6280%u672F&body=daheit@163.com]daheit@163.com[/email]
Blog:http://blog.daheit.com
PHP tech:http://php.daheit.com
*/

posted @ 2007-06-14 20:42 紫岩 阅读(341) | 评论 (1)编辑 收藏