2013年5月31日星期五

【转】php之call_user_func_array的简易用法

今天在群里面,有个叫lewis的在问call_user_func_array的用法,因为之前一直没有用过,也不能说什么,于是看一下手册,发现是这么写的:

call_user_func_array

(PHP 4 >= 4.0.4, PHP 5)

call_user_func_array --  Call a user function given with an array of parameters

Description

mixed call_user_func_array ( callback function, array param_arr )

Call a user defined function given by function, with the parameters in param_arr.
然后还有一个例子:


<?php
function debug($var, $val
{
    
echo "***DEBUGGING\nVARIABLE: $var\nVALUE:";
    
if (is_array($val|| is_object($val|| is_resource($val)) {
        
print_r($val);
    } 
else {
        
echo "\n$val\n";
    }
    
echo "***\n";
}

$c = mysql_connect();
$host = $_SERVER["SERVER_NAME"];

call_user_func_array('debug', array("host", $host));
call_user_func_array('debug', array("c", $c));
call_user_func_array('debug', array("_POST", $_POST));
?> 
相信看了例子之后应该有点明白了吧?
我自己是这么理解这个函数的,如果说的不对,还望各位高手不要耻笑:
     该函数真正的用法有点类似于函数重载,因为他的第一个参数是字符型的,也就是函数的名称,第二个参数是数组,我们可以当成该函数的各个参数,而事实上也就是这么用的,如果你看过我的前一篇文章:PHP的伪重载 ,或许你能够理解,正是因为这个函数的存在,我发现函数重载也可以这样运用:
 1    /**
 2     * 例子写完后,本来认为完事了,结果遇到有人问call_user_func_array(),看了一下手册
 3     * 原来,我上面的那个test函数还可以精简成如下的例子,
 4     */
 5    function otest1 ($a)
 6    {
 7        echo'一个参数' );
 8    }
 9
10    function otest2 ( $a, $b)
11    {
12        echo'二个参数' );
13    }
14
15    function otest3 ( $a ,$b,$c)
16    {
17        echo'三个啦' );
18    }
19
20    function otest ()
21    {
22        $args = func_get_args();
23        $num = func_num_args();
24        call_user_func_array'otest'.$num, $args  );
25    }
26
27    otest(1,2);
28
看到不?而我最初的写法,在PHP的伪重载一文中有所提及,仅作参考。。。。

这些只是call_user_func_array的简易用法,在PHP4下测试过,而手册中还有一些将第一个参数当成数组来传入的例子,我在PHP4下是没有办法运行的,也许PHP5可以吧,但我不用PHP5的,也没有办法解释什么。谢谢各位

摘自:http://www.cnitblog.com/neatstudio/archive/2006/07/21/13990.html

【转】func_get_args的使用

func_get_args是获取方法中参数的数组,返回的是一个数组,与func_num_args搭配使用;
func_num_args一般写在方法中,用于计数;
使用方法如下:
function foo($a='gg',$b='kk'){
 
   $numargs = func_num_args();
     echo "Number of arguments: $numargs<br />\n";
     if ($numargs >= 2) {
         echo "Second argument is: " . func_get_arg(1) . "<br />\n";
     }
    $arg_list = func_get_args();
     for ($i = 0; $i < $numargs; $i++) {
         echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
     }
}

foo(1, 2);=》输出内容为:
Number of arguments: 2
Second argument is: 2
Argument 0 is: 1
Argument 1 is: 2

摘自:http://blog.sina.com.cn/s/blog_816cdc2301014rvt.html

2013年5月27日星期一

【转】mysql 创建索引、修改索引、删除索引的命令

创建和删除索引
索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER TABLE来给表增加索引。删除索引可以利用ALTER TABLE或DROP INDEX语句来实现。

(1)使用ALTER TABLE语句创建索引。
语法如下:

  1. alter table table_name add index index_name (column_list) ; 
  2. alter table table_name add unique (column_list) ; 
  3. alter table table_name add primary key (column_list) ; 

其中包括普通索引、UNIQUE索引和PRIMARY KEY索引3种创建索引的格式,table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引 名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以同时创建多个索引。
创建索引的示例如下:

  1. mysql> use tpsc 
  2. Database changed 
  3. mysql> alter table tpsc add index shili (tpmc ) ; 
  4. Query OK, 2 rows affected (0.08 sec) 
  5. Records: 2 Duplicates: 0 Warnings: 0 

(2)使用CREATE INDEX语句对表增加索引。
能够增加普通索引和UNIQUE索引两种。其格式如下:

  1. create index index_name on table_name (column_list) ; 
  2. create unique index index_name on table_name (column_list) ; 

说明:table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。

(3)删除索引。
删除索引可以使用ALTER TABLE或DROP INDEX语句来实现。DROP INDEX可以在ALTER TABLE内部作为一条语句处理,其格式如下:

  1. drop index index_name on table_name ; 
  2. alter table table_name drop index index_name ; 
  3. alter table table_name drop primary key ; 

其中,在前面的两条语句中,都删除了table_name中的索引index_name。而在最后一条语句中,只在删除PRIMARY KEY索引中使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。
如果从表中删除某列,则索引会受影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。
删除索引的操作,如下面的代码:

  1. mysql> drop index shili on tpsc ; 
  2. Query OK, 2 rows affected (0.08 sec) 
  3. Records: 2 Duplicates: 0 Warnings: 0 

该语句删除了前面创建的名称为“shili”的索引。

摘自:http://www.beijibear.com/index.php?aid=544

【转】mysql 中alter语句中change和modify的区别

以下摘自mysql5手册 


您可以使用CHANGE old_col_namecolumn_definition子句对列进行重命名。重命名时,需给定旧的和新的列名称和列当前的类型。例如:要把一个INTEGER列的名称从a变更到b,您需要如下操作:

・                mysql> ALTER TABLE t1 CHANGE a b INTEGER;

如果您想要更改列的类型而不是名称, CHANGE语法仍然要求旧的和新的列名称,即使旧的和新的列名称是一样的。例如:

mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;

您也可以使用MODIFY来改变列的类型,此时不需要重命名:

mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;




mysql alter 语句用法,添加、修改、删除字段等


//主键549830479

   alter table tabelname add new_field_id int(5) unsigned default 0 not null auto_increment ,add primary key (new_field_id);
//增加一个新列549830479

   alter table t2 add d timestamp;
alter table infos add ex tinyint not null default '0';
//删除列549830479

   alter table t2 drop column c;
//重命名列549830479

   alter table t1 change a b integer;

//改变列的类型549830479

   alter table t1 change b b bigint not null;
alter table infos change list list tinyint not null default '0';

//重命名表549830479

   alter table t1 rename t2;
加索引549830479

   mysql> alter table tablename change depno depno int(5) not null;
mysql> alter table tablename add index 索引名 (字段名1[,字段名2 …]);
mysql> alter table tablename add index emp_name (name);
加主关键字的索引549830479

mysql> alter table tablename add primary key(id);
加唯一限制条件的索引549830479

  mysql> alter table tablename add unique emp_name2(cardnumber);
删除某个索引549830479

   mysql>alter table tablename drop index emp_name;
修改表:549830479

增加字段:549830479

   mysql> ALTER TABLE table_name ADD field_name field_type;
修改原字段名称及类型:549830479

   mysql> ALTER TABLE table_name CHANGE old_field_name new_field_name field_type;
删除字段:549830479

   mysql> ALTER TABLE table_name DROP field_name;

删除主键: alter table Employees drop primary key;

摘自:http://hi.baidu.com/software_one/item/3da0360ba7a32ce6ff240de1

【转】MySQL之alter语句用法总结

1:删除列

ALTER TABLE 【表名字】 DROP 【列名称】

2:增加列

ALTER TABLE 【表名字】 ADD 【列名称】 INT NOT NULL  COMMENT '注释说明'

3:修改列的类型信息

ALTER TABLE 【表名字】 CHANGE 【列名称】【新列名称(这里可以用和原来列同名即可)】 BIGINT NOT NULL  COMMENT '注释说明'

4:重命名列

ALTER TABLE 【表名字】 CHANGE 【列名称】【新列名称】 BIGINT NOT NULL  COMMENT '注释说明'

5:重命名表

ALTER TABLE 【表名字】 RENAME 【表新名字】

6:删除表中主键

Alter TABLE 【表名字】 drop primary key

7:添加主键

ALTER TABLE sj_resource_charges ADD CONSTRAINT PK_SJ_RESOURCE_CHARGES PRIMARY KEY (resid,resfromid)

8:添加索引

ALTER TABLE sj_resource_charges add index INDEX_NAME (name);

9: 添加唯一限制条件索引

ALTER TABLE sj_resource_charges add unique emp_name2(cardnumber);

10: 删除索引

alter table tablename drop index emp_name;

 摘自:http://www.cnblogs.com/aspnethot/articles/1397130.html

2013年5月25日星期六

【转】Outlook最小化到托盘

Outlook最小化的时候,总是会在任务栏占据一个窗口位,关掉的话,又不能及时收到邮件,这是一个很麻烦的问题

下面提供可以让outlook最小化后隐藏到任务栏右手托盘的方法

首先新建一个文本文件,然后重命名为"outlook.reg"(须先到文件夹选项中设置显示文件扩展名)

之后右击选择"编辑",把下面的蓝色字体内容复制进去,之后保存,双击执行即可 

Outlook2007使用

========================================================

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Outlook\Preferences]
"MinToTray"=dword:00000001

 

 Outlook2003使用

========================================================

Windows Registry Editor Version 5.00 

[HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Outlook\Preferences]
"MinToTray"=dword:00000001

OutlookXP使用

========================================================

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Office\10.0\Outlook\Preferences]
"MinToTray"=dword:00000001



  摘自:http://leexh8382.blog.163.com/blog/static/54409020106295436184/

【转】关于数据库里cascade的用法,在MySQL和Hibernate是不同的

在数据库里,进行增加、修改、删除记录的时候,经常会涉及到父子关系的表。

例如:有省份表和城市表,其中城市表有一个外键province_id引用到省份表的主键。这样,可以把省份表看成是父表,把城市表看成是子表,城市表记录的存在依赖于省份表的记录。(文中提到的例子,所有的代码在附件里都有,所以这里的描述从简)

一、在MySQL里的cascade

以下直接在MySQL的控制台操作省份表和城市表

在省份表增加一条"广东"的记录,在城市表增加一条"广州"的记录,并且把"广州"的外键引用到"广东"的主键。"广州"的存在依赖于"广东",如果删除省份表的"广东",将会影响到城市表的"广州"。根据城市表的外键约束的on delete设置,有如下三种情况:

1、外键没有on delete的设置:当删除"广东"的时候,MySQL会报错,删除失败。

2、外键设置为on delete cascade:当删除"广东"的时候,同时把"广州"也删除。

3、外键设置为on delete set null:当删除"广东"的时候,"广州"的外键province_id会被自动设置为null,即"广州"脱离了对"广东"的依赖关系。

二、在Hibernate里的cascade

以下用Hibernate来操作省份表和城市表

首 先,在hibernate.cfg.xml文件配置好连接MySQL数据库的相关属性(请在那里修改登陆数据库的密码)。然后,为省份表和城市表添加相关 的POJO类和XML映射文件。用SQL语句建表(在附件的test_cascade.sql里),城市表有一个外键province_id引用到省份表 的主键,并把这个外键设置为on delete cascade。这个外键约束,在Hibernate变成了双向的映射关系:City类有一个类型为Province的province属性,关联到省份 表,在映射文件中是many-to-one的关系;Province类有一个Set<City>的cities属性,关联到城市表,在映射文 件中是one-to-many的关系。

在Hibernate的映射文件里,同样可以设置cascade属性来控制父子关系。通常在父表设置cascade属性,有以下几种情况:

1、没有设置cascade属性

用 方法addInNoCascade()增加记录"广东"和"广州"(方法在类CityManager里,以下同),再用方法delete()删除"广 东",将会出现异常,系统会说因为"广东"被城市表外键关联了而不能删除。用SQL建表时,已经把外键设为on delete cascade,怎么不能把"广东"删除的同时,级联删除"广州"呢?用MyEclipse查看城市表,发现有两个外键,如图所示:



第 2个外键是用SQL建表时生成的,设置了on delete cascade;而第1个外键应该是用Hibernate操作数据库时,Hibernate自动建立的。第1个外键的On delete被设置为No action,因此删除"广东"的时候,受到这个外键的限制,导致删除失败。

2、设置cascade属性为delete-orphan

在 映射文件Province.hbm.xml中,在one-to-many关系对应的Set里,设置cascade="delete-orphan",此功 能与MySQL里设置外键设置为on delete cascade相同。再用方法delete()删除"广东",删除成功。即是,设置cascade为delete-orphan以后,对删除父表记录的时 候,会同时删除子表的相关记录。

3、设置cascade属性为all

cascade 的属性,除了可以是delete-orphan,还可以是create、update、delete、all等等。all代表除 delete-orphan以外的所有属性值,当设置cascade为all以后,对父表记录的增加、修改操作,会影响到子表的相关记录。

在 映射文件Province.hbm.xml中,在one-to-many关系对应的Set里,设置cascade="all"。用方法 addInCascadeOfAll()增加记录"广东",方法里只有save"广东",并没有save"深圳",只是用属性关联了"广东"和"深圳"的 关系。结果显示,深圳也被添加到数据库里,这就是cascade="all"的作用,使对父表的操作影响到子表。

注意:A、 delete-orphan是一个特别的属性值,只能应用在one-to-many关系的cascade属性。B、cascade属性通常在one- to-one和one-to-many关系里应用,不推荐在many-to-one或者many-to- many关系里应用。

三、总结

1、MySQL里设置cascade和在Hibernate设置cascade是不同的。在MySQL里设置了cascade,并不能对Hibernate的操作起到作用,原因是Hibernate自动为子表添加了外键。

2、 使用级联(cascade)功能,方便了数据库的操作,使得操作一个表的记录会影响到其他表的记录。但是,级联功能会带来安全隐患。特别是在 Hibernate里,修改一个POJO对象的映射引用属性,会导致该引用属性所对应的POJO对象受到影响。例如,把"广东"的 Set<City>类型的cities属性清空(即对集合Set调用clear()方法),则会导致把引用"广东"的"深圳"删除了。因此, 使用级联功能时要小心谨慎。

摘自:http://www.cnblogs.com/huihui-gohay/archive/2010/05/12/1733106.html

【转】mysql级联删除-----Mysql 的 Cascade Restrict

今天遇到数据库的一个问题,就是每当从主表中删除一个主键id时,由于与他相关联的表中有相关的字段数据,所以无法删除。查了一大堆资料,发现我建表关联用的是on Restrict.可能问题就出在这里吧。 

外键约束对子表的含义: 
  如果在父表中找不到候选键,则不允许在子表上进行insert/update 

外键约束对父表的含义: 
  在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹配行的候选键时,父表的行为取决于:在定义子表的外键时指定的on update/on delete子句, InnoDB支持5种方式, 分列如下 
  
  . cascade方式 
   在父表上update/delete记录时,同步update/delete掉子表的匹配记录 
   On delete cascade从mysql3.23.50开始可用; on update cascade从mysql4.0.8开始可用 

  . set null方式 
   在父表上update/delete记录时,将子表上匹配记录的列设为null 
   要注意子表的外键列不能为not null 
   On delete set null从mysql3.23.50开始可用; on update set null从mysql4.0.8开始可用 

  . No action方式 
   如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作 
   这个是ANSI SQL-92标准,从mysql4.0.8开始支持 

  . Restrict方式 
   同no action, 都是立即检查外键约束 

  . Set default方式 
   解析器认识这个action,但Innodb不能识别,不知道是什么意思... 
  
  注意:trigger不会受外键cascade行为的影响,即不会解发trigger 

在mysql中,与SQL标准相违背的三点 
1.       如果在父表中有多个key值相同,那么在进行外键check时,会当成有相同key值的其他行不存在; 比如当定义了一个restrict行为外键时,一个子表行对应到多个父表行(具有相同key值), Innodb不允许删除父表上的所有这些行 

2.       父子表是同一个表,自我参照时不允许指定on update cascade, on update set null 
从mysql4.0.13开始,允许同一个表上的on delete set null 
从mysql4.0.21开始,允许同一个表上的on delete cascade 
但级联层次不能超出15 

3, Innodb在检查unique,constraint约束时,是row by row而不是语句或事务结束; 
  SQL标准中对constraint的检查是在语句执行完成时

摘自:http://blog.csdn.net/bsknight/article/details/5539454

2013年5月23日星期四

[转]PHP中spl_autoload_register函数的用法

摘自:http://www.cnblogs.com/myluke/archive/2011/06/25/2090119.html

spl_autoload_register
(PHP 5 >= 5.1.2)
spl_autoload_register — 注册__autoload()函数
说明
bool spl_autoload_register ([ callback $autoload_function ] )
将函数注册到SPL __autoload函数栈中。如果该栈中的函数尚未激活,则激活它们。
如果在你的程序中已经实现了__autoload函数,它必须显式注册到__autoload栈中。因为
spl_autoload_register()函数会将Zend Engine中的__autoload函数取代为spl_autoload()或
spl_autoload_call()。
参数
autoload_function
欲注册的自动装载函数。如果没有提供任何参数,则自动注册autoload的默认实现函数
spl_autoload()。
返回值
如果成功则返回 TRUE,失败则返回 FALSE。
注:SPL是Standard PHP Library(标准PHP库)的缩写。它是PHP5引入的一个扩展库,其主要功能包括autoload机制的实现及包括各种Iterator接口或类。 SPL autoload机制的实现是通过将函数指针autoload_func指向自己实现的具有自动装载功能的函数来实现的。SPL有两个不同的函数 spl_autoload, spl_autoload_call,通过将autoload_func指向这两个不同的函数地址来实现不同的自动加载机制。
范例

设我们有一个类文件A.php,里面定义了一个名字为A的类:

view plaincopy to clipboardprint?
<?php  
class A  
{  
public function __construct()  
{  
echo 'Got it.';  
}  
}

<?php
class A
{
public function __construct()
{
echo 'Got it.';
}
}
然后我们有一个index.php需要用到这个类A,常规的写法就是

view plaincopy to clipboardprint?
<?php  
require('A.php');  
$a = new A();

<?php
require('A.php');
$a = new A();
但是有一个问题就是,假如我们的index.php需要包含的不只是类A,而是需要很多类,这样子就必须写很多行require语句,有时候也会让人觉得不爽。


不过在php5之后的版本,我们就不再需要这样做了。在php5中,试图使用尚未定义的类时会自动调用__autoload函数,所以我们可以通过编写__autoload函数来让php自动加载类,而不必写一个长长的包含文件列表。

例如在上面那个例子中,index.php可以这样写:

view plaincopy to clipboardprint?
<?php  
function __autoload($class)  
{  
$file = $class . '.php';  
if (is_file($file)) {  
require_once($file);  
}  
}  

$a = new A();

<?php
function __autoload($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}

$a = new A();
当然上面只是最简单的示范,__autoload只是去include_path寻找类文件并加载,我们可以根据自己的需要定义__autoload加载类的规则。

此外,假如我们不想自动加载的时候调用__autoload,而是调用我们自己的函数(或者类方法),我们可以使用spl_autoload_register来注册我们自己的autoload函数。它的函数原型如下:
bool spl_autoload_register ( [callback $autoload_function] )

我们继续改写上面那个例子:

view plaincopy to clipboardprint?
<?php  
function loader($class)  
{  
$file = $class . '.php';  
if (is_file($file)) {  
require_once($file);  
}  
}  

spl_autoload_register('loader');  

$a = new A();

<?php
function loader($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}

spl_autoload_register('loader');

$a = new A();
这样子也是可以正常运行的,这时候php在寻找类的时候就没有调用__autoload而是调用我们自己定义的函数loader了。同样的道理,下面这种写法也是可以的:

view plaincopy to clipboardprint?
<?php  
class Loader  
{  
public static function loadClass($class)  
{  
$file = $class . '.php';  
if (is_file($file)) {  
require_once($file);  
}  
}  
}  

spl_autoload_register(array('Loader', 'loadClass'));  

$a = new A();


[转]php set_include_path超详细解释

首先 
我们来看这个全局变量:__FILE__
它表示文件的完整路径(当然包括文件名在内)
也就是说它根据你文件所在的目录不同,有着不同的值;当然,当它用在包行文件中的时候,它的值是包含的路径;

然后:
我们看这个函数:
string dirname ( string path )
它是PHP内置函数,它的作用是什么呢,就是返回除了本文件名以外的所在目录,给你举个例子
假如你的首页中用到了_FILE_这个变量:
(假设你的网页所在目录为:http://localhost/web/index.php),那么:
_FILE_的值为http://localhost/web/index.php(一个绝对路径)。而此时dirname (_FILE_)表示的就是http://localhost/web/也就是没有index.php这个文件名。
而dirname(dirname(_FILE_))表示的就是上一级的目录,以此类推;

最后
看一下define()这个函数,其实他就是一个定义常量的函数,比如:define('MEN','ooooo');
那么你后你就可以用MEN来表示ooooo这个字符串;
如果你学过C语言,你就很清楚,其中也有一个类似的#define MEN "ooooo";(其实应该说哦php和C类似,因为php就是c编写的);
那么这么写有什么好处呢,那就是当你需要修改变量的时候,你只要修改它就行了,相当的方便,尤其是像路径这样的字符串!

酒后给你解释一下你这段代码:
define('__TYPECHO_ROOT_DIR__', dirname(__FILE__));
就是定义__TYPECHO_ROOT_DIR__为这个文件所在的目录,像这种定义一般是放在config.inc.php中的,那么获取的目录也就是config.inc.php所在的目录;也就是根目录!

define('__TYPECHO_PLUGIN_DIR__', '/usr/plugins'); 这就不要我说了吧!

至于set_include_path(get_include_path() . PATH_SEPARATOR . $path);是什么意思,我想没有你想得那么复杂:他就是包含路径;

比如你有一个文件夹:命名为include,里面有
数据库连接文件:conn.php……,
你这样设置:set_include_path("/include")
那么以后你就直接可以在其他页面中使用
include("conn.php")
这不是经常见到吗?它参数就字符串,当然你也可以设置多个路径,中间用;分开,

而你那句:
set_include_path(get_include_path() . PATH_SEPARATOR .
__TYPECHO_ROOT_DIR__ . '/var' . PATH_SEPARATOR .
__TYPECHO_ROOT_DIR__ . __TYPECHO_PLUGIN_DIR__);
什意思呢,举个例子:
你的一个页面有这样的语句:
include('/inc/sql.php');
include('/inc/conn.php');
;
;
而你突然发现我把这些要包含的文件放在inc目录下不安全,怎么办,要改,我想放到include目录中,好的,这么多页面不累死才怪:有没有好的方法!有!!!!!!!

我在config.inc.php中写着么一句:
set_include_path(get_include_path() .'/include')就这么简单,对,就这么简单!动态的修改!

你不要看这个:get_include_path() . PATH_SEPARATOR . $path这是什么,他就一路径字符串,中间的.是字符串连接符号,也就是你刚才定义的那些常量的组合,组合成一字符串,我想你一定时认为是没见过的参数!
一个很简单的函数,没什么多的解释!
也好就是说他可以动态的设置包含路径!如果正确返回包含路径,不正确返回false;

摘自 :http://zhidao.baidu.com/question/90031099.html

2013年5月21日星期二

【转】 ZendStudio+ZendDebuger实现PHP的代码调试

1.安装ZendStudio6.1,很简单,按照向导即可。

2.从zend官方网站下载ZendDebuger.

http://downloads.zend.com/pdt/server-debugger/

ZendDebugger-5.2.14-cygwin_nt-i386.zip

3.解压缩ZendDebugger后,将对应版本的dll文件拷贝到php的ext目录下。

4.修改php的配置文件:php.ini

添加如下的内容:

[zend]
zend_extension_ts=C:\AppServ\php5\ext\ZendDebugger.dll
zend_debugger.allow_hosts=127.0.0.1
zend_debugger.expose_remotely=always

5.重新启动web服务器,使用phpinfo()函数测试。看到如下如下内容:

Zend Debugger

Passive Mode Timeout 20 seconds

Directive Local Value Master Value
zend_debugger.allow_hosts 127.0.0.1 127.0.0.1
zend_debugger.allow_tunnel no value no value
zend_debugger.connect_password no value no value
zend_debugger.deny_hosts no value no value
zend_debugger.expose_remotely always always
zend_debugger.httpd_uid -1 -1
zend_debugger.max_msg_size 2097152 2097152
zend_debugger.tunnel_max_port 65535 65535
zend_debugger.tunnel_min_port 1024 1024

6.使用ZendStudio即可实现本地和远程调试PHP代码了。

7.附件中为ZendDebugger。

摘自:http://blog.opendigest.org/archives/?article-1.html

【转】phpeclispe+xampp+zenddebuger安装配置到调试

摘自:http://icrwen.iteye.com/blog/609079

1phpeclise 到对应地址http://www.eclipse.org/downloads/下 载Eclipse for PHP Developers (eclipse-php-galileo-SR2-win32.zip),解压即可 或者打开eclipse3.2, Help -> Software Updates -> Find and Install -> Search for new features to install -> New Remote Site -> http://phpeclipse.sourceforge.net/update/releases 

2.安装好phpeclipse后,到对应地址http://www.apachefriends.org/zh_cn/xampp-windows.html下载xampp-win32-1.7.0-installer.exe ,注意为了使其中的php能够匹配PDT(目前只有5.2.x版本,所以下载的是1.7.0.。下载后安装。安装后配置phpeclise:
  Window -> Preferences -> PHPeclipse Web Development -> PHP External Tools -> XAMPP

3.配置好虚拟目录
添加虚拟目录和默认首页: 默认站点主目录为Apache的htdocs目录。由于要在D:\php_workspace下放置所有的Eclipse工程,因此为了能够访问到各个工 程下面的php文件,需要建立一个虚拟目录指向eclipse工程所在目录。修改httpd.conf,在文件结尾添加:

Alias /Workspace/ "D:/php_workspace/" 
<Directory "D:/php_workspace/"> 
   Options Indexes MultiViews 
   AllowOverride None 
   Order allow,deny 
   Allow from all 
</Directory> 
    这样做的好处是,所有php工程都共享一个apache配置,通过   http://localhost/Workspace/ProjectDirectory即可访问相应工程下面的php文件。

4.zenddebuger
   从http://downloads.zend.com/pdt/server-debugger/下载ZendDebugger-5.2.14-cygwin_nt-i386.zip,解压后将对应zenddebuger拷贝到windows/system32下,或者设置环境变量path指定目录。
  并且设置xampp->apache->bin->php.ini
    [Zend]
zend_extension_ts="ZendDebugger.dll"
;zend_extension_ts = "E:\xampp\php\zendOptimizer\lib\ZendExtensionManager.dll"
zend_extension_manager.optimizer_ts = "E:\xampp\php\zendOptimizer\lib\Optimizer"
zend_optimizer.enable_loader = 0
zend_optimizer.optimization_level=15
;zend_optimizer.license_path =
zend_debugger.allow_hosts=127.0.0.1  192.168.0.163
zend_debugger.expose_remotely=always
; Local Variables:
; tab-width: 4
; End:

成功后运行phpinfo();页面下方会出现zenddebuger列表

[Zend]
zend_extension_manager.optimizer_ts="..\ZendOptimizer"
;zend_extension_ts="..\..\ZendOptimizer\ZendExtensionManager.dll"
zend_extension_ts="E:\PHPnow\php-5.2.10-Win32\ext\ZendDebugger.dll"
zend_debugger.allow_hosts=127.0.0.1,192.168.0.163
zend_debugger.expose_remotely=always

注意:phpnow 中则php.ini是php-5.2.x-Win32->php-apache2handler.ini

5.phpeclise配置PDT
   Window -> Preferences -> php->debug各项配置,尤其是php exectutable配置好,
   然后再在run->debug configuration->Test Debuger如果提示成功则zenddebuger配置成功!


可参考http://blog.csdn.net/webflash/archive/2009/06/05/4245038.aspx

【转】端口查看&关闭进程及Kill使用

端口查看&关闭进程及Kill使用
 
1、Windows平台 
windows命令行窗口下执行: 
1.查看所有的端口占用情况 
C:\>netstat -ano 
 
  协议    本地地址                     外部地址               状态                   PID 
  TCP    127.0.0.1:1434         0.0.0.0:0              LISTENING       3236 
  TCP    127.0.0.1:5679         0.0.0.0:0              LISTENING       4168 
  TCP    127.0.0.1:7438         0.0.0.0:0              LISTENING       4168 
  TCP    127.0.0.1:8015         0.0.0.0:0              LISTENING       1456 
  TCP    192.168.3.230:139      0.0.0.0:0              LISTENING       4 
  TCP    192.168.3.230:1957     220.181.31.225:443     ESTABLISHED     3068 
  TCP    192.168.3.230:2020     183.62.96.189:1522     ESTABLISHED     1456 
  TCP    192.168.3.230:2927     117.79.91.18:80        ESTABLISHED     4732 
  TCP    192.168.3.230:2929     117.79.91.18:80        ESTABLISHED     4732 
  TCP    192.168.3.230:2930     117.79.91.18:80        ESTABLISHED     4732 
  TCP    192.168.3.230:2931     117.79.91.18:80        ESTABLISHED     4732 
 
2.查看指定端口的占用情况   www.2cto.com  
C:\>netstat -aon|findstr "9050" 
  协议    本地地址                     外部地址               状态                   PID 
  TCP    127.0.0.1:9050         0.0.0.0:0              LISTENING       2016 
P: 看到了吗,端口被进程号为2016的进程占用,继续执行下面命令: (也可以去任务管理器中查看pid对应的进程) 
3.查看PID对应的进程 
C:\>tasklist|findstr "2016" 
映像名称                       PID 会话名              会话#       内存使用 
========================= ======== ================ 
  tor.exe                     2016 Console                 0     16,064 K 
 
P:很清楚吧,tor占用了你的端口。 
 
4.结束该进程 
C:\>taskkill /f /t /im tor.exe

摘自:http://www.2cto.com/os/201301/185529.html

【转】zend debug图文教程(2012-05-18更新)

摘自:http://blog.csdn.net/newjueqi/article/details/7209857?reload


在网络上有关zend debug的安装和使用的教程都比较简单,记得当时研究折腾了很长的时间才搞定(最主要的是网络上的教程都只是教了怎么安装zend debug,没怎么说zend debug 和 zend toolbar的整合,zend debug 不配合zend tootbar的话是很难在实际编程中发挥作用的)。因此写下这份详细的图文教程,以帮助有需要的人。

 

首先,在zend 的官网上找到 zend debug的dll 和火狐的插件,我已经打包上传到http://download.csdn.net/source/3498366


最新的zend debug 和zend toolbar 可在http://www.zend.com/en/products/studio/downloads 下载,选择“Studio Web Debugger ” 和 “Studio Browser Toolbars” 即可


安装ZendDebugger-5.2.15-cygwin_nt-i386.zip,需要下面的步骤:

1.      解压ZendDebugger-5.2.15-cygwin_nt-i386.zip

2.      根据php的版本确定需要哪个dll文件(4.3.x, 4.4.x, 5.0.x, 5.1.x,5.2.x)

3.      添加下面的信息到php.ini:

   Windows:               zend_extension_ts=<full_path_to_ZendDebugger.dll>

  Windows non-thread safe: zend_extension=<full_path_to_ZendDebugger.dll>

 

注意了:1. 进程不安全的dll只适用于Zend Core 2.0。

2. 进程安全的配置项是zend_extension_ts,进程安全的配置项是zend_extension,这是不一样的。

 

4.      添加下面的内容到php.ini:

zend_debugger.allow_hosts=<host_ip_addresses>

  zend_debugger.expose_remotely=always

 

   譬如我只是在本机上debug的,那么allow_hosts 就是127.0.0.1

5.      copy dummy.php 到网站根目录。(譬如,我的php的主目录是E:\wamp\bin\php\php5.2.6,那么dummy.php的路径为E:\wamp\bin\php\php5.2.6\www\ dummy.php)。

6.      然后,查看phpinfo的信息,如果看到下面的截图就是安装成功了,不然请检查以上的步骤是否正确:

 

 

安装完zend debug,接下来安装firefox的插件,方法很简单,拖到火狐上就行了。如果安装后看不到zenddebug工具栏,在firefox的菜单栏旁边空白处点击一下右键,复选zend debug工具栏,如下图:

 

安装完插件后还需要配置,选择zenddebug toolbar->Extra Stuff->Settings->zend studio settings->zendstudio Executable:配置zend studio可执行文件的位置,如下图:

 

 

最后,在zend studio中,windows->preferences->php->debug, 查看一下默认的debug是否已选择了zend debug,如下图:

 

OK,到此为止,所有的配置都完成了。测试步骤如下:

1.       导入一个工程到zend studio,我偷懒,直接导入了phpmyadmin

2.       在firefox中运行phpmyadmin,在zend debug工作栏中选择如下:


3.       刷新一下页面,这时zend studio就进入了debug模式,

 

 

 

 注意:

在window下只有5.2 zend debug的能安装成功,5.3 zend debug的没有成功过

在linux下我试过安装5.3的 zend debug,能成功


 但在项目中,很多时候都必须要使用php5.3,但又想用zend debug,怎么办?

解决方法一:使用linux,zend debug for php 5.3 在linux 没问题,而且LAMP这个黄金组合天生就和linux分不开。

解决方法二:使用wampserver这个集成开发环境,可以很方便在多个php版本之间切换,当平时开发就使用php 5.3,需要zend debug切换到php 5.2 ( 这个方法个人觉得挺折腾的,还是推荐使用linux )。


wampserver 在多个php版本切换的步骤如下:

1 )  wampserver 默认是只安装了一个php版本,所以要先安装多个php版本。

http://www.wampserver.com/en/#download-wrapper 中点击“Download   PHP   Addons”,在弹出窗口中选择一个php 5.2的addon下载,选择其中一个版本的php 5.2下载,如下图:



 

安装下载的文件,安装完后再查看一下wampserver 的php 版本,就能看到有多个php的版本可选了,如下图:


当需要使用php 5.3.3,就在5.3.3 标签上点击一下,当需要使用php 5.2.9 ,就在5.2.9标签上点击一下。


 

----------------------------------------------------------------------------------------------------------------------

 

[文章标题] zend debug图文教程(2012-05-18更新)

[文章作者]曾健生

[作者邮箱]zengjiansheng1@126.com

[作者QQ]190678908

[博客]  http://blog.csdn.net/newjueqi

http://blog.sina.com.cn/h6k65


修改记录:

2012-05-18: 添加了在wamp上切换不同php版本的方法