2010年5月

扩展php的异常处理类

使用PHP编程时,虽然可以跟踪异常的路线,但是在实际应用中需要使用不同的异常处理类处理不同的异常。 所以,我们就有必要写一个PHP扩展异常处理类了。

例如:

[code language="php"]
<?php
class FileExists extends Exception
{
//文件不存在异常
}
class FileOpen extends Exception
{
//文件不能打开异常
}
$path = "E://www.phpdo.net";
try
{
open_file($path);
}
catch(FileExists $e)
{
echo "程序运行异常: ".$e->getMessage()."\n";
}
catch(FileOpen $e)
{
echo "程序运行异常,".$e->getMessage()."\n";
}
catch(Exception $e)
{
echo "不可预知的异常";
echo "异常信息:".$e->getMessage()."\n";
echo "异常代码:".$e->getCode()."\n";
echo "文件名:".$e->getFile()."\n";
echo "异常代码所在的行".$e->getLine()."\n";
echo "异常信息传递路线:";
print_r($e->getTrace()); //返回数组形式的传递路线
echo $e->getTraceAsString(); //返回字符串形式的传递路线
}

function open_file($path)
{
if(!file_exists($path))
{
//抛出FileExists异常
throw new FileExists("www.php.net不存在",1);
}
if(!fopen("$path",r))
{
//抛出FileOpen异常
throw new FileOpen("www.php.net无法打开",2);
}
}
?>

[/code]

结果:
程序运行异常: http://www.php.net/不存在
php扩展异常处理类时需要注意的是: 捕获特定异常时,还需要捕获Exception类,用于处理未捕获的异常; 捕获异常时,需要按照顺序从上向下捕获(如果先捕获Exception类,则会导致异常不能被正确的代码处理,例如将“catch(Exception $e)“语句放到“catch(FileExists $e)”之前,会发生什么?)所以在设定时,需要将特定异常的catch语句写在前面,将一般的Exception语句写在最后。
根据这个例子,我们能看出使用php扩展异常处理类的优点是什么呢?
可自定义扩展类; 根据不同的异常做出不同的反应;提高代码的可读性,使得不同的异常容易被区分 。

探究PHP底层运行机制

本文详细讲解了PHP底层的运行机制,包括PHP内容的运作并结合实例讲解了PHP从启动到停止的整个生命周期。

简介
我们从未手动开启过PHP的相关进程,它是随着Apache的启动而运行的;PHP通过mod_php5.so模块和Apache相连(具体说来是SAPI,即服务器应用程序编程接口);
PHP总共有三个模块:内核、Zend引擎、以及扩展层; PHP内核用来处理请求、文件流、错误处理等相关操作; Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它; 扩展层是一组函数、类库和流,PHP使用它们来执行一些特定的操作。比如,我们需要mysql扩展来连接MySQL数据库; 当ZE执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;
最后,ZE将程序运行结果返回给PHP内核,它再将结果传送给SAPI层,最终输出到浏览器上。
深入探讨
真是的内部运行过程没有这么简单。以上过程只是个简略版,让我们再深入挖掘一下,看看幕后还发生了些什么。
◆Apache启动后,PHP解释程序也随之启动;
◆PHP的启动过程有两步:
第一步是初始化一些环境变量,这将在整个SAPI生命周期中发生作用;
第二步是生成只针对当前请求的一些变量设置。

PHP启动第一步
不清楚什么第一第二步是什么?别担心,我们接下来详细讨论一下。让我们先看看第一步,也是最主要的一步。要记住的是,第一步的操作在任何请求到达之前就发生了。
启动Apache后,PHP解释程序也随之启动;

PHP调用各个扩展的MINIT方法,从而使这些扩展切换到可用状态。看看php.ini文件里打开了哪些扩展吧; MINIT的意思是“模块初始化”。各个模块都定义了一组函数、类库等用以处理其他请求。
一个典型的MINIT方法如下:
PHP_MINIT_FUNCTION(extension_name){ /* Initialize functions, classes etc */ }
PHP启动第二步
当一个页面请求发生时,SAPI层将控制权交给PHP层。于是PHP设置了用于回复本次请求所需的环境变量。同时,它还建立一个变量表,用来存放执行过程中产生的变量名和值。

PHP调用各个模块的RINIT方法,即“请求初始化”。一个经典的例子是Session模块的RINIT,如果在php.ini中启用了Session模块,那在调用该模块的RINIT时就会初始化$_SESSION变量,并将相关内容读入;

RINIT方法可以看作是一个准备过程,在程序执行之间就会自动启动。
一个典型的RINIT方法如下:
PHP_RINIT_FUNCTION(extension_name) { /* Initialize session variables,
pre-populate variables,
redefine global variables etc */ }
PHP关闭第一步
如同PHP启动一样,PHP的关闭也分两步:
一旦页面执行完毕(无论是执行到了文件末尾还是用exit或die函数中止),PHP就会启动清理程序。它会按顺序调用各个模块的RSHUTDOWN方法。
RSHUTDOWN用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。
一个典型的RSHUTDOWN方法如下:
PHP_RSHUTDOWN_FUNCTION(extension_name) { /* Do memory management,
unset all variables used in the last PHP call etc */ }
PHP关闭第二步
最后,所有的请求都已处理完毕,SAPI也准备关闭了,PHP开始执行第二步:
PHP调用每个扩展的MSHUTDOWN方法,这是各个模块最后一次释放内存的机会。
一个典型的RSHUTDOWN方法如下:
PHP_MSHUTDOWN_FUNCTION(extension_name) { /* Free handlers and persistent memory etc */ }
这样,整个PHP生命周期就结束了。要注意的是,只有在服务器没有请求的情况下才会执行“启动第一步”和“关闭第二步”。

原文地址:http://cn1997.blog.163.com/blog/static/49155474201042494823590/

PHP中session失效和不传递的解决办法

有很多人发现这个问题,为什么他写的session不能传递到下一个页面去。总结一下,一般有两种情况:

我们先写个php文件:<?=phpinfo()?>, 传到服务器去看看服务器的参数配置。

转到session部分,看到session.use_trans_sid参数被设为了零。

这个参数指定了是否启用透明SID支持,即session是否随着URL传递。我个人的理解是,一旦这个参数被设为0,那么每个URL都会启一个session。这样后面页面就无法追踪得到前面一个页面的session,也就是我们所说的无法传递。两个页面在服务器端生成了两个session文件,且无关联。(不知道这样理解对不对?请高手指教。)

所以一个办法是在配置文件php.ini里把session.use_trans_sid的值改成1。

当然我们知道,不是谁都有权限去改php的配置的,那么还有什么间接的解决办法呢?

下面就用两个实例来说明吧:

文件1 t1.php

[code language="php"]
<?php
//表明是使用用户ID为标识的session
session_id(SID);
//启动session
session_start();
//将session的name赋值为junstyle
$_SESSION['name']="junstyle";
//输出session,并设置超链接到第二页t2.php
echo "<a href=\"t2.php\">".$_SESSION['name']."</a>";
?>

[/code]

文件2: t2.php

[code language="php"]

<?php
表明是使用用户ID为标识的session
session_id(SID);
//启动session
session_start();
//输出t1.php中传递的session。
echo "This is ".$_SESSION['name'];
?>

[/code]

所以,重点是在session_start();前加上session_id(SID);,这样页面转换时,服务器使用的是用户保存在服务器session文件夹里的session,解决了传递的问题。

第二个可能的原因是对服务器保存session的文件夹没有读取的权限,还是回到phpinfo.php中,查看session保存的地址:

session.save_path: var/tmp

所以就是检查下var/tmp文件夹是否可写。

写一个文件:t3.php来测试一下:

[code language="php"]

<?
echo var_dump(is_writeable(ini_get("session.save_path")));
?>

[/code]

如果返回bool(false),证明文件夹写权限被限制了,那就换个文件夹咯,在你编写的网页里加入:

//设置当前目录下session子文件夹为session保存路径。
$sessSavePath = dirname(__FILE__).'/session/';
//如果新路径可读可写(可通过FTP上变更文件夹属性为777实现),则让该路径生效。
if(is_writeable($sessSavePath) && is_readable($sessSavePath))
{session_save_path($sessSavePath);}

大功告成,希望对你有帮助。

http://havi.blogbus.com/logs/64083922.html

IE6下margin的大小为双倍的解决方法

此问题为IE6下的double margin bug,当一个用float浮动的元素,再设定margin的时候,IE6会把该值渲染为双倍大小。
例如CSS:

float:left;margin-left:100px;

IE6会将margin-left显示成200px;

测试代码如下:
[code language="html"]
<html>
<head>
<title>test margin with float in IE 6</title>
<style type="text/css">
body{margin:0;padding:0;}
div{margin-bottom:20px;}
.dflml,.dfrmr{width:200px;height:200px;}
.dflml{float:left;margin-left:100px;background-color:#DDD;}
.dfrmr{float:right;margin-right:100px;background-color:#CCC;}
.hk{_display:inline;background-color:red;}
</style>
</head>

<body>
<div>
<div>float left and margin-left 100px</div>
<div>float right and margin-right 100px</div>
</div>
<div>
<div>float left and margin-left 100px <strong>with hack</strong></div>
<div>float right and margin-right 100px <strong>with hack</strong></div>
</div>
</body>
</html>
[/code]

将上述代码复制,另存为“test.html”,双击运行即可见到效果;

此Bug的解决方法:

给浮动元素添加“display:inline”的css样式或者直接设置margin为一半的值(如:_margin-left:5px;)即可。

PHP session有效期探讨

PHP中的session有效期默认是1440秒(24分钟)【weiweiok 注:php5里默认的是180分】,也就是说,客户端超过24分钟没有刷新,当前session就会失效。很明显,这是不能满足需要的。
一个已知管用的方法是,使用session_set_save_handler,接管所有的session管理工作,一般是把session信息存储到数据库,这样可以通过SQL语句来删除所有过期的session,精确地控制session的有效期。这也是基于PHP的大型网站常用的方法。但是,一般的小型网站,似乎没有必要这么劳师动众。
但是一般的Session的生命期有限,如果用户关闭了浏览器,就不能保存Session的变量了!那么怎么样可以实现Session的永久生命期呢?
大家知道,Session储存在服务器端,根据客户端提供的SessionID来得到这个用户的文件,然后读取文件,取得变量的值,SessionID可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录……
要实现Session的永久生命期,首先需要了解一下php.ini关于Session的相关设置(打开php.ini文件,在“[Session]”部分):
1、session.use_cookies:默认的值是“1”,代表SessionID使用Cookie来传递,反之就是使用Query_String来传递;
2、session.name:这个就是SessionID储存的变量名称,可能是Cookie,也可能是Query_String来传递,默认值是“PHPSESSID”;
3、session.cookie_lifetime:这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个所以Session不能永久使用!
4、session.gc_maxlifetime:这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除!
还有很多的设置,不过和本文相关的就是这些了,下面开始讲使用永久Session的原理和步骤。
前面说过,服务器通过SessionID来读取Session的数据,但是一般浏览器传送的SessionID在浏览器关闭后就没有了,那么我们只需要人为的设置SessionID并且保存下来,不就可以……
如果你拥有服务器的操作权限,那么设置这个非常非常的简单,只是需要进行如下的步骤:
1、把“session.use_cookies”设置为1,打开Cookie储存SessionID,不过默认就是1,一般不用修改;
2、把“session.cookie_lifetime”改为正无穷(当然没有正无穷的参数,不过999999999和正无穷也没有什么区别);
3、把“session.gc_maxlifetime”设置为和“session.cookie_lifetime”一样的时间;
在PHP的文档中明确指出,设定session有效期的参数是session.gc_maxlifetime。可以在php.ini文件中,或者通过ini_set()函数来修改这一参数。问题在于,经过多次测试,修改这个参数基本不起作用,session有效期仍然保持24分钟的默认值。
由于PHP的工作机制,它并没有一个daemon线程,来定时地扫描session信息并判断其是否失效。当一个有效请求发生时,PHP会根据全局变量session.gc_probability/session.gc_divisor(同样可以通过php.ini或者ini_set()函数来修改)的值,来决定是否启动一个GC(Garbage Collector)。
默认情况下,session.gc_probability = 1,session.gc_divisor =100,也就是说有1%的可能性会启动GC。GC的工作,就是扫描所有的session信息,用当前时间减去session的最后修改时间(modified date),同session.gc_maxlifetime参数进行比较,如果生存时间已经超过gc_maxlifetime,就把该session删除。
到此为止,工作一切正常。那为什么会发生gc_maxlifetime无效的情况呢?
在默认情况下,session信息会以文本文件的形式,被保存在系统的临时文件目录中。在Linux下,这一路径通常为\tmp,在 Windows下通常为C:\Windows\Temp。当服务器上有多个PHP应用时,它们会把自己的session文件都保存在同一个目录中。同样地,这些PHP应用也会按一定机率启动GC,扫描所有的session文件。
问题在于,GC在工作时,并不会区分不同站点的session。举例言之,站点A的gc_maxlifetime设置为2小时,站点B的 gc_maxlifetime设置为默认的24分钟。当站点B的GC启动时,它会扫描公用的临时文件目录,把所有超过24分钟的session文件全部删除掉,而不管它们来自于站点A或B。这样,站点A的gc_maxlifetime设置就形同虚设了。
找到问题所在,解决起来就很简单了。修改session.save_path参数,或者使用session_save_path()函数,把保存session的目录指向一个专用的目录,gc_maxlifetime参数工作正常了。
严格地来说,这算是PHP的一个bug?
还有一个问题就是,gc_maxlifetime只能保证session生存的最短时间,并不能够保存在超过这一时间之后session信息立即会得到删除。因为GC是按机率启动的,可能在某一个长时间内都没有被启动,那么大量的session在超过gc_maxlifetime以后仍然会有效。
解决这个问题的一个方法是,把session.gc_probability/session.gc_divisor的机率提高,如果提到100%,就会彻底解决这个问题,但显然会对性能造成严重的影响。另一个方法是自己在代码中判断当前session的生存时间,如果超出了 gc_maxlifetime,就清空当前session。
但是如果你没有服务器的操作权限,那就比较麻烦了,你需要通过PHP程序改写SessionID来实现永久的Session数据保存。查查php.net的函数手册,可以见到有“session_id”这个函数:如果没有设置参数,那么将返回当前的SessionID,如果设置了参数,就会将当前的SessionID设置为给出的值……
只要利用永久性的Cookie加上“session_id”函数,就可以实现永久Session数据保存了!
但是为了方便,我们需要知道服务器设置的“session.name”,但是一般用户都没有权限查看服务器的php.ini设置,不过PHP提供了一个非常好的函数“phpinfo”,利用这个可以查看几乎所有的PHP信息!
------------------------------------------------------------------------------------
<title>PHP相关信息显示</title>
<?phpinfo()?>
------------------------------------------------------------------------------------
打开编辑器,输入上面的代码,然后在浏览器中运行这个程序,会见到PHP的相关信息(如图1所示)。其中有一项“session.name”的参数,这个就是我们需要的服务器“session.name”,一般是“PHPSESSID”。
记下了SessionID的名称后,我们就可以实现永久的Session数据储存了!
复制代码 代码如下:
session_start();
ini_set('session.save_path','/tmp/');
//6个钟头
ini_set('session.gc_maxlifetime',21600);
//保存一天
$lifeTime = 24 * 3600;
setcookie(session_name(), session_id(), time() + $lifeTime, "/");

后记:
其实真正的永久储存是不可能的,因为Cookie的保存时间有限,而服务器的空间也有限……但是对于一些需要保存时间比较长的站点,以上方法就已经足够了!
把session放入mysql的Example:
数据库里建表:session ( sesskey varchar32 , expiry int11 , value longtext)
code:
代码执行前已经连接数据库了。
复制代码 代码如下:
define('STORE_SESSIONS','mysql');
if (STORE_SESSIONS == 'mysql') {
if (!$SESS_LIFE = get_cfg_var('session.gc_maxlifetime')) {
$SESS_LIFE = 1440;
}
function _sess_open($save_path, $session_name) {
// 如果没有连接数据库,可以在此执行mysql_pconnect,mysql_select_db
return true;
}
function _sess_close() {
return true;
}
function _sess_read($key) {
$value_query = mysql_query("select value from sessions where sesskey = '" .addslashes($key) . "' and expiry > '" . time() . "'");
$value = mysql_fetch_array($value_query);
if (isset($value['value'])) {
return $value['value'];
}
return false;
}
function _sess_write($key, $val) {
global $SESS_LIFE;
$expiry = time() + $SESS_LIFE;
$value = $val;
$check_query = mysql_query("select count(*) as total from sessions where sesskey = '" . addslashes($key) . "'");
$check = mysql_fetch_array($check_query);
if ($check['total'] > 0) {
return mysql_query("update sessions set expiry = '" . addslashes($expiry) . "', value = '" . addslashes($value) . "' where sesskey = '" . addslashes($key) . "'");
} else {
return mysql_query("insert into sessions values ('" . addslashes($key) . "', '" . addslashes($expiry) . "', '" . addslashes($value) . "')");
}
}
function _sess_destroy($key) {
return mysql_query("delete from sessions where sesskey = '" . addslashes($key) . "'");
}
function _sess_gc($maxlifetime) {
mysql_query("delete from sessions where expiry < '" . time() . "'");
return true;
}
session_set_save_handler('_sess_open', '_sess_close', '_sess_read', '_sess_write', '_sess_destroy', '_sess_gc');
}
danoo_session_name( 'dtvSid' );
danoo_session_save_path(SESSION_WRITE_DIRECTORY);

还是有点不明白,open,write那些参数哪里来的。
修改php.ini配置的两个常用函数:
get_cfg_var('session.gc_maxlifetime') : 取得session.gc_maxlifetime的值
ini_set('session.cookie_lifetime','0') : 设置session.cookie_lifetime的值为0。

php中如何把字符串的第一个字符变成小写

lcfirst — 用这个函数可以把字符串的第一个字符变成小写(Make a string's first character lowercase),php5.3以前的版本不支持这个函数,你可以把下面的这个函数放到全局范围:

[code language="php"]
if (!function_exists('lcfirst')) {
function lcfirst($str)
{
$str = is_string($str) ? $str : '';
if(mb_strlen($str) > 0) {
$str[0] = mb_strtolower($str[0]);
}
return $str;
}
}
[/code]

The advantage of the above over just strolower ing where needed is that your PHP code will simply switch to the native function once you upgrade to PHP5.3

Updated after comments. The function does now check whether there actually is a first character in the string and that it is an alphabetic character in the current locale. It is also multibyte aware now.

google maps api教程(一):用google maps生成向导生成即时地图

用google maps生成向导生成即时地图。google提供了一个向导来生成google maps的代码片段,你可以把它放入到你的网站页面中。点击此处转到向导页,并按照里面的3个简单的步骤操作。

1、定制地图的长宽、缩放级别、中心位置、中心位置的链接地址、中心位置的地址说明。当点击中心位置的那个箭头时会显示这些信息。

2、输入你网站的网址,以便生成一个API key。

3、点击生成按钮就可以生成代码了。

最后把生成的代码复制到您自己的网页中就可以使用了,以下为生成的代码例子:

[code language="javascript"]
<!-- ++Begin Map Search Control Wizard Generated Code++ -->
<!--
// Created with a Google AJAX Search Wizard
// http://code.google.com/apis/ajaxsearch/wizards.html
-->

<!--
// The Following div element will end up holding the map search control.
// You can place this anywhere on your page
-->
<div id="mapsearch">
<span style="color:#676767;font-size:11px;margin:10px;padding:4px;">Loading...</span>
</div>

<!-- Maps Api, Ajax Search Api and Stylesheet
// Note: If you are already using the Maps API then do not include it again
// If you are already using the AJAX Search API, then do not include it
// or its stylesheet again
//
// The Key Embedded in the following script tags is designed to work with
// the following site:
// http://junstyle.me
-->
<script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAurOz_u21LMSjFODxuxTsbxSWkWNcz8otOi80ukkm5C_9fVjCfhS7lPl_eE2MldQL6fDI9jugOBzLoA"
type="text/javascript"></script>
<script src="http://www.google.com/uds/api?file=uds.js&v=1.0&source=uds-msw&key=ABQIAAAAurOz_u21LMSjFODxuxTsbxSWkWNcz8otOi80ukkm5C_9fVjCfhS7lPl_eE2MldQL6fDI9jugOBzLoA"
type="text/javascript"></script>
<style type="text/css">
@import url("http://www.google.com/uds/css/gsearch.css");
</style>

<!-- Map Search Control and Stylesheet -->
<script type="text/javascript">
window._uds_msw_donotrepair = true;
</script>
<script src="http://www.google.com/uds/solutions/mapsearch/gsmapsearch.js?mode=new"
type="text/javascript"></script>
<style type="text/css">
@import url("http://www.google.com/uds/solutions/mapsearch/gsmapsearch.css");
</style>

<style type="text/css">
.gsmsc-mapDiv {
height : 275px;
}

.gsmsc-idleMapDiv {
height : 275px;
}

#mapsearch {
width : 365px;
margin: 10px;
padding: 4px;
}
</style>
<script type="text/javascript">
function LoadMapSearchControl() {

var options = {
zoomControl : GSmapSearchControl.ZOOM_CONTROL_ENABLE_ALL,
title : "Googleplex",
url : "http://www.google.com/corporate/index.html",
idleMapZoom : GSmapSearchControl.ACTIVE_MAP_ZOOM,
activeMapZoom : GSmapSearchControl.ACTIVE_MAP_ZOOM
}

new GSmapSearchControl(
document.getElementById("mapsearch"),
"1600 Amphitheatre Parkway, Mountain View, CA",
options
);

}
// arrange for this function to be called during body.onload
// event processing
GSearch.setOnLoadCallback(LoadMapSearchControl);
</script>
<!-- ++End Map Search Control Wizard Generated Code++ -->
[/code]

把以上的代码放置到你的页面的body之间,不要放在head里面。

本文参考自:http://econym.org.uk/gmap/wizard.htm

oracle virtualbox3.2.0.0发布

看到virtualbox3.2.0.0发布了,下载,安装后用了一下,我以前建的两个虚拟主机居然都打不开,自从oracle收购了sun之后,好像这是发布的第一个带oracle标识的版本,看新闻增加了以下特性:

- 可动态增加或减少VM 的内存使用
- CPU hot-plugging 支持(Linux guest 支持 hot-add 和 hot-remove,Windows guest 仅支持hot-add)
- 新的Hypervisor 特性
- VM 运行时也可删除snapshots
- 能够在GUI 中设置multi-monitor guest
- USB tablet/keyboard的基本模拟
- LsiLogic SAS controller的基本模拟
- RDP 视频加速
- 可通过API 和VBoxManage 配置NAT engine
- Guest Additions:支持从host 系统执行 guest 应用程序
- 增强了 OVF 支持

但现在在win7 64位下我以前的虚拟主机不能用,所以安装后就卸载了,还是用3.1.6算了。不知道下一个版本会怎么样,期待。

四个常用的php配置文件操作函数-ini配置函数

php的配置文件操作函数就是几个ini_*的函数,四个函数分别为:ini_get、ini_set、ini_get_all、 ini_restore。最常用的两个是ini_set和ini_get。

一、ini_get():获取配置文件的选项值

获取配置文件中某一个选项的值,如果是true值就返回1,如果是false值就返回0,字符串就返回字符串。
比如手册中的例子:
/*
Our php.ini contains the following settings:

display_errors = On
register_globals = Off
post_max_size = 8M
*/
echo 'display_errors = ' . ini_get('display_errors') . "n"; //显示错误是否打开
echo 'register_globals = ' . ini_get('register_globals') . "n";//全局变量是否打开
echo 'post_max_size = ' . ini_get('post_max_size') . "n";//最多能提交的文件大小
echo 'post_max_size+1 = ' . (ini_get('post_max_size')+1) . "n";
?>

输出:
display_errors = 1
register_globals = 0
post_max_size = 8M
post_max_size+1 = 9

这个函数主要是为了获取配置文件,可以方便你很多操作。比如你想操作字符串过滤,但是又不清楚magic_quotes_gpc 有没有打开,所以你就可以这样写一个函数:

/* 字符串过滤函数 */
function stringFilter($str)
{
if (ini_get('magic_quotes_gpc)') {
return $str;
} else {
return addslashes($str);
}
}
当然,如果你无法知道你的全局变量是否打开,也可以定制这样的函数:

/* 变量检测函数 */
function getGetVar($var)
{
if (ini_set('register_gobals')) {
return $var;
} else {
return $_GET['var'];
}
}
当然,你可以做很多用途,自己慢慢体会。

二、ini_set函数:设置php.ini 中的某些变量值

这个函数是设置 选项中的值,在执行函数后生效,脚本结束的时候,这个设置也失效。不是所有的选项都能被改函数设置的。具体 那些值能够设置,可以查看手册中的列表。
就 是能够设置php.ini中的选项值比 如,display_error选项关闭了,但是你要显示程序中的错误信息,方便你调试程序,那么就可以使用这个函数:

ini_set("display_errors", "On");

那么在你这个页面的程序都会显示错误信息了,而且你还可以使用 error_reporting来设置显示的错误信息级别。
如果你需要增加脚本执行 时间,那么可以设置:

ini_set("max_execution_time", "180");

那么脚本执行时间就由默认的30秒变为180秒,当然,你也可以使用set_time_limit()来设置。
其 实你把ini_set和ini_get结合使的话,非常好。比如你想在配置文件里添加自己的包含文件路径,但是你有没有权限更改 php.ini,那么你可以结合两个函数:

ini_set('include_path',ini_get('include_path').':/your_include_dir:');

三、ini_get_all: 获取所有的设置选项变量

把所有选项值以数组的形式返回,方便你当phpinfo()无法使用的时候来使用。

手册例子, 比如:

$inis = ini_get_all();

print_r($inis);

?>

部 分输出:

Array
(
[allow_call_time_pass_reference] => Array
(
[global_value] => 1
[local_value] => 1
[access] => 6
)
[allow_url_fopen] => Array
(
[global_value] => 1
[local_value] => 1
[access] => 7
)
...
)

四、ini_restore: 恢复配置文件默认的值

这个比较简单了,就是恢复配置文件的默认值。

用eclipse和pdt配置php开发及调试环境

一、安装apache,mysql,php

下载php,地址:http://www.php.net/releases/
apache和mysql都下安装包,双击运行,选择要安装的目录,一直点击下一步就可以安装成功。
注意:安装apache的时候要保证80端口没有被占用,否则会安装不成功。如果在运行iis和skype,在安装之前都先停掉。
对于php,下载zip文件,解压到某个目录就行。

二、配置apche,mysql,php

对于php4
1) 将php.ini-dist更名为php.ini。并复制到windows/system32下 面或者复制到 apache/bin下面。并修改php.ini
找到extension=php_mysql.dll, 把前面的分号(;)去掉。
2) 修改httpd.conf。添加:
AddType application/x-httpd-php .php
LoadFile "C:/php-4.4.6/php4ts.dll"
LoadModule php4_module "C:/php-4.4.6/sapi/php4apache2.dll"
找到DirectoryIndex index.html index.html.var 在后面加入 index.php
3) 保存修改。重新启动apache服务器。
对于php5
1) php.ini-recommended更名为php.ini。并复制到windows/system32下面 或者复制到 apache/bin下面。并修改php.ini
找到extension=php_mysql.dll, 把前面的分号(;)去掉。
2) 修改httpd.conf。添加:
AddType application/x-httpd-php .php
LoadModule php5_module "C:/php5/php5apache2.dll"
找到DirectoryIndex index.html index.html.var 在后面加入 index.php
3)保存修改。重新启动apache服务器

三、下载pdt。下载带有zenddebug的all-in-one版本

地址:http://downloads.zend.com/pdt/all-in-one/pdt-1.0.3.R20080603_debugger-5.2.14.v20080602-all-in-one-win32.zip

四、下载ZendDebugger

因为pdt all-in-one中的ZendDebugger.dll的版本可能和你系统中php的版本不兼容,所以最好单独下载一个。
地址:http://downloads.zend.com/pdt/server-debugger/ZendDebugger-5.2.14- cygwin_nt-i386.zip
解压后,可以看到目录下有“5_0_x_comp”和“5_1_x_comp”等。该目录下的ZendDebugger.dll就是和相关的php版本对应。如果你的php是php5.0 就用5_0_x_comp下面的ZendDebugger.dll。如果你的php是php5.1就用5_1_x_comp下面的 ZendDebugger.dll。

五、apache,php的配置

我的apache安装在D:\phpProgram\Apache2
php安装在D:\phpProgram\php5
php.ini放在了D:\phpProgram \Apache2\bin下面。
1)将合适的ZendDebugger.dll复制到D:\phpProgram\php5\ext下面。
2)修改D:\phpProgram\Apache2\bin下面的php.ini
增加:
zend_extension_ts="D:\phpProgram\php5\ext\ZendDebugger.dll"
zend_debugger.allow_hosts=192.168.1.105,127.0.0.1
zend_debugger.expose_remotely=always
zend_debugger.connector_port = 10137
注:192.168.1.105就是你在命令提示符下输入ipconfig /all看到的本地连接的
IP Address右边的值。
如果提示ipconfig不是内部命令,那么可以进入windows的system32下面。输入 ipconfig /all.
3)修改D:\phpProgram\Apache2\conf下面的httpd.conf
增加:
Alias /phpWorks "D:/my works/phpWorks"
&lt;Directory "D:/my works/phpWorks">
Options Indexes MultiViews ExecCGI
DirectoryIndex index.php
AllowOverride None
Order allow,deny
Allow from all
&lt;/Directory>
找到DocumentRoot 那一项改为:
DocumentRoot "D:/my works/phpWorks"

六、pdt的配置

1) 启动eclipse,双击eclipse.exe
2)选择工作目录为D:\my works\phpWorks
3) 点击windows>prefences
展开左侧面板中”PHP“下面的项目
展开”DeBug“,双击下面的Installed DeBuggers。
选择”Zend Debugger“,点击”Configure“。
在弹出的对话框 中,在Debug Port后面的输入框中输入10137,在Client Host/IP后面的输入框中输入192.168.1.105,127.0.0.1。点击”OK“。
双 击”PHP“下面,和” DeBug“同级的”PHP Executables“,点击”Add“。
在 弹出的对话框中,在name后面的输入框中输入php。
Executable Path为php.exe的路径,即 D:\phpProgram\php5\php.exe
PHP.ini file(optional)为php.ini的路径,即D:\phpProgram \Apache2\bin\php.ini。
PHP Debugger选择为Zend Debugger。点击”Finished“。
双击”PHP“下面,和” DeBug“同级的”PHP Servers“。
选择”Default PHP Web Server“,点击”Edit“。
在 弹出的对话框中,在”Server“选项卡下的Name后面的输入框中输入Default PHP Web Server,另一个输入框中输入http://localhost/phpWorks。
在”Path Mapping“选项卡中,点击”Add“。
在弹出的对话框中,在Path On Server下面的输入框中输入http://localhost/phpWorks,
在Path in File System下面的对话框中输入D:\my works\phpWorks。

七、重启eclipse,启动apache