PHP的反射类ReflectionClass、ReflectionMethod记录

ReflectionClass
类变量

<?php
class ClassName{
    /**
     * [$a description]公开变量
     * @var integer
     */
    public $a=1;
    //私有
    private $b=2;
    protected $c=3;
    public function __construct()
    {

    }
    public function a(){
        echo "a";
    }
    private function b(){
        echo "b";
    }
    protected function c(){
        echo "c";
    }
}
$class=new ClassName();
$obj=new ReflectionClass($class);
//打印类的信息,包括变量方法,都打印出来
print_r($obj->export($class));
<?php
class ClassName{
    /**
     * [$a description]公开变量
     * @var integer
     */
    public $a=1;
    //私有
    private $b=2;
    protected $c=3;
    const D=4;
    const E=5;
    public function __construct($value,$key)
    {

    }
    public function a(){
        echo "a";
    }
    private function b(){
        echo "b";
    }
    protected function c(){
        echo "c";
    }
    public function p($key,$value){
        echo $key;
        echo $value;
    }
}
$class=new ClassName(1,2);
$obj=new ReflectionClass($class);
//取出类里面定义的常量
print_r($obj->getConstant ('D'));
//取出所有常量
print_r($obj->getConstants ());
//方法很多,就不一一使用了,挑几个感觉比较常用的用用~~
//检测方法是否已经存在
var_dump($obj->hasMethod('a'));//方法存在,返回true
var_dump($obj->hasMethod('nnn'));//方法不存在,返回false
//实例化一个类(函数里面的值回传到构造函数里面)
$obj->newInstance(3,4)->a();//输出a,$obj->newInstance(3,4)执行完毕之后返回的是ClassName类
//取出类的方法并使用这个方法,这个函数返回的是ReflectionMethod对象了
$method=$obj->getMethod('a');
//使用ReflectionMethod方法就是执行这个方法,函数里面的值一个对象示例
$method->invoke($class);
//传参
$method=$obj->getMethod('p');
//参数直接安装顺序直接写在对象后面
$method->invoke($class,1,2);
//或者用invokeArgs方法,用数组传参数,在数组里面按顺序放好就ok了
$method->invokeArgs($class, array('zzz','aaa'));
//判断方法属性
var_dump($method->isPublic());//true
var_dump($method->isProtected());//false
?>

PHP中刷新输出缓冲

转载自:http://www.cnblogs.com/mutuan/archive/2012/03/18/2404957.html
PHP中刷新输出缓冲
buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的 设备之间传办理数据的区域。通过buffer,可以使进程这间的相互等待变少。这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每输入 一个字符,操作系统并不会立即把这个字符直接写入到磁盘,而是先写入到buffer,当写满了一个buffer的时候,才会把buffer中的数据写入磁 盘,当然当调用内核函数flush()的时候,强制要求把buffer中的脏数据写回磁盘。
同样的道理,在PHP中,当执行echo,print的时候,输出并没有立即通过tcp传给客户端浏览器显示, 而是将数据写入php buffer。php output_buffering机制,意味在tcp buffer之前,建立了一新的队列,数据必须经过该队列。当一个php buffer写满的时候,脚本进程会将php buffer中的输出数据交给系统内核交由tcp传给浏览器显示。所以,数据会依次写到这几个地方echo/pring -> php buffer -> tcp buffer -> browser

在PHP中与刷新缓冲相关的函数有三个:
1). flush
刷新PHP程序的缓冲,而不论PHP执行在何种情况下。该函数将当前为止程序的所有输出发送到用户的浏览器。 但是该函数不会对服务器或客户端浏览器的缓存模式产生任何影响,也不会对PHP本身的缓存产生任何影响。
2).ob_flush
该函数对PHP本身的的缓存进行输出。PHP本身的缓存受php.ini中的output_buffering的控制。ob_flush()的作用就是将本来存在输出缓存中的内容取出来,设置为等待输出状态,但不会直接发送到客户端,这时你就需要先使用ob_flush()再使用flush(),客户端才能立即获得脚本的输出。
与PHP本身输出缓冲相关的两个PHP配置是:
参数1:output_buffering :on/off 或 者整数 。设置为on时,将在所有脚本中使用输出缓存控制,不限制缓存的大小。而设置为整数时,如output_buffering=4096,当缓存数 据达到4096字节时会自动输出刷新缓存。而这个参数的不同正是导致以上代码在不同时候执行结果不同的原因。当output_buffering关闭时, 脚本所有的输出(echo)都会即时发送到客户端,执行上面代码时就是每秒输出一个数字。而开启output_buffering后,输出内容就会先缓存 在服务端,直到脚本结束时才一起发送给客户端。
参数2:implicit_flush:on/off。设定ON意味着,当脚本有输出时,自动立即发送到客户端。相当于在echo后自动加flush()。

3).ob_implicit_flush
这个函数强制每当有输出的时候,即刻把输出发送到浏览器。这样就不需要每次输出(echo)后,都用flush()来发送到浏览器了。
以下是举例:

<?php  
ob_end_clean();  
echo str_pad(" ", 256);  
for ($i=100; $i>0; $i--) {  
   echo $i.'<br/>';  
   flush();  
   sleep(1);   
}   
?>

以上代码应该隔一秒钟输出一次$i
echo str_pad(" ", 256)的目的是IE需要接受到256个字节之后才开始显示。 以上代码还有以下两种写法。

<?php  
echo str_pad(" ", 256);  
for ($i=100; $i>0; $i--) {  
   echo $i.'<br />';  
   ob_flush();  
   flush();  
   sleep(1);   
}   
?>
<?php  
ob_implicit_flush(true);  
echo str_pad(" ", 256);  
for ($i=100; $i>0; $i--) {  
   echo $i, '<br />';  
   ob_flush();  
   sleep(1);   
}

另外我们还需要注意刷新缓冲不光受以上几方面的影响,还受以下影响:
1). 个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函 数产生的结果不会立即被发送到客户端浏览器。甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 标记之前,不会显示出整个表格。一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
2). PHP安装模式的影响。以上方式对于PHP以Apache模块方式安装的情况,可以直接使用。 如果以FastCgi方式还需要注意以下几下配置:
a). Apache+Fcgid+PHP
FcgidOutputBufferSize 0(默认是65536)
在配置Fcgid时, 设置这项值为0, 以上代码做刷新缓冲时,才能达到自己想要的效果。
b).IIS+FastCgi+PHP
ResponseBufferLimit=0
修改WINDOWS\system32\inetsrv\fcgiext.ini下的这一项。
c).nginx+php-fpm
fastcgi_buffer_size 4k;
fastcgi_buffers 8 4k;
fastcgi_busy_buffers_size 4k
gzip off;

PHP函数说明:
1.string str_pad ( string $input , int $pad_length [, string $pad_string = " " [, int $pad_type = STR_PAD_RIGHT ]] )
该函数返回 input 被从左端、右端或者同时两端被填充到制定长度后的结果。如果可选的 pad_string 参数没有被指定,input 将被空格字符填充,否则它将被 pad_string 填充到指定长度

2.相关flush类似函数如下

flush
ob_ clean
ob_ end_ clean
ob_ end_ flush
ob_ flush
ob_ get_ clean
ob_ get_ contents
ob_ get_ flush
ob_ get_ length
ob_ get_ level
ob_ get_ status
ob_ gzhandler
ob_ implicit_ flush
ob_ list_ handlers
ob_ start
output_ add_ rewrite_ var
output_ reset_ rewrite_ var

PHP 5.3.1 安装包 VC9 VC6 区别是什么

一、如何选择PHP5.3的VC9版本和VC6版本
VC6是什么?
VC6就是legacy Visual Studio 6 compiler,就是使用这个编译器编译的。
VC9是什么?
VC9就是the Visual Studio 2008 compiler,就是用微软的VS编辑器编译的。
那我们如何选择下载哪个版本的PHP呢?
如果你是在windows下使用Apache+PHP的,请选择VC6版本;
如果你是在windows下使用IIS+PHP的,请选择VC9版本。

二、如何选择PHP5.3的Thread Safe和Non Thread Safe版本

先从字面意思上理解,Thread Safe是线程安全,执行时会进行线程(Thread)安全检查,以防止有新要求就启动新线程的CGI执行方式而耗尽系统资源。Non Thread Safe是非线程安全,在执行时不进行线程(Thread)安全检查。

再来看PHP的两种执行方式:ISAPI和FastCGI。

ISAPI执行方式是以DLL动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,所以需要进行线程安全检查,这样来提高程序的执行效率,所以如果是以ISAPI来执行PHP,建议选择Thread Safe版本;

而FastCGI执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以FastCGI来执行PHP,建议选择Non Thread Safe版本。
官方并不建议你将Non Thread Safe 应用于生产环境,所以我们选择Thread Safe 版本的PHP来使用。

转载的

magic_quotes_gpc作用

转载自:http://blog.163.com/wangzhenbo85@126/blog/static/101363282201192242358226/
当php.ini设置magic_quotes_sybase为on时会覆盖magic_quotes_gpc为on的处理,然而magic_quotes_sybase仅仅是转义了nullbyte和把'变成了''
set_magic_quotes_runtime() 可以让程序员在代码中动态开启或关闭 magic_quotes_runtime,set_magic_quotes_runtime(1) 表示开启,set_magic_quotes_runtime(0) 则表示关闭。当set_magic_quotes_runtime(1)时,从数据库或通过fread之类的函数读取的文本,将自动对' "和\自动加上反斜杠\进行转义,防止溢出。这在对数据库的数据进行转移的时候非常有用。但在一般情况下,应当将其关闭,否则从数据库读取出来的数据单引 号、双引号和反斜杠都会被加上\,导致显示不正常。像Discuz,PHPWind都在公共文件的头部加上一句 set_magic_quotes_runtime(0); 强制关闭 magic_quotes_runtime 。
magic_quotes_gpc 和 magic_quotes_runtime 的区别在于,magic_quotes_gpc 是对通过GET、POST、COOKIE传递的数据进行转义,一般在数据入库前要先进行转义,magic_quotes_gpc不能在代码中动态开启或关 闭,需要到php.ini将magic_quotes_gpc设置为on或off,代码中可以用get_magic_quotes_gpc获取 magic_quotes_gpc的状态

一 描叙
magic_quotes_gpc为on时,php在注册变量时会调用addslashes()函数处理[既转义单引号、双引号、反斜线和 nullbyte],但php.ini中还有另外一个选项影响着magic_quotes_gpc和addslashes()函数:当php.ini设置 magic_quotes_sybase为on时会覆盖magic_quotes_gpc为on的处理,然而magic_quotes_sybase仅仅 是转义了nullbyte和把'变成了''

php操作html元素,使用PHP Simple HTML DOM Parser

今天需要一个操作html元素的的功能,记得php有xml的,但是用的真心少,在网上搜下教程,没想到还有PHP Simple HTML DOM Parser这个开源项目,看了下介绍,可以像jquery那样操作html,赶紧下载下来体验下得意
代码如下
header('Content-type:text/html;charset=gb2312;');
//首先引入类文件
require 'simple_html_dom.php';
//读取文件里面的内容
$str=file_get_contents('tbody.txt');
//实例化对象
$html=new simple_html_dom();
//存放取出数据的数组
$temp_arr=array();
//解析html字符串
$html->load($str);
//循环取出的变量,因为是要取出tr下面的某几个td里面的内容,所以这里先查找出所有tr
foreach ($html->find('tr') as $key => $value) {
$temp=array();
//第一行是边个的标题,跳过
if ($key==0) {
continue;
}
//循环tr下面的td
foreach ($value->children() as $key_1 => $value_1) {
//因为这个表格是不规则的,用到了rowspan,所以这里这样操作了下
if (isset($value_1->attr['class'])&&$value_1->attr['class']=='xxx') {
//find是找出当前元素下面的标签,后面没数字的话应该就是返回所有的,有数字的话就是返回指定的那一个
$temp[]=trim($value_1->find('a',0)->plaintext);
$temp[]=trim($value->children($key_1+3)->plaintext);
$temp[]=trim($value->children($key_1+4)->plaintext);
$temp[]=trim($value->children($key_1+5)->plaintext);
$temp_arr[]=$temp;
}
continue;
}
}
var_dump($temp_arr);
?>

中文文档网址:http://www.ecartchina.com/php-simple-html-dom/manual.htm