2016年4月29日星期五

PHP 无法开启 OCI8 扩展原因

今天刚好有个需求,要用 PHP 把数据写入远程 Oracle 数据库,所以要用到 OCI8 扩展。但总是无法开启,查阅了大量资料才知道原来是因为本地机器没安装 Oracle 数据库, 系统缺少Oracle的几个关键DLL造成的,可以通过安装Oracle Instant Client 来添加这些DLL。

Oracle Instant Client下载地址如下:

下载后,将其解压到 D:\Program Files\instantclient_11_2 (非固定位置),并将该路径加入到系统PATH环境变量的最前面。
然后重启一下Webserver,再查看phpinfo,可以OCI8模块信息了。

总结一下,PHP OCI8扩展的开启步骤:
(1)去掉php.ini中extension=php_oci8.dll前面的注释。

(2)解压 Oracle Instant Client,并将解压目录加入到系统PATH环境变量中。

(3)重启Webserver,使用phpinfo查看OCI8模块是否出现。



下面是Oracle官方的安装说明,很详细:
《nstalling PHP and the Oracle Instant Client for Linux and Windows

另外关于PHP操作Oracle的资料,这个感觉不错:

OCI8操作Oracle的PHP手册:

2016年4月27日星期三

PHP 获取远程图片(文件)并把它保存到本地

// 获取远程图片并把它保存到本地,确定您有把文件写入本地服务器的权限
// 变量说明:
// $url 是远程图片的完整URL地址,不能为空。
// $filename 是可选变量: 如果为空,本地文件名将基于时间和日期
// 自动生成.

function grab_image($url,$filename='') {
    if($url=='') {
       return false;
    }

    if($filename=='') {
        $ext = strrchr($url,".");
        if($ext!=".gif" && $ext!=".jpg" && $ext!=".png") {
           return false;
         }
        $filename = date("dMYHis").$ext;
    }
    ob_start();
    readfile($url);
    $img = ob_get_contents();
    ob_end_clean();

    $fp2=@fopen($filename, "a");
    fwrite($fp2,$img);
    fclose($fp2);

    return $filename;
}


远程获取文件原理与获取图片原理是类似的。这一步判断不要就可以了。

        if($ext!=".gif" && $ext!=".jpg" && $ext!=".png") {
           return false;

         }

2016年4月26日星期二

微信登录获取 openid 失败原因



今天再开发网站微信登录的时候,用 curl_init 无法获取 openid,代码如下

<?php
    $code = isset($_GET['code']) ? trim($_GET['code']) : '';
    $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.WX_APPID.'&secret='.WX_SECRET.'&code='.$code.'&grant_type=authorization_code';
    $ch = curl_init();
    curl_setopt ($ch, CURLOPT_URL, $url);
    curl_setopt ($ch, CURLOPT_HEADER, 0);// 显示返回的Header区域内容   
    curl_setopt ($ch, CURLOPT_TIMEOUT, 30);// 设置超时限制
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,10);// 链接超时限制
    curl_setopt ($ch, CURLOPT_HTTPHEADER,array('Accept-Encoding: gzip, deflate'));//设置 http 头信息
    curl_setopt ($ch, CURLOPT_ENCODING, 'gzip,deflate');//添加 gzip 解码的选项,即使网页没启用 gzip 也没关系 
    $content = curl_exec($ch);

?>


后来发现跟 https 有关,加上下面这两个选项就可以了

    curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST,0);
    curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER,0); 


由于 CURLOPT_SSL_VERIFYPEER 的预设值为 TRUE 是要验证伺服器凭证的,所以当拜访 https 网站时,若未做任何 SSL 相关设定,会出现以下错误。
Error Number: 60
Error Message: SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
如果只是要拜访 https 网站,但不会来回传递敏感信息,可以把 CURLOPT_SSL_VERIFYPEER 设定为 FALSE,代表可以盲目接受任何伺服器凭证。

而当 CURLOPT_SSL_VERIFYPEER 为 FALSE 时,其他诸如 CURLOPT_SSL_VERIFYHOST, CURLOPT_CAINFO, CURLOPT_CAPATH 等设定,都不具任何意义。