当前位置:  编程技术>php
本页文章导读:
    ▪PHP多个版本的分析解释       PHP版本主要分三支:PHP4/PHP5/PHP6其中,PHP4由于太古老、对OO支持不力已基本被淘汰,就不在详述。而PHP6由于基本没有生产线上的应用,还基本只是一款概念产品,所以也不详述。 PHP5的版本.........
    ▪QQ登录 PHP OAuth示例代码       根据官方文档编写 代码如下: <?php /** * 申请http://connect.opensns.qq.com/apply * 列表http://connect.opensns.qq.com/my */ session_start(); $qq_oauth_config = array( 'oauth_consumer_key'=>'*******',//APP ID 'oauth_consumer_secre.........
    ▪模板引擎正则表达式调试小技巧       基于正则表达式替换的模板引擎很容易遇上正则表达式最大回溯/递归的限制。 惰性匹配并不可怕,正常情况下模板并不会不够用,往往不会超出限制,discuz的模板引擎就大量使用了。但是.........

[1]PHP多个版本的分析解释
    来源: 互联网  发布时间: 2013-11-30

PHP版本主要分三支:PHP4/PHP5/PHP6
其中,PHP4由于太古老、对OO支持不力已基本被淘汰,就不在详述。
而PHP6由于基本没有生产线上的应用,还基本只是一款概念产品,所以也不详述。

PHP5的版本主要分三支:PHP5.2之前的版本、PHP5.2.X和PHP5.3
那我们应该如何选择适用自己项目的版本呢?
PHP5.2之前的版本不值得考虑,因为某些功能缺陷或者BUG。
主流PHP程序对PHP5.2.X的兼容性最好,而每次版本号的升级带来的都是安全性和稳定性的改善,所以宜挑选最新的版本。目前PHP5.2系列最新的是PHP5.2.14
而如果产品是自己开发自己使用,PHP5.3在某些方面更具优势,在稳定性上更胜一筹,增加了很多PHP5.2所不具有的功能,比如内置php-fpm、更完善的垃圾回收算法、命名空间的引入、sqlite3的支持等等,是部署项目值得考虑的版本。

除了版本号的不同,同一版本号的PHP版本也有区别,并且在选择PHP扩展的时候需要注意。

VC6与VC9
对于VC6还是VC9版本的选择,PHP官方网站有详细的描述
原文如下
Which version do I choose?
If you are using PHP with Apache 1 or Apache2 from apache.org you need to use the VC6 versions of PHP
If you are using PHP with IIS you should use the VC9 versions of PHP
VC6 Versions are compiled with the legacy Visual Studio 6 compiler
VC9 Versions are compiled with the Visual Studio 2008 compiler and have improvements in performance and stability. The VC9 versions require you to have the Microsoft 2008 C++ Runtime (x86) or the Microsoft 2008 C++ Runtime (x64) installed
Do NOT use VC9 version with apache.org binarieshttp://dev.meettea.com

我该选择哪个版本?
如果你在apache1或者apache2下使用PHP,你应该选择VC6的版本
如果你在IIS下使用PHP应该选择VC9的版本
VC6的版本使用visual studio6编译
VC9使用Visual Studio 2008编译,并且改进了性能和稳定性。VC9版本的PHP需要你安装Microsoft 2008 C++ Runtime
不要在apache下使用VC9的版本

TS和NTS
TS指Thread Safety,即线程安全,一般在IIS以ISAPI方式加载的时候选择这个版本。
NTS即None-Thread Safe,一般以fast cgi方式运行的时候选择这个版本,具有更好的性能。
下面给点资料,来源于 http://koda.javaeye.com/blog/662034
从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用多进程的工作方式不同的是Windows系统是采用多线程的工作方式。如果在IIS下以CGI方式运行PHP会非常慢,这是由于CGI模式是建立在多进程的基础之上的,而非多线程。一般我们会把PHP配置成以ISAPI的方式来运行,ISAPI是多线程的方式,这样就快多了。但存在一个问题,很多常用的PHP扩展是以Linux/Unix的多进程思想来开发的,这些扩展在ISAPI的方式运行时就会出错搞垮IIS。因此在IIS下CGI模式才是 PHP运行的最安全方式,但CGI模式对于每个HTTP请求都需要重新加载和卸载整个PHP环境,其消耗是巨大的。
为了兼顾IIS下PHP的效率和安全,微软给出了FastCGI的解决方案。FastCGI可以让PHP的进程重复利用而不是每一个新的请求就重开一个进程。同时FastCGI也可以允许几个进程同时执行。这样既解决了CGI进程模式消耗太大的问题,又利用上了CGI进程模式不存在线程安全问题的优势。
因此,如果是使用ISAPI的方式来运行PHP就必须用Thread Safe(线程安全)的版本;而用FastCGI模式运行PHP的话就没有必要用线程安全检查了,用None Thread Safe(NTS,非线程安全)的版本能够更好的提高效率。


如何查看当前运行的PHP的版本?一个很简单的办法就是phpinfo();
Thread Safety disabled是NTS,enabled是TS
Configure Command看到VC98字样的是VC6,Compiler标明 MSVC9 (Visual C++ 2008) 的是VC9

另外,顺带讲讲windows下比较简洁方便的PHP配置方法,网上教的什么复制php.ini到windows目录、复制xxxxx.dll到system32下,太丑陋了。
1、下载zip版本的PHP
2、下载好相应的扩展,修改好php.ini,添加模块映射
3、环境变量里PATH加上PHP存放的目录。只要一个就够了,/bin和/ext不需要加。
4、环境变量里定义一个PHPRC变量,内容为PHP.INI的存放路径。
完毕。很多文章提及需要重启系统,可是从我遇上的情况来看,并无必要,最多重启web服务。

如果你是linux下用,就无视本文吧。
修订: 2010-11-03

  • 看了白菜(aiyooyoo.com)的修订,IIS安装php-cgi,3、4两步可以省略,ISAPI方式需要。
  • 起名叫windows下的PHP版本的讲解更合适
  • At Last,近期思考了很多东西,若整理成文又欠缺深度和力度,还需厚积薄发。


        
    [2]QQ登录 PHP OAuth示例代码
        来源: 互联网  发布时间: 2013-11-30
    根据官方文档编写
    代码如下:

    <?php
    /**
    * 申请http://connect.opensns.qq.com/apply
    * 列表http://connect.opensns.qq.com/my
    */
    session_start();
    $qq_oauth_config = array(
    'oauth_consumer_key'=>'*******',//APP ID
    'oauth_consumer_secret'=>'******************',//APP KEY
    'oauth_callback'=>"http://www.955.cc/qq.php?action=reg",//这里修改为当前脚本,但是要保留?action=reg
    'oauth_request_token_url'=>"http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token",
    'oauth_authorize_url'=>'http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize',
    'oauth_request_access_token_url'=>'http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token',
    'user_info_url' => 'http://openapi.qzone.qq.com/user/get_user_info',
    );
    $action = isset($_GET['action']) ? $_GET['action'] : '';
    $qq = new qq_oauth($qq_oauth_config);
    switch($action){
    //用户登录 Step1:请求临时token
    case 'login':
    $token = $qq->oauth_request_token();
    $_SESSION['oauth_token_secret'] = $token['oauth_token_secret'];
    $qq->authorize($token['oauth_token']);
    break;
    //Step4:Qzone引导用户跳转到第三方应用
    case 'reg':
    $qq->register_user();
    $access_token = $qq->request_access_token();
    if($token = $qq->save_access_token($access_token)){
    //保存,一般发给用户cookie,以及用户入库
    //var_dump($token);
    $_SESSION['oauth_token'] = $token['oauth_token'];
    $_SESSION['oauth_token_secret'] = $token['oauth_token_secret'];
    $_SESSION['openid'] = $token['openid'];
    header('Content-Type: text/html; charset=utf-8');
    $user_info = json_decode($qq->get_user_info());
    if($user_info->ret!=0){
    exit("获取头像昵称时发生错误".$user_info->msg);
    } else {
    echo 'QQ昵称:',$user_info->nickname,
    '<img src="',$user_info->figureurl,'" />',
    '<img src="',$user_info->figureurl_1,'" />',
    '<img src="',$user_info->figureurl_2,'" />';
    }
    }
    break;
    default :
    }
    class qq_oauth{
    private $config;
    function __construct($config){
    $this->config = $config;
    }
    /**
    * 返回配置
    * @param string $name
    *
    */
    function C($name){
    return isset($this->config[$name]) ? $this->config[$name] : FALSE;
    }
    /**
    * 构建请求URL
    * @param string $url
    * @param array $params
    * @param string $oauth_token_secret
    *
    */
    function build_request_uri($url,$params=array(),$oauth_token_secret=''){
    $oauth_consumer_key = $this->C('oauth_consumer_key');
    $oauth_consumer_secret = $this->C('oauth_consumer_secret');
    $params = array_merge(array(
    'oauth_version'=>'1.0',
    'oauth_signature_method'=>'HMAC-SHA1',
    'oauth_timestamp'=>time(),
    'oauth_nonce'=>rand(1000,99999999),
    'oauth_consumer_key'=>$oauth_consumer_key,
    ),$params);
    $encode_params = $params;
    ksort($encode_params);
    $oauth_signature = 'GET&'.urlencode($url).'&'.urlencode(http_build_query($encode_params));
    $oauth_signature = base64_encode(hash_hmac('sha1',$oauth_signature,$oauth_consumer_secret.'&'.$oauth_token_secret,true));
    $params['oauth_signature'] = $oauth_signature;
    return $url.'?'.http_build_query($params);
    }
    /**
    * 校验回调是否返回约定的参数
    */
    function check_callback(){
    if(isset($_GET['oauth_token']))
    if(isset($_GET['openid']))
    if(isset($_GET['oauth_signature']))
    if(isset($_GET['timestamp']))
    if(isset($_GET['oauth_vericode']))
    return true;
    return false;
    }
    function get_contents($url){
    $curl = curl_init();
    curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($curl,CURLOPT_URL,$url);
    return curl_exec($curl);
    }
    /**
    * Step1:请求临时token、Step2:生成未授权的临时token
    */
    function oauth_request_token(){
    $url = $this->build_request_uri($this->C('oauth_request_token_url'));
    $tmp_oauth_token = $this->get_contents($url);
    parse_str($tmp_oauth_token);
    /*
    oauth_token 未授权的临时token
    oauth_token_secret token的密钥,该密钥仅限于临时token
    error_code 错误码
    */
    if(isset($error_code)) exit($error_code);
    return array(
    'oauth_token'=>$oauth_token,
    'oauth_token_secret'=>$oauth_token_secret
    );
    }
    /**
    * Step3:引导用户到Qzone的登录页
    * @param string $oauth_token 未授权的临时token
    */
    function authorize($oauth_token){
    $str = "HTTP/1.1 302 Found";
    header($str);
    $url = $this->C('oauth_authorize_url');
    $query_strings = http_build_query(array(
    'oauth_consumer_key'=>$this->C('oauth_consumer_key'),
    'oauth_token'=>$oauth_token,
    'oauth_callback'=>$this->C('oauth_callback'),
    ));
    header('Location: '.$url.'?'.$query_strings);
    }
    /**
    * Step4:Qzone引导用户跳转到第三方应用
    * @return bool 验证是否有效
    */
    function register_user(){
    /*
    * oauth_token 已授权的临时token
    * openid 腾讯用户对外的统一ID,该OpenID与用户QQ号码一一对应
    * oauth_signature 签名值,方便第三方来验证openid以及来源的可靠性。
    * 使用HMAC-SHA1算法:
    * 源串:openid+timestamp(串中间不要添加'+'符号)
    * 密钥:oauth_consumer_secret
    * timestamp openid的时间戳
    * oauth_vericode 授权验证码。
    */
    if($this->check_callback()){
    //校验签名
    $signature = base64_encode(hash_hmac('sha1',$_GET['openid'].$_GET['timestamp'],$this->C('oauth_consumer_secret'),true));
    if(!emptyempty($_GET['oauth_signature']) && $signature==$_GET['oauth_signature']){
    $_SESSION['oauth_token'] = $_GET['oauth_token'];
    $_SESSION['oauth_vericode'] = $_GET['oauth_vericode'];
    return;
    }
    }
    //校验未通过
    exit('UNKNOW REQUEST');
    }
    /**
    * Step5:请求access token
    */
    function request_access_token(){
    $url = $this->build_request_uri($this->C('oauth_request_access_token_url'),array(
    'oauth_token'=>$_SESSION['oauth_token'],
    'oauth_vericode'=>$_SESSION['oauth_vericode']
    ),$_SESSION['oauth_token_secret']);
    return $this->get_contents($url);
    }
    /**
    * Step6:生成access token (保存access token)
    *
    * 关于access_token
    * 目前access_token(及其secret)是长期有效的,和某一个openid对应,目前可以支持线下获取该openid的信息。
    * 当然,用户有权限在Qzone这边删除对第三方的授权,此时该access_token会失效,需要重新走整个流程让用户授权。
    * 以后会逐步丰富access_token的有效性,长期有效、短期有效、用户登录时才有效等。
    */
    function save_access_token($access_token_str){
    parse_str($access_token_str,$access_token_arr);
    if(isset($access_token_arr['error_code'])){
    return FALSE;
    } else {
    return $access_token_arr;
    }
    }
    /**
    * 目前腾讯仅开放该API
    * 获取登录用户信息,目前可获取用户昵称及头像信息。
    * http://openapi.qzone.qq.com/user/get_user_info
    */
    function get_user_info(){
    $url = $this->build_request_uri($this->C('user_info_url'),array(
    'oauth_token'=>$_SESSION['oauth_token'],
    'openid'=>$_SESSION['openid'],
    ),$_SESSION['oauth_token_secret']);
    return $this->get_contents($url);
    }
    }

    文件打包下载 qq_php.rar
    转自: http://dev.meettea.com

        
    [3]模板引擎正则表达式调试小技巧
        来源: 互联网  发布时间: 2013-11-30
    基于正则表达式替换的模板引擎很容易遇上正则表达式最大回溯/递归的限制。
    惰性匹配并不可怕,正常情况下模板并不会不够用,往往不会超出限制,discuz的模板引擎就大量使用了。但是因此而不去注意、不去学习,则容易书写错误并遇上问题。
    当preg_*返回的是null的时候则要注意了,判断函数是is_null.
    出错并不可怕,但是最好把错误都完整的输出,这样调试就很容易了。
    除了输出出错原因,还要输出匹配的文本和使用的正则,这样就很容易调试了。
    PHP代码
    代码如下:

    <?php
    if (is_null($tmp)){
    $error_code = preg_last_error();
    switch($error_code){
    case PREG_NO_ERROR :
    echo 'PREG_NO_ERROR';
    break;
    case PREG_INTERNAL_ERROR:
    echo 'PREG_INTERNAL_ERROR';
    break;
    case PREG_BACKTRACK_LIMIT_ERROR:
    echo 'PREG_BACKTRACK_LIMIT_ERROR';
    break;
    case PREG_RECURSION_LIMIT_ERROR:
    echo 'PREG_RECURSION_LIMIT_ERROR';
    break;
    case PREG_BAD_UTF8_ERROR:
    echo 'PREG_BAD_UTF8_ERROR';
    break;
    case PREG_BAD_UTF8_OFFSET_ERROR:
    echo 'PREG_BAD_UTF8_OFFSET_ERROR';
    break;
    default:
    echo 'UNKNOW ERROR';
    }
    exit;
    }

    参考资料
    1、2010, Laruence 《深悉正则(pcre)最大回溯/递归限制》
    2、2011, PHP中文手册 preg_last_error


        
    最新技术文章:
    ▪PHP函数microtime()时间戳的定义与用法
    ▪PHP单一入口之apache配置内容
    ▪PHP数组排序方法总结(收藏)
    ▪php数组排序方法大全(脚本学堂整理奉献)
    ▪php数组排序的几个函数(附实例)
    ▪php二维数组排序(实例)
    ▪php根据键值对二维数组排序的小例子
    ▪php验证码(附截图)
    ▪php数组长度的获取方法(三个实例)
    ▪php获取数组长度的方法举例
    ▪判断php数组维度(php数组长度)的方法
    ▪php获取图片的exif信息的示例代码
    ▪PHP 数组key长度对性能的影响实例分析
    ▪php函数指定默认值的方法示例
    ▪php提交表单到当前页面、提交表单后页面重定...
    ▪php四舍五入的三种实现方法
    ▪php获得数组长度(元素个数)的方法
    ▪php日期函数的简单示例代码
    ▪php数学函数的简单示例代码
    ▪php字符串函数的简单示例代码
    ▪php文件下载代码(多浏览器兼容、支持中文文...
    ▪php实现文件下载、支持中文文件名的示例代码...
    ▪php文件下载(防止中文文件名乱码)的示例代码
    ▪解决PHP文件下载时中文文件名乱码的问题
    ▪php数组去重(一维、二维数组去重)的简单示例
    ▪php小数点后取两位的三种实现方法
    ▪php Redis 队列服务的简单示例
    ▪PHP导出excel时数字变为科学计数的解决方法
    ▪PHP数组根据值获取Key的简单示例
    ▪php数组去重的函数代码示例
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3