2010年1月

pear安装

如果你需要用php写一个系统,coding from scratch不是很现实,如果你追求效率,那么使用已经写好的php类绝对是不二的选择。我今天就安装了最牛逼玩意儿,pear!

啥是pear呢?

PEAR is short for "PHP Extension and Application Repository" and is pronounced just like the fruit. The purpose of PEAR is to provide:

  • A structured library of open-source code for PHP users
  • A system for code distribution and package maintenance
  • A standard style for code written in PHP, specified here
  • The PHP Extension Community Library (PECL), see more below
  • A web site, mailing lists and download mirrors to support the PHP/PEAR community

简单翻译一下PEAR是“PHP Extension and Application Reporsitory”的简称,也就是php扩展和程序库,发音和fruit一样,PEAR的目标是:

  • 成为php用户开源代码的类库
  • 一个用于包维护和代码分发的系统
  • php代码的一种标准风格
  • php扩展社区酷
  • 支持php/pear社区的一个网站、邮件列表、下载镜像

pear不光是类库,我觉得叫类库仓库比较适合,pear和linux系统上的apt或者yum类似,维护类库以及他们的依赖性。

我的环境是windows 7,php 5.2.10(D:\phpnow\php-5.2.10-Win32目录)

下载安装好php之后,需要手动运行go-pear.bat。

D:\phpnow\php-5.2.10-Win32>go-pear.bat

Are you installing a system-wide PEAR or a local copy?
(system|local) [system] :

选择系统级别安装还是本地安装,默认system,直接回车

Below is a suggested file layout for your new PEAR installation.  To
change individual locations, type the number in front of the
directory.  Type 'all' to change all of them or simply press Enter to
accept these locations.  以下是默认的pear的临时、数据、配置、测试、执行目录的设置,默认回车

1. Installation base ($prefix)                   : D:\phpnow\php-5.2.10-Win32
2. Temporary directory for processing            : D:\phpnow\php-5.2.10-Win32\tmp
3. Temporary directory for downloads             : D:\phpnow\php-5.2.10-Win32\tmp
4. Binaries directory                            : D:\phpnow\php-5.2.10-Win32
5. PHP code directory ($php_dir)                 : D:\phpnow\php-5.2.10-Win32\pea
6. Documentation directory                       : D:\phpnow\php-5.2.10-Win32\doc
7. Data directory                                : D:\phpnow\php-5.2.10-Win32\dat
8. User-modifiable configuration files directory : D:\phpnow\php-5.2.10-Win32\cfg
9. Public Web Files directory                    : D:\phpnow\php-5.2.10-Win32\www
10. Tests directory                               : D:\phpnow\php-5.2.10-Win32\tes
11. Name of configuration file                    : C:\Windows\pear.ini
12. Path to CLI php.exe                           : D:\phpnow\php-5.2.10-Win32.

1-12, 'all' or Enter to continue:
Beginning install...
Configuration written to C:\Windows\pear.ini...(pear配置文件默认写入到这里
Initialized registry...
Preparing to install...
installing phar://go-pear.phar/PEAR/go-pear-tarballs/Archive_Tar-1.3.2.tar...
installing phar://go-pear.phar/PEAR/go-pear-tarballs/Console_Getopt-1.2.3.tar...
installing phar://go-pear.phar/PEAR/go-pear-tarballs/PEAR-1.7.2.tar...
installing phar://go-pear.phar/PEAR/go-pear-tarballs/Structures_Graph-1.0.2.tar...
pear/PEAR can optionally use package "pear/XML_RPC" (version >= 1.4.0)
install ok: channel://pear.php.net/Archive_Tar-1.3.2
install ok: channel://pear.php.net/Console_Getopt-1.2.3
install ok: channel://pear.php.net/Structures_Graph-1.0.2
install ok: channel://pear.php.net/PEAR-1.7.2
PEAR: Optional feature webinstaller available (PEAR's web-based installer)
PEAR: Optional feature gtkinstaller available (PEAR's PHP-GTK-based installer)
PEAR: Optional feature gtk2installer available (PEAR's PHP-GTK2-based installer)
PEAR: To install optional features use "pear install pear/PEAR#featurename"

↑然后直接通过默认的channel:pear.php.net 开始直接下载安装pear了,这些包是默认初始化安装的,之后可以添加、删除、更新。

******************************************************************************
WARNING!  Theinclude_path defined in the currently used php.ini does not
contain the PEAR PHP directory you just specified:
<D:\phpnow\php-5.2.10-Win32\pear>
If the specified directory is also not in the include_path used by
your scripts, you will have problems getting any PEAR packages working.

Current include path           : .;C:\php5\pear
Configured directory           : D:\phpnow\php-5.2.10-Win32\pear
Currently used php.ini (guess) :
Press Enter to continue:

接下来,需要将pear配置目录D:\phpnow\php-5.2.10-Win32\pear加入php.ini的include_path指令中。打开php.ini跳转到include_path,每个路径使用分号分隔,.表示当前目录,所以:

include_path = ".;d:\phpnow\php-5.2.10-Win32\PEAR"

然后重新启动apache,让php.ini的修改生效。

** WARNING! Old version found at D:\phpnow\php-5.2.10-Win32, please remove it or be sure to use the new d:\phpnow\php-5.2.10-win32\pear.bat command

The 'pear' command is now at your service at d:\phpnow\php-5.2.10-win32\pear.bat

然后可以通过pear.bat命令来对pear系统进行各种管理。
* WINDOWS ENVIRONMENT VARIABLES *
For convenience, a REG file is available under D:\phpnow\php-5.2.10-Win32\PEAR_ENV.reg .
This file creates ENV variables for the current user.

Double-click this file to add it to the current user registry.

运行php目录下的PEAR_ENV.reg将PEAR的各种目录加入环境变量中。

接下来需要测试pear时候已经安装成功,新建一个php文件,写入内容:

require_once 'System.php';
var_dump(class_exists('System'));

如果页面返回 bool(true) 表明安装成功。

一些常用的pear命令
安装包
  pear install packagename

下载包,但不安装
  pear download packagename
  pear download-all

安装已经下载的包
  pear install filename.tgz

列出channel里面所有的包
  pear remote-list

列出已经安装的包
  pear list

列出可升级的包
  pear list-upgrades

更新包
  pear upgrade packagename
  pear upgrade-all

删除包
  pear uninstall packagename

就大概说到这里,感兴趣的可以转移到官方网站了解详情,下载一个手册也够你看1年的了,囧。

主页:http://pear.php.net/

文档:http://pear.php.net/manual/

bugs:http://pear.php.net/bugs/

server 2003上跑asp超时问题

问题是,打开站点静态html文件和不需要连接oracle数据库的asp文件可以打开,有连数据库的文件无法打开。

尝试了各种方法,包括重新建立站点、重新建立应用池、分配权限等无果。

事件查看器报错是应用池超时。

最后

net stop w3svc

net start w3svc

搞定了。

太奇怪了。

Microsoft ScriptControl 控件使用指南

Microsoft ScriptControl 控件使用指南

随着动态网页的出现,脚本语言已经被越来越多的人认识、接受并撑握。在程序中加入对脚本的支持一方面可以最大限度的扩展程序的应用范围,另一方面也方便程序员利用现有脚本提供的一些特别的功能(如正则表达式等)。下面结合我个人的一点经验谈一谈这方面的应用。

很显然要自己去实现一个脚本解释器是不现实的。好在已经有了可以复用的组件,那就是Microsoft ScriptControl。这是一个ActiveX控件,随Windows2000一起发布,如果要在2000以前的Windows中使用则需要安装该控件(可以到MS的网站上找到)。

ScriptControl接口

属性名称 类型 备注
AllowUI BOOL 检测是否允许运行用户的接口元素。如果为False,则诸如消息框之类的界面元素不可见。
CodeObject Object 脚本暴露给宿主调用的对象。只读。
Modules Modules 宿主提供给脚本的组件库模块。只读。(COM组件通常都是以对象收集的形式向用户提供可以留给用户二次开发的对象集合,每一个收集即一个Modules)
Language String 设置或获取脚本引擎解释的语言,例如:VBScript、JScript。
Name String 脚本引擎的名称。只读。
Procedures Procedures 返回模块中定义的过程的集合
SitehWnd HWND 在脚本中显示UI的父窗口句柄
State Enum 设置或返回控件的状态,如果为0,控件只执行语句但不转发事件,为1则为加入的本控件接受的对象转发事件。
Timeout Long 控件的执行脚本的超时值,-1表示不超时
UseSafeSubset BOOL 设置或返回宿主程序是否关心安全。宿主程序的安全级别可以从此属性设置
Error Error 错误对象,发生错误时,此属性返回一个错误对象
方法名称 参数 功能
AddCode Code As String 往脚本引擎中加入要执行的脚本
AddObject Name As String, Object As Object, [AddMembers As Boolean = False] 往脚本引擎加入一个对象,以便在脚本中可以使用该对象提供的方法等。
Eval Expression As String 表达式求值
ExecuteStatement Statement As String 解释并执行脚本语句
Reset 丢弃所有的对象和代码,将State属性置0。
Run ProcedureName As String, ParamArray Parameters() As Variant 运行一个指定的过程
事件名称 功能
Error 有错误发生时激发该事件
TimeOut 执行过程超时时发生

一般使用方法

1、在程序中加入ScriptControl

2、定义一个ScriptControl的实例

3、调用AddCode等方法向脚本引擎中加入要执行的脚本。

4、调用Run执行要执行的脚本函数。

宿主与脚本的通讯

1、  宿主调用脚本:这个过程比较简单,只要调用Run就可以将参数传递到脚本。

2、  脚本调用宿主:在初始化过程中调用AddObject接口,将宿主的一个或多个对象暴露给脚本,这时就可以在脚本中调用宿主对象的方法。在VC++中这个对象不是普通的C++类,它必须支持自动化,在脚本中也只能调用对象中自动化接口(在VB中这个个程相对比较简单)。

脚本调试

任何人写的代码都不可能一次就很完美,但是脚本由于执行的位置特殊,调试方法也不一样。首先下载一个脚本调试器(我用的是Microsoft Script Debugger, 在MS网站有下载,另据说其它的如VJ++也可以),安装以后在菜单上没有启动菜单。

调试器的启动

在一般的高级语言中都可以方便的设置断点,但是在启动脚本调试器以前如何开始调试呢?在IE中脚本出错会自动提示是否调试,还可以在脚本中加入中断代码(VBScript: Stop JavaScript: debugger),但是在ScriptControl还需要修改一下注册表才可以,你需要将HKEY_CURRENT_USER\Software\Microsoft\Windows Script\Settings下的JITDebug的值改为1(默认为0)

一个实例来源

asp解析json

第一种方法:在服务器上运行jscript

<script language="JScript" runat="Server">
function toObject(json) {
eval("var o=" + json);
return o;
}
</script>
<%

Dim json
json = "{'uid':'1','username':'abc','email':'123@163.com'}"
Set json = toObject(json)

Response.Write json.uid & "<br/>"
Response.Write json.username & "<br />"
Response.Write json.email & "<br />"

Set json = Nothing
%>

第二种方法:使用MSScriptControl.ScriptControl,和第一种方法类似,只是在不同的环境下执行js。

这里有一个例子和parser。 第三种方法:另外一个parser。 第四种方法:使用aspjson

asp中的option explicit

字面理解,option就是设置,explicit的意思:详述的,明确的;毫不隐瞒的,露骨的。 option explicit 表示所有的变量要先声明,再使用 如果使用,Option Explicit 语句必须写在模块的所有过程之前。 如果模块中使用了 Option Explicit,则必须使用 Dim、Private、Public、ReDim 或 Static 语句来显式声明所有的变量。如果使用了未声明的变量名在编译时间会出现错误。 使用 Option Explicit 可以避免在键入已有变量时出错,在变量的范围不是很清楚的代码中使用该语句可以避免混乱。 一个简单的例子:

option explicit
dim dimedvar
myvar=10 '报错:变量未定义: 'myvar'
dimedvar="dimed" '没有报错