分页: 24/29 第一页 上页 19 20 21 22 23 24 25 26 27 28 下页 最后页 [ 显示模式: 摘要 | 列表 ]
Dec 15

一、简介
    2004年11月30日推出了FCKeditor 2.0 RC1版,据其官方网站称:这是FCKeditor 2.0版的第一个稳定版本。大家现在可以考虑正式使用它了。目前支持的后台语言有ASP、ASP.Net、PHP和ColdFusion。
    笔者在经过简单的试用发现,2.0版确实比1.6版有了许多的改进。首先是FCKeditor的文件结构更加清晰,可以更方便地将其部署在自己的系统中。另外2.0版终于支持了Firefox 1.0浏览器,这将为FCKeditor赢得更多的使用者。废话不多说,让我们赶快来学习如何安装、配置FCKeditor 2.0吧。
二、安装与范例
    首先到http://sourceforge.net/projects/fckeditor/下载FCKeditor 2.0 RC1(554K),并将其解压缩到你的网站目录里面,并将文件夹名改为FCKeditor。举例来说,如果你的网站放在shaof这个目录下面,则在这个目录中建立3个子目录:
        FCKeditor:存放从网站上下载的FCKeditor
        upimages:用于存放上传的图片
        admin:里面存放测试页面
网站的结构如下:
/shaof
          /FCKeditor           //FCKeditor目录
          /UserFiles            //上传文件目录
          /admin
                test.php          //提交数据页面
                testsubmit.php     //显示数据页面

    进入到FCKeditor目录下,打开_samples目录,里面含有各种编程语言调用FCKeditor的范例程序页面,其中php目录中包含着一些使用PHP来调用FCKeditor的范例,大家可以看一下,了解FCKeditord的调用方法,下面是我简写了一个test.php程序,放在网站根目录下的admin目录中:
<?php
if($_POST["ADD"]){       
        $Content=$_POST['EditorDefault'];
echo $Content;
//变量$Content就是我们在FCKeditord里面编辑的内容,这里可以将其保存到数据库,代码省略。
}
?>;
<html>;
<head>;
</head>;
<body>;
<form action="<?php  echo $_SERVER['PHP_SELF'];  ?>;"  method="post" language="javascript">;
<?php
//引入在线编辑器
include("../FCKeditor/fckeditor.php" ;

    这里我们先看一下调用FCKeditor的函数,2.0版的调用方式与1.6版变化不大,如果你以前安装过FCKeditor 1.6,那么只需要修改很少的代码升级到2.0。
FCKeditor( instanceName[, width, height, toolbarSet, value] )
引用值                  含义
InstanceName        实例化编辑器所需的唯一名称
Width                        编辑器的宽度,单位为象素或者百分比(可选择的,默认为:100%)
Height                        编辑器的高度,单位为象素或者百分比(可选择的,默认为:200)
ToolbarSet        工具栏的名称(可选择的,默认为:Default)
Value                        编辑器的内容(HTML)初始值(可选择的)
好啦,下面就让我们利用这个函数来定制FCKeditor吧。

$oFCKeditor = new FCKeditor('FCKeditor1')  ;
$oFCKeditor->;BasePath = '../FCKeditor/' ;       
$oFCKeditor->;ToolbarSet = 'Default' ;
$oFCKeditor->;InstanceName = 'EditorDefault' ;
$oFCKeditor->;Width = '100%' ;
$oFCKeditor->;Height = '400' ;
$oFCKeditor->;Create() ;
?>;
<INPUT type="submit" name="ADD" value="提交">;
</form>;
</body>;
</html>;

三、配置
FCKeditor 2.0的配置文件为FCKeditor\fckconfig.js,其中几个重要的配置项目如下:
1、工具栏的设置
    默认情况下,FCKeditor会调用如下的工具栏按钮,大家可以根据自己的需要进行增减。需要注意的是,2.0版与1.6版的按钮并不完全相同,有些按钮以及删除或者改名了。
//##
//## Toolbar Buttons Sets
//##
FCKConfig.ToolbarSets["Default"] = [
        ['Source','-','Save','NewPage','Preview'],
        ['Cut','Copy','Paste','PasteText','PasteWord','-','Print'],
        ['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
        ['Bold','Italic','Underline','StrikeThrough','-','Subscript','Superscript'],
        ['OrderedList','UnorderedList','-','Outdent','Indent'],
        ['JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],
        ['Link','Unlink'],
        ['Image','Table','Rule','SpecialChar','Smiley'],
        ['Style','FontFormat','FontName','FontSize'],
        ['TextColor','BGColor'],
        ['About']
] ;

2、简体中文设置
编辑edit/lang/fcklanguagemanager.js
将下面语句
FCKLanguageManager.AvailableLanguages =
{
'ar'  : 'Arabic',
'bs'  : 'Bosnian',
'ca'  : 'Catalan',
'en'  : 'English',
'es'  : 'Spanish',
'et'  : 'Estonian',
'fi'  : 'Finnish',
'fr'  : 'French',
'gr'  : 'Greek',
'he'  : 'Hebrew',
'hr'  : 'Croatian',
'it'  : 'Italian',
'ko'  : 'Korean',
'lt'  : 'Lithuanian',
'no'  : 'Norwegian',
'pl'  : 'Polish',
'sr'  : 'Serbian (Cyrillic)',
'sr-latn' : 'Serbian (Latin)',
'sv'  : 'Swedish'
}
添加一行 'zh-cn'    : 'Chinese' 从而变成
FCKLanguageManager.AvailableLanguages =
{
'ar'  : 'Arabic',
'bs'  : 'Bosnian',
'ca'  : 'Catalan',
'en'  : 'English',
'es'  : 'Spanish',
'et'  : 'Estonian',
'fi'  : 'Finnish',
'fr'  : 'French',
'gr'  : 'Greek',
'he'  : 'Hebrew',
'hr'  : 'Croatian',
'it'  : 'Italian',
'ko'  : 'Korean',
'lt'  : 'Lithuanian',
'no'  : 'Norwegian',
'pl'  : 'Polish',
'sr'  : 'Serbian (Cyrillic)',
'sr-latn' : 'Serbian (Latin)',
'sv'  : 'Swedish',
'zh-cn'     : 'Chinese'
}
    然后到这里http://www.shaof.com/download/zh-cn.js下载汉化好的zh-cn.js保存到editor/lang目录下即可。

四、设置文件上传
    FCKeditor 2.0采用了一种名为“Connector”(连接器)的技术来实现对文件的浏览以及上传。下图显示了文件浏览的工作流程图。

图1:Connector的工作流程图
    从图中可以看出,当客户端向服务器发出一个文件操作请求后,Connector就会对此请求进行响应,在服务器的文件系统中进行执行操作,如:文件和文件夹的浏览以及创建操作。最后将结果以XML的格式回应给客户端。具体的技术细节大家可以阅读FCKeditor自带的说明指南。
落实到应用,首先我们要选择一个后台语言用来实现这个功能,这里我们以PHP为例进行说明。
1、修改配置文件FCKeditor\fckconfig.js中的两段内容
//Link Browsing
FCKConfig.LinkBrowser = true ;
FCKConfig.LinkBrowserURL = FCKConfig.BasePath + "filemanager/browser/default/browser.html?Connector=connectors/php/connector.php" ;
FCKConfig.LinkBrowserWindowWidth        = screen.width * 0.7 ;        // 70%
FCKConfig.LinkBrowserWindowHeight        = screen.height * 0.7 ;        // 70%

//Image Browsing
FCKConfig.ImageBrowser = true ;
FCKConfig.ImageBrowserURL = FCKConfig.BasePath + "filemanager/browser/default/browser.html?Type=Image&Connector=connectors/php/connector.php" ;
FCKConfig.ImageBrowserWindowWidth  = screen.width * 0.7 ;        // 70% ;
FCKConfig.ImageBrowserWindowHeight = screen.height * 0.7 ;        // 70% ;

2、修改配置文件FCKeditor\editor\filemanager\browser\default\connectors\php\connector.php
// Get the "UserFiles" path.
$GLOBALS["UserFilesPath"] = '/UserFiles/' ;
UserFiles为文件上传的路径,与本文开头所给的例子相对应,大家可以自行修改。

    好啦,只需要两步就完成了文件上传的配置工作,真是简单呀。以后我们通过FCKeditor上传的文件都会保存在网站的UserFiles目录下。

图2:FCKeditor2.0的文件管理截图

五、结束
    最后大家可以把FCKeditor目录下的_docs和_samples两个目录删除以节省空间。本文是笔者以前写过的一篇名为《在线编辑器FCKeditor在PHP中的使用方法》(1.6版)文章的升级版本,文章如有不妥之处,还请大家指正。

原帖子:http://bbs.chinaunix.com/viewthread.php?tid=459239&extra=page%3D3%26filter%3Ddigest

Dec 12
以PHP for Apache as CGI binary方式为例,我喜欢用这种方式。
以安装目录c:php为例;

[1]将原先的php安装目录删除,解压php-5.0.0-Win32.zip到c:php
重命名php.ini-dist为php.ini(跟php4一样)

[2]修改Apache的httpd.conf文件。将原有跟php4邦定的语句删除。
用以下这几行代替:
ScriptAlias /php/ "c:/php/"
AddType application/x-httpd-php .php
Action application/x-httpd-php "/php/php-cgi.exe"

[3]修改php.ini中,去掉extension=php_mysql.dll前面“;”,默认是有的!

如果是PHP for Apache as module道理也一样。
修改Apache的httpd.conf
LoadModule php5_module c:/php/php5apache.dll
AddModule mod_php5.c
AddType application/x-httpd-php .php
不过这种方式得拷贝所有的dll文件到c:winntsystem32,php.ini跟php.exe到winnt

以上两种方式都试过。php4写的程序都能运行!

[以下为冰流星补充]
对于apache2的设置:
1、不要AddModule mod_php5.c
2、LoadModule php5_module c:/php/php5apache2.dll,是php5apache2.dll
3、需要将php目录下的dll文件(以下文件不必复制:php5activescript.dll、php5apache.dll、php5apache_hooks.dll、php5apache2.dll、php5isapi.dll、php5nsapi.dll)复制到上述所说的目录(98、me是system)下

Windows版的PHP5和PHP4相比,安装更多的考虑到以后的可升级性,安装PHP5时建议安装在没有空格的目录名下,以免出现错误,以下是Windows版PHP5的安装手册:

1。php4ts.dll/php5ts.dll:对php4ts.dll/php5ts.dll的路径说明也比较清晰而且更加利于将来的升级:第一种法案就是老的copy到系统目录,第二种方案就是添加PHP4/5到%PATH%中去(我这个懒人,在PHP4时就独辟蹊径的喜欢这么搞,因为这样做是符合windows查找文件时搜索路径的顺序(.->%PATH%)。

2。PHP.ini:出于安全和效率的考虑,建议使用php.ini-recommended作为php.ini的蓝本,而不要使用php.ini-dist。同时PHP.ini的查找路径也不再限于PHP4时代的%SystemRoot%下了,PHP5按照以下路径查找PHP.ini:

     * PHPIniDir (Apache 2 module only)
     * 注册表键值:HKEY_LOCAL_MACHINESOFTWAREPHPIniFilePath
     * 环境变量:%PHPRC%
     * PHP5的目录 (for CLI), 或者web服务器目录(for
       SAPI modules)
     * Windows目录(C:windows or C:winnt)
这五个方案中,配合Apache2时最好使用PHPIniDir,其次是使用%PHPRC%环境变量,另外,NTFS上记得给服务器开PHP.ini的读权限。

 

3.配置web服务器:
   对于IIS,以IIS的ISAPI模块运行PHP:
        1.在系统变量中添加%PHPRC%变量,取值为你的php.ini所在的目录(
比如在PHP5安装目录下。
       2.为了使用HTTP Authentication,在ISAPI Filters上添加一个属性
为php5isapi.dll的PHP筛选器,如果不使用HTTP Authentication,可以不管这一步。
       3.在主目录选项卡,点击配置,应用程序映射新建扩展名为.php并且可执行文件为php5isapi.dll。
       4.好了,重新启动IIS,写个测试。


   对于Apache,我一直都喜欢 以Apache的模块运行PHP
 1.编辑httpd.conf
 # LoadFile "e:/Apache/php4ts.dll" 
 # LoadModule php4_module modules/php4apache.dll

 #加载php5ts.dll,这无论是apache还是IIS都必须以来的链接库
 LoadFile "E:/PHP5/php5ts.dll"

 #加载php5的apache模块
 LoadModule php5_module "E:/PHP5/php5apache.dll"

 #设置PHPRC变量,以提供给PH5查找配置文件PHP.ini,就无需在跑到%SystemRoot%下去找php.ini了
 SetEnv PHPRC "E:/PHP5"

 #注意,如果定义了ClearModuleList指令,则添加如下语句,如果没有则无须添加,我当初没有
 #添加该行 ,结果将测试用的phpinfo.php的源码给下载下来了
 AddModule mod_php5.c

 #为了兼容添加php3和php4的类型
 AddType application/x-httpd-php .php
 AddType application/x-httpd-php .php3
 AddType application/x-httpd-php .php4

 2.重新启动apache(NET STOP apache && net start apache),写个测试。

4.额外的配置
为了更好的配置php5,还需要根据个人需要重新编辑你的php.ini:
 比如需要使用smart和pear ,则需要更改的是:
 include_path = ".;E:/PHP5/Smarty;E:/PHP5/PEAR"
 另外php5再也不像php4那样内置了对mysql和ODBC的支持了,而是只内置对ODBC
进行支持,所以如果需要使用Mysql数据库的话,还要设置extension_dir(php_mysql.dll)的目录以及用
extension加载php_mysql.dll

 #修改extension_dir为:
 extension_dir = "E:/PHP5/ext"
 #删除extension=php_mysql.dll前的;,以加载php_mysql.dll
 extension=php_mysql.dll
差不多就这些了。

Dec 7
本来打算翻译一下有关在PHP.net上的有关从PHP4移植到PHP5的内容,没想到有人捷足先登了,多谢了。真是高兴最近大家对PHP的支持。这里我整理下来给你大家看看。

如果大家要看原文参考:

http://www.php.net/manual/en/migration5.php

从PHP4移植到PHP5

目录
PHP 5 中有哪些改变
向后不兼容的改变
CLI 和 CGI
移植配置文件
新函数
新指令
数据库
新对象模型
错误报告


PHP 5 中有哪些改变

PHP 5 和集成的 Zend Engine 2 代极大提高了 PHP 的性能和能力,而且投入极大努力尽可能避免破坏已有的代码的使用。因此将代码从 PHP 4 移植到 PHP 5 应该很容易。大多数已有的 PHP 4 代码应该不用改就能运行,但还是应该注意到几点区别并在实际运作环境下转换到新版本之前多做测试。

向后不兼容的改变

尽管大部分 PHP 4 的代码应该不用修改就能运行,还是应该留意以下向后不兼容的改变:


有了一些新关键字。

strrpos() 和 strripos() 如今使用整个字符串作为 needle。

非法使用字符串偏移量会导致 E_ERROR 而不是 E_WARNING。一个非法使用的例子:$str = 'abc'; unset($str[0]);.

array_merge() 被改成只接受数组。如果传递入非数组变量,对每个此类参数都会发出一条 E_WARNING 信息。要小心因为你的代码有可能疯狂发出 E_WARNING。

PATH_TRANSLATED 服务器变量在 Apache2 SAPI 中不再暗中设定,这和 PHP 4 中的情形相反,如果 Apache 没产生此值则其被设为和 SCRIPT_FILENAME 服务器变量一样的值。此修改是为了遵守 CGI 规范。更多信息见 bug #23610,并参考手册中 $_SERVER['PATH_TRANSLATED'] 的说明。此问题也影响到 PHP >= 4.3.2 的版本。

Tokenizer 扩展不再定义 T_ML_COMMENT 常量。如果把 error_reporting 设为 E_ALL,PHP 将产生一条消息。尽管 T_ML_COMMENT 从来都没用到过,还是在 PHP 4 中定义了。在 PHP 4 和 PHP 5 中 // 和 /* */ 都被解析为 T_COMMENT 常量。但是 PHPDoc 风格的注释 /** */,自 PHP 5 开始被 PHP 解析,被识别为 T_DOC_COMMENT。

如果 variables_order 包括“S”,$_SERVER 应该带有 argc 和 argv 被产生。如果用户特别配制系统不创建 $_SERVER,那此变量当然就不存在了。改变的地方是不管 variables_order 怎么设定,在 CLI 版本中 argc 和 argv 总是可用的。本来 CLI 版不是总会产生全局变量 $argc 和 $argv 的。

没有属性的对象不再被当成“empty”。

有些情况下类必须在使用前被定义。这仅在使用了一些 PHP 5 的新特性的时候发生。其它情况下行为都没变。

get_class(),get_parent_class() 和 get_class_methods() 如今返回的类/方法名和定义时的名字一致(区分大小写),对于依赖以前行为(类/方法名总是返回小写的)的老脚本可能产生问题。一个可能的解决方法是在脚本中搜索所有这些函数并使用 strtolower()。

区分大小写的改变也适用于魔术常量 __CLASS__,__METHOD__ 和 __FUNCTION__。其值都会严格按照定义时的名字返回(区分大小写)。

ip2long() 在传递入一个非法 IP 作为参数时返回 FALSE,不再是 -1。

如果在包含文件中定义有函数,则不管在 return() 之前还是之后都可以在主文件中调用。如果文件被包含两次,PHP 5 会发出致命错误,因为函数已经被定义,而 PHP 4 不管这个。因此推荐使用 include_once() 而不要去检查文件是否已被包含以及在包含文件中有条件返回。

include_once() 和 require_once() 在 Windows 下先将路径规格化,因此包含 A.php 和 a.php 只会把文件包含一次。

例子 B-1. strrpos() 和 strripos() 如今用整个字符串作为 needle

var_dump(strrpos('ABCDEF','DEF')); //int(3)

var_dump(strrpos('ABCDEF','DAF')); //bool(false)
?>



例子 B-2. 没有属性的对象不再被当成“empty”

class test { }
$t = new test();

var_dump(empty($t)); // echo bool(false)

if ($t) {
// Will be executed
}
?>



例子 B-3. 有些情况下类必须在使用之前定义


//works with no errors:
$a = new a();
class a {
}


//throws an error:
$a = new b();

interface c{
}
class b implements c {
}

?>


CLI 和 CGI

PHP 5 中对 CLI 和 CGI 文件名作了些改变。PHP 5 中,CGI 版本被改名为 php-cgi.exe(以前是 php.exe),现在主目录中的是 CLI 版本(之前是 cli/php.exe)。

PHP 5 中引进了一种新模式:php-win.exe。这和 CLI 版本相同,只除了 php-win 不输出任何内容,因此不会提供控制台(屏幕上不会闪过“dos 窗口”)。此行为类似 php-gtk。

PHP 5 中,CLI 版本总会产生全局变量 $argv 和 $argc 而不管 php.ini 是怎么设的。即使将 register_argc_argv 设为 off 也不影响 CLI。

参见命令行模式。

移植配置文件
由于 ISAPI 模块的名字改了,从 php4xxx 改为 php5xxx,因此需要对配置文件作些修改。CLI 和 CGI 文件名也改了。更多信息请查看相应章节。

移植 Apache 配置极其简单。照下面的例子来检查需要做的修改: 例子 B-4. 移植 Apache 配置文件到 PHP 5

# 将下面这行:
LoadModule php4_module /php/sapi/php4apache2.dll

# 改成这一行:
LoadModule php5_module /php/php5apache2.dll




如果 web 服务器是以 CGI 模式运行 PHP 的,应该注意 CGI 版本的名字从 php.exe 改为了 php-cgi.exe。在 Apache 中,应该照这样改: 例子 B-5. 移植 Apache 配置文件到 PHP 5,CGI 模式

# 将下面这行:
Action application/x-httpd-php "/php/php.exe"

# 改成这一行:
Action application/x-httpd-php "/php/php-cgi.exe"




其它的 web 服务器中,需要修改 CGI 或者 ISAPI 模块的名字。


新函数


PHP 5 有了些新函数。下面是列表:

Arrays:


array_combine() - 用一个数组作为键名,另一个数组作为值创建一个新数组

array_diff_uassoc() - 计算数组的差别,并用用户提供的回调函数作附加的索引检查

array_udiff() - 用回调函数比较数据来计算数组的差别

array_udiff_assoc() - 计算数组的差别并作附加的索引检查。用回调函数来比较数据

array_udiff_uassoc() - 计算数组的差别并作附加的索引检查。数据的比较和索引检查都用回调函数来完成

array_walk_recursive() - 对数组的每个成员递归使用用户函数

array_uintersect_assoc() - 计算数组的交集并作附加的索引检查。用回调函数来比较数据

array_uintersect_uassoc() - 计算数组的交集并作附加的索引检查。数据和索引都用回调函数来比较

array_uintersect() - 计算数组的交集。用回调函数来比较数据

InterBase:


ibase_affected_rows() - 返回前一个查询影响到的行的数目

ibase_backup() - 在服务管理器中发起一个后台任务并立即返回

ibase_commit_ret() - 提交一个事务但不关闭

ibase_db_info() - 请求有关数据库的统计信息

ibase_drop_db() - 删除一个数据库

ibase_errcode() - 返回一个错误代码

ibase_free_event_handler() - 取消一个已注册的事件句柄

ibase_gen_id() - 递增指定的发生器并返回其新值

ibase_maintain_db() - 在数据库服务器上执行一条维护命令

ibase_name_result() - 给结果集指定一个名字

ibase_num_params() - 返回一个准备好的查询的参数数目

ibase_param_info() - 返回一个准备好的查询的参数信息

ibase_restore() - 在服务管理器中发起一个还原任务并立即返回

ibase_rollback_ret() - 回卷一笔事务并保留事务上下文

ibase_server_info() - 请求有关数据库服务器的统计信息

ibase_service_attach() - 连接到服务管理器

ibase_service_detach() - 从服务管理器断开

ibase_set_event_handler() - 注册一个当事件发布时要调用的回调函数

ibase_wait_event() - 等待数据库发布一条事件

iconv:


iconv_mime_decode() - 解码 MIME 头信息字段

iconv_mime_decode_headers() - 一次解码多个 MIME 头信息字段

iconv_mime_encode() - 压缩 MIME 头信息字段

iconv_strlen() - 返回字符串中的字符计数

iconv_strpos() - 在堆栈中找到第一个出现的子串位置

iconv_strrpos() - 在堆栈中指定的范围内找到最后一个出现的子串位置

iconv_substr() - 从字符串中取出一部分

Streams:


stream_copy_to_stream() - Copies data from one stream to another

stream_get_line() - Gets line from stream resource up to a given delimiter

stream_socket_accept() - Accept a connection on a socket created by stream_socket_server()

stream_socket_client() - Open Internet or Unix domain socket connection

stream_socket_get_name() - Retrieve the name of the local or remote sockets

stream_socket_recvfrom() - Receives data from a socket, connected or not

stream_socket_sendto() - Sends a message to a socket, whether it is connected or not

stream_socket_server() - Create an Internet or Unix domain server socket

Date and time related:


idate() - Format a local time/date as integer

date_sunset() - Time of sunset for a given day and location

date_sunrise() - Time of sunrise for a given day and location

time_nanosleep() - Delay for a number of seconds and nano seconds

Strings:


str_split() - Convert a string to an array

strpbrk() - Search a string for any of a set of characters

substr_compare() - Binary safe optionally case insensitive comparison of two strings from an offset, up to length characters

Other:


convert_uudecode() - decode a uuencoded string

convert_uuencode() - uuencode a string

curl_copy_handle() - Copy a cURL handle along with all of it's preferences

dba_key_split() - Splits a key in string representation into array representation

dbase_get_header_info() - Get the header info of a dBase database

dbx_fetch_row() - Fetches rows from a query-result that had the DBX_RESULT_UNBUFFERED flag set

fbsql_set_password() - Change the password for a given user

file_put_contents() - Write a string to a file

ftp_alloc() - Allocates space for a file to be uploaded

get_declared_interfaces() - Returns an array of all declared interfaces

get_headers() - Fetches all the headers sent by the server in response to a HTTP request

headers_list() - Returns a list of response headers sent (or ready to send)

http_build_query() - Generate URL-encoded query string

image_type_to_extension() - Get file extension for image-type returned by getimagesize(), exif_read_data(), exif_thumbnail(), exif_imagetype()

imagefilter() - Applies Filter an image using a custom angle

imap_getacl() - Gets the ACL for a given mailbox

ldap_sasl_bind() - Bind to LDAP directory using SASL

mb_list_encodings() - Returns an array of all supported encodings

pcntl_getpriority() - Get the priority of any process

pcntl_wait() - Waits on or returns the status of a forked child as defined by the waitpid() system call

pg_version() - Returns an array with client, protocol and server version (when available)

php_check_syntax() - Check the syntax of the specified file

php_strip_whitespace() - Return source with stripped comments and whitespace

proc_nice() - Change the priority of the current process

pspell_config_data_dir() - Change location of language data files

pspell_config_dict_dir() - Change location of the main word list

setrawcookie() - Send a cookie with no url encoding of the value

snmp_read_mib() - Reads and parses a MIB file into the active MIB tree

sqlite_fetch_column_types() - Return an array of column types from a particular table

注: The Tidy extension has also changed its API completely.

新指令

PHP 5 在 php.ini 中引进了一些新指令。列表如下:


mail.force_extra_parameters - 强制指定的参数附加值作为额外的参数传递给 sendmail 库。这些参数总是会替换掉 mail() 的第 5 个参数,即使在安全模式下

register_long_arrays - 允许/禁止 PHP 注册已过时的 $HTTP_*_VARS 变量

session.hash_function - 选择一种散列函数(MD5 或 SHA-1)

session.hash_bits_per_character - 定义将二进制散列数据转换为可读格式时每个字符中储存几个位(从 4 到 6)

zend.ze1_compatibility_mode - 启用 Zend Engline 1 代(PHP 4)兼容模式

数据库
关于数据库(MySQL 和 SQLite)在 PHP 5 中有些改变。

PHP 5 中不再绑定 MySQL 客户端连接库,因为授权和一些其它问题。更多信息见 FAQ。

有个新扩展库 MySQLi(改良版 MySQL),设计用来工作于 MySQL 4.1 及更高版本之下。

自 PHP 5 起,SQLite 扩展库内置在 PHP 中。SQLite 是一个可嵌入 SQL 数据库引擎,不是客户端连接库用来连接大型数据库服务器(如 MySQL 或 PostgreSQL)的。SQLite 库直接读写磁盘上的数据库文件。

新对象模型

PHP 5 中有个新对象模型(Object Model)。PHP 处理对象的方式完全重写了,允许更佳性能和更多特性。之前版本的 PHP,对象处理方式和原始类型(例如整型和字符串)相同。此方法的缺点是当变量被赋值或作为参数传递给方法时语义上整个对象都被拷贝。在新方法中,对象通过句柄引用,而不是值(可以将句柄当成是对象的标识符)。

很多 PHP 程序员根本没意识到旧的对象模型的这种拷贝怪癖,因此大多数 PHP 应用程序拿来就能运行,或者只做很小的修改。

新对象模型的文档见语言参考。

与 PHP 4 的兼容性参见 zend.ze1_compatibility_mode。

错误报告

自 PHP 5 起引进了新常量 E_STRICT,其值为 2048。它提供了对用户代码的协同性和向前兼容性的运行时 PHP 建议,有助于使用户保持最新和最好的编程风格。例如在使用已过时的函数时 STRICT 信息会提出警告。

注: E_ALL 不包括 E_STRICT,因此其默认未激活。
Nov 25
说起数据抽象层,大家可能首先想起的就是ADODB。这里要为大家介绍的是一个全新的数据抽象层:Creole。说它新,是因为它是用PHP5写的,是一个基于真正意义的OO的层;它的API接口以JDBC为基础,熟悉JDBC的朋友用起来应该会很亲切;它现在支持的数据库有MySQL, MS SQL Server, PostgreSQL, SQLite。Oracle的driver正在开发中,当然,你也可以为自己要使用的数据库写Driver。


安装
下面我们就来看看在Windows+Apache+PHP5上Creole的安装和初步使用。首先你要安装好PEAR,如果你还没有安装好,可以双击php目录下的go-pear.bat文件,然后这个程序会引导你进行安装。关于PEAR的安装不是本文的内容,请自行查阅相关资料。当你安装好PEAR后,我们就要利用它的install功能了。
首先进入命令行方式,Cd到你安装php的目录下。然后在命令行中键入下边命令,这样PEAR会自动帮我们下载并安装好Creole包。
pear install http://creole.phpdb.org/pear/creole-current.tgz 


如果你键入的命令正确的话,应该看到下边的安装提示。

Click to fullsize


这样我们就已经成功安装好了Creole,不过为了能使用它我们还得再安装一个jargon包,这个包封装了数据表和字段层次的一些信息。安装的方法和上边一样,键入如下命令就可以了:
pear install http://creole.phpdb.org/pear/jargon-current.tgz


配置
下面我们就可以使用Creole了。在web可以访问的目录下建立一个PHP文件,我们先来尝试包含Creole类,这是每一个要使用Creole的程序都要做的事。我们加入下边的代码:
require_once 'creole/Creole.php';


然后在浏览器中访问这个页面,结果出现了下边的错误:
Warning: main(/creole/Creole.php) [function.main]: failed to open stream: No such file or directory in c:\program files\EasyPHP5\home\dev\test.php on line 2

Fatal error: main() [function.require]: Failed opening required '/creole/Creole.php' (include_path='.;C:\php5\pear') in c:\program files\EasyPHP5\home\dev\test.php on line 2

这是因为我们没有设置好php.ini来包含PEAR库的路径,所以php.exe找不到文件,只好报错了。现在我们把PEAR库的地址添加到php.ini中。在php.ini中找到这段:

;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;

; UNIX: "/path1:/path2"
;include_path = ".:/php/includes"
;
; Windows: "path1;path2"
;include_path = ".;c:\php\includes"

将最后一行改成:

include_path = ".;C:\Program Files\EasyPHP5\php\PEAR"

其中C:\Program Files\EasyPHP5\php\PEAR是PEAR在你机器上的绝对路径。注意要去掉行首的分号。然后重启Apache。再访问看看,好了。:)



试用
现在开始我们就可以在程序中使用Creole了。下边我们将连接数据库,并从中取出user表的全部用户。下边是完整的代码:
<?php
require_once 'creole/Creole.php';
$dsn = "mysql://root@localhost/r4";
$conn = Creole::getConnection($dsn);
$rs = $conn->executeQuery("SELECT * FROM user");
while($rs->next())
{
 echo $rs->getString("login_name") . " (" . $rs->getInt("id") . ")";
}
?>

这里讲解下上边代码的含义。第一行载入了Creole类,第二行定义了一个用于连接数据库的字符串,格式是“数据库类型名://用户名:密码@HOST/数据库名”。第三行创建了一个连接对象,第四行利用这个对象执行了一句SQL,并返回一个结果集。第五到八行遍历了这个结果集并输出数据。


析构
怎么样,看起来不错吧,如果你感兴趣可以按照Creole站上的Guide一步一步做下去。不过我们就要做别的事情了:P 前边说过了,Creole更多的注重于OO,同时又带有很强的Java风格,因此对于我们学习使用PHP5来设计OO方式的程序是很好的范例。下边我们就来看看它的架构。首先要了解的是它的目录结构,在Windows命令行方式键入tree,就可以打印出一个目录的结构(一个有用的小技巧哦),下边是由此得到的Creole目录结构,目录后边加上了简要的说明。
我们以Statement为例,看看Creole是怎么组织的。首先在根目录下的Statement.php中定义了Statement接口,这个接口规定了Statement必须实现的一些方法。然后,在/common目录下的StatementCommon.php中定义了名为StatementCommon的抽象类,在这个类中,包含了Statement.php中定义的接口的实现代码,但是并没有定义为实现Statement接口。

Root // Creole的根目录 
├─common // 存放了Creole的抽象类
├─drivers
│  ├─mssql
│  │  └─metadata // mssql实现
│  ├─mysql
│  │  └─metadata // mysql实现
│  ├─pgsql
│  │  └─metadata
│  └─sqlite
│      └─metadata
├─metadata // 数据表原始信息类
└─util
   └─sql

而在/drivers/mysql/目录下的MysqlStatement则继承了StatementCommon和实现Statement方法。这样MysqlStatement可以共享到StatementCommon中的方法,需要定制时可以重载StatementCommon的方法;同时,MysqlStatement又受到Statement接口的约束。

下一页的图表示了Statement,StatementCommon和MysqlStatement之间的关系。正是这样的结构,使定义和实现得到了有效的分离。Creole中大量采用了这样的结构,在我们编写自己的Driver时非常方便。如果要添加一个TextStatement,可以自己实现一个class,只要这个class实现了Statement接口就可以了。而Driver正是由这样的一组class组成的。

Click to fullsize



参考
我们对Creole的介绍到这里就告一个段落了,而对你来说,一切才刚刚开始。下边是从两个常用类的接口程序内中整理出来的方法,希望能对你有所帮助。

Statement
public function setLimit($v);
public function getLimit();
public function setOffset($v);
public function getOffset();
public function close();
public function execute($sql, $fetchmode = null);
public function getResultSet();
public function executeQuery($sql, $fetchmode = null);
public function executeUpdate($sql);
public function getMoreResults();
public function getConnection();

ResultSet
public function getResource();
public function setFetchmode($mode);
public function getFetchmode();      
public function isIgnoreAssocCase();
public function next();
public function previous();
public function relative($offset);
public function absolute($pos);
public function seek($rownum);    
public function first();
public function last();
public function beforeFirst();
public function afterLast();
public function isAfterLast();
public function isBeforeFirst();
public function getCursorPos();
public function getRow();
public function getRecordCount();
public function close();
public function get($column);
public function getArray($column);
public function getBoolean($column);
public function getBlob($column);
public function getClob($column);
public function getDate($column, $format = '%x');  
public function getFloat($column);
public function getInt($column);      
public function getString($column);
public function getTime($column, $format = '%X');
public function getTimestamp($column, $format = 'Y-m-d H:i:s');

Nov 16
<?php

/*

* @url: 文件地址

* @filename: 要保存的文件名

*/

function _download($url, $filename)

{

// 获得文件大小, 防止超过2G的文件, 用sprintf来读

$filesize = sprintf("%u", filesize($url));



if (!$filesize)

{

return;

}



header("Content-type:application/x-msdownload\n"); //application/octet-stream

header("Content-type:unknown/unknown;");

header("Content-disposition: inline; filename=\"".$filename."\"");

header('Content-transfer-encoding: binary');



if ($range = getenv('HTTP_RANGE')) // 当有偏移量的时候,采用206的断点续传头

{

$range = explode('=', $range);

$range = $range[1];



header("HTTP/1.1 206 Partial Content");

header("Date: " . gmdate("D, d M Y H:i:s") . " GMT");

header("Last-Modified: ".gmdate("D, d M Y H:i:s", filemtime($url))." GMT");

header("Accept-Ranges: bytes");

header("Content-Length:".($filesize - $range));

header("Content-Range: bytes ".$range.($filesize-1)."/".$filesize);

header("Connection: close"."\n\n");

}

else

{

header("Content-Length:".$filesize."\n\n");

$range = 0;

}



$fp = fopen($url, 'rb');

fseek($fp, $range);

while ($bbsf = fread($fp, 4096))

{

echo $bbsf;

}

fclose($fp);



}

?>

分页: 24/29 第一页 上页 19 20 21 22 23 24 25 26 27 28 下页 最后页 [ 显示模式: 摘要 | 列表 ]