标签 PHP 下的文章

引用PHP手册里的一评论

This will greatly reduce your page load time as the browser will only need to send one server request for the entire page, rather than multiple requests for the HTML and the images. Requests need to be uploaded and 99% of the world are limited on their upload speed to the server.

翻译一下就是

这种方式能够大大减少页面载入时间,因为整个页面只需要一个请求,多个针对html文档和图片的请求。请求需要被提(上)交(传),但是99%的上传速度是被限制的。

所以减少请求也是一个明确的选择!

阅读剩余部分

双引号,单引号问题自古以来一直处在混沌状态,不懂的人觉得没啥区别,懂的人貌似也说不出来啥区别,其实区别还是有很多,转给大家看看,自己也留一份参考

转自http://blog.sina.com.cn/s/blog_706476980100xapp.html

1.单引号和双引号都可以作为字符串的开始符和关闭符,并且只能‍同一种单或者双引号来定义开始和结束;单引号之间的字符都被认为是字符,即使是转义符\和变量符$,例外的是\’标识单引号。 2.双引号之间的字符是需要php解析的,包括$,\,{都保留了php赋予的特殊含义。 3." "双引号里面的字段会经过编译器解释,然后再当作HTML代码输出;而' '单引号里面的不进行解释,直接输出。 例如:

$abc='my name is tome';
echo $abc //结果是:my name is tom
echo '$abc' //结果是:$abc
echo "$abc" //结果是:my name is tom

特别在使用MYSQL语句的时候,双引号和单引号的用法让新手不知所措,在这里,举个例子,来进行说明。 假设查询条件中使用的是常量,例如:

select    *    from    abc_table where user_name='abc';

SQL语句可以写成:

SQLstr = "select    *    from abc_table where user _name= 'abc'" ;

假设查询条件中使用的是变量,例如:

$user_name = $_REQUEST['user_name']; //字符串变量

$user=array ("name"=> $_REQUEST['user_name‘,"age"=>$_REQUEST['age'];//数组变量

SQL语句就可以写成:

SQLstr = "select    *    from abc_table where user_name = ' " . $user_name . " ' ";
SQLstr = "select * from abc_table where user_name = ' " . $user["name"] . " ' ";

对比一下:

SQLstr="select * from abc_table where user_name = ' abc ' " ;
SQLstr="select * from abc_table where user_name =' " . $user _name . " ' ";
SQLstr="select * from abc_table where user_name =' " . $user["name"] . " ' ";

SQLstr可以分解为以下3个部分:

1:"select * from table where user_name = ' " //固定SQL语句 
2:$user //变量 
3:" ' "
1,2,3部分字符串之间用"." 来连接

阅读剩余部分

一直在用everedit做开发,今天开始高大上,用一下netbeans

安装

  • netbeans下载页面找到PHP版的netbeans,下载下来并安装,表忘了JRE也要装的

  • xdebug下载页面下载对应PHP版本的xdebug,然后解压至php目录下的ext目录下,同时新建d:\xdebug文件夹

配置

PHP.INI

在phpinfo()页面中找到INI文件,在文件最后加入以下代码

;注意:我们的版本号可能不同
zend_extension="ext\php_xdebug-2.2.5-5.4-vc9.dll" 
[Xdebug]
;是否开启自动跟踪
xdebug.auto_trace= On
;是否开启异常跟踪
xdebug.show_exception_trace= On
;是否开启远程调试自动启动
xdebug.remote_autostart= On
;是否开启远程调试
xdebug.remote_enable= On
;允许调试的客户端IP
;xdebug.remote_host= 192.168.1.1
;远程调试的端口(默认9000)
xdebug.remote_port=9000
;调试插件dbgp
xdebug.remote_handler=dbgp
;是否收集变量
xdebug.collect_vars= On
;是否收集返回值
xdebug.collect_return= On
;是否收集参数
xdebug.collect_params= On
;跟踪输出路径
xdebug.trace_output_dir="d:\xdebug"
;是否开启调试内容
xdebug.profiler_enable=On
;调试输出路径
xdebug.profiler_output_dir="d:\xdebug"
;调试的域名
xdebug.remote_host=localhost

修改以后重启服务器,看看有没有出现xdebug,如果出现了,那就成功了一大半

netbeans

设置的地方在tool->option里找到debug标签,在这里可以修改PHP.EXE的路径,还有调试的工具和端口号等。

注意

  • 如果你用的远程调试,务必打开xdebug.remote_enable
  • 如果你用的域名调试,那么请修改xdebug.remote_host为你的域名,不要忘了加引号,不用带http://
  • 如果总是显示等待xdebug,那么就换一个web浏览器试试,在tool->option->general里可以找到
  • 如果还不行,请留言,老高和你一起搞!

调试

哈哈,这还用讲吗?上个图

netbeans开启xdebug

输出缓冲是个让人头大的问题,因为它不仅牵扯到web语言本身,浏览器自身的原因也会导致无内容输出。

所以,在输出前保险的做法是先输出4096个空白字符,然后再使用缓冲输出内容,这样就可以实现程序随时输出内容啦!

以下代码chrome,FF,IE,Safari,手机chrome,UCWEB 都测试通过,需要注意的是:

在网页最开始一定要输出足够多的字符来骗过浏览器 ob_flush,flush需要一起使用

";
    //ob_end_clean();  //如果再此打开,flush将会报错,因为清空了缓冲区
    //echo '   length: '.ob_get_length();
    ob_flush();
    flush();
    sleep(1);
}
 
echo "Done.";
 
/*
ob_end_flush();    //送出输出缓冲区内容并关闭缓冲
ob_get_clean();    //得到当前缓冲区的内容并删除当前输出缓。
ob_get_contents(); //只是得到输出缓冲区的内容,但不清除它。
ob_implicit_flush(1); //将打开或关闭绝对(隐式)刷送。绝对(隐式)刷送将导致在每次输出调用后有一次刷送操作,以便不再需要对 flush() 的显式调用。
*/
 
 
/*
刷新PHP程序的缓冲,而不论PHP执行在何种情况下(CGI ,web服务器等等)。该函数将当前为止程序的所有输出发送到用户的浏览器。flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响。因此,必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到  标记之前,不会显示出整个表格。一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
*/

以下转自http://www.cnblogs.com/zemliu/archive/2012/05/11/2495293.html

首先明确一下PHP的输出顺序:

1.打开了php输出缓存:

echo,print -> php output_buffring -> server buffering -> browser buffering -> browser display

2.未打开php输出缓存:

echo,print -> server buffering -> browser buffering -> browser display

另外明确一下浏览器的输出缓存:

IE为256Bytes, Chrome与FireFox为1000Bytes,只有输出数据达到了这个长度或者脚本结束浏览器才会将数据输出在页面上

再来说说用到的几个PHP设置和API:

1.php.ini中的output_buffering配置

Off: 表示关闭PHP输出缓存 On: 打开无限大的输出缓存 4096: 打开大小为4096Byte的输出缓存

2.php.ini中的implicit_flush配置

On: 表示每次输出(如echo,print)后自动调用flush()函数后,直接输出 Off: 与On相反,每次输出后不会调用flush(),需要等到server buffering满了才会输出,但是我们可以用flush()函数代替它,不开启也没关系,反而更加灵活

3.ob_flush()函数: 取出PHP buffering中的数据,放入server buffering

4.flush()函数: 取出Server buffering的数据,放入browser buffering

5.ob_start()函数:对于这个函数我现在了解的不是很清楚,因为开启后输出就会不受ob_flush()控制,即使使用ob_flush()和flush(),数据也不能立即输出在浏览器上.现在知道的是,如果output_buffering=Off,即使使用了ob_start(),也是无法将输出数据缓存的,而如果output_buffering=On的话,即使不用ob_start(),输出数据也可以被PHP缓存,所以觉得ob_start比较废,暂时不管他

最后引用一段Laruence的一段blog,希望对大家的理解有帮助

ob_flush/flush在手册中的描述, 都是刷新输出缓冲区, 并且还需要配套使用, 所以会导致很多人迷惑…

其实, 他们俩的操作对象不同, 有些情况下, flush根本不做什么事情..

ob_*系列函数, 是操作PHP本身的输出缓冲区.

所以, ob_flush是刷新PHP自身的缓冲区.

而flush, 严格来讲, 这个只有在PHP做为apache的Module(handler或者filter)安装的时候, 才有实际作用. 它是刷新WebServer(可以认为特指apache)的缓冲区.

在apache module的sapi下, flush会通过调用sapi_module的flush成员函数指针, 间接的调用apache的api: ap_rflush刷新apache的输出缓冲区, 当然手册中也说了, 有一些apache的其他模块, 可能会改变这个动作的结果..

有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。

甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape浏览器会在接受到换行或 html标记的开头之前缓存内容,并且在接受到

标记之前,不会显示出整个表格。

一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。

所以, 正确使用俩者的顺序是. 先ob_flush, 然后flush,

当然, 在其他sapi下, 不调用flush也可以, 只不过为了保证你代码的可移植性, 建议配套使用.

转自http://www.cnblogs.com/see7di/p/3560329.html

此代码片段的功能是在做均衡负载的时候将session的维护工作交给Memcached,这样不仅性能上来了,session不同步的问题也解决了!

但是要求做Memcache的计算机内存要足够大!

$_ENV=array(
    'SYS'=>array(
        'Memip'=>'127.0.0.1',            //MEMCACHE的ip
        'Mempt'=>11211,              //MEMCACHE的port
        'Memtim'=>10,                    //MEMCACHE的超时时间
    )
);
 
//托管SESSION到MEMCACHE,如果开启失败,则说明MEMCACHE没有配置正确
final class S{
    public static function open(){
    //禁止session自动开启
        session_write_close();
    ini_set('session.auto_start',0);
 
    //使用五十分之一的概率启动GC清理会话
    ini_set('session.gc_probability',1);
    ini_set('session.gc_divisor',50);
    ini_set('session.use_cookies',1);
 
    //session的寿命
    //ini_set('session.gc_maxlifetime',$_ENV['SYS']['Memtim']);
    //ini_set('session.cookie_lifetime',$_ENV['SYS']['Memtim']);
    //ini_set('session.save_handler','files');
    //ini_set('session.save_path',Run.'_tmp');
    //ini_set('session.save_handler','memcache');
    //ini_set('session.save_path','tcp://127.0.0.1:11211');
        //$_ENV['S_tim'] = ini_get('session.gc_maxlifetime');
 
    //建立memcache对象
    $_ENV['S_mem']=new Memcache;
    $_ENV['S_mem']->connect($_ENV['SYS']['Memip'],$_ENV['SYS']['Mempt']) or die('Memcache连接失败!');
        return TRUE;
    }
 
    /**
        读取
        返回:读到的内容
    /**/
    public static function read($id){
        return $_ENV['S_mem']->get('s_'.$id);
    }
 
    /**
        写入
        返回:bool
    /**/
    public static function write($id,$data){
        return $_ENV['S_mem']->set('s_'.$id,$data,MEMCACHE_COMPRESSED,$_ENV['SYS']['Memtim']);
    }
 
    /**
        关闭
        返回:bool
    /**/
    public static function close(){
        $_ENV['S_mem']->close();
        unset($_ENV['S_mem'],$_ENV['SYS']['Memtim']);
        return TRUE;
    }
 
    /**
        删除
        返回:bool
    /**/
    public static function destroy($id){
        return $_ENV['S_mem']->delete('s_'.$id);
    }
 
    /**
        清理
        返回:bool
    /**/
    public static function gc(){
        return TRUE;
    }
}
session_set_save_handler('S::open','S::close','S::read','S::write','S::destroy','S::gc');
$_ENV['sessionid']=(isset($_REQUEST['sessionid'])) ? trim($_REQUEST["sessionid"]) : session_id();
if($_ENV['sessionid']!=''){session_id($_ENV['sessionid']);}
session_start();