php 生成仿微信群组9空格头像

  最近项目是做一款 IM产品,群组头像需要是和微信群组头像一样(用前9个人合成群组头像),服务端使用php,下面附上解决方案:   效果图:     源代码:
继续阅读 »
  最近项目是做一款 IM产品,群组头像需要是和微信群组头像一样(用前9个人合成群组头像),服务端使用php,下面附上解决方案:   效果图:     源代码: 收起阅读 »

Office 不能编辑:提示由于所选内容已被锁定 您无法进行此更改

  Office 突然不能编辑:提示由于所选内容已被锁定 您无法进行此更改。   原因:Office 未激活或者已过试用期   下面提供 office2016的激活办法,是十分简单:   下载下面提供的软件,安装之后,重启office即可。   1、下载完成点击安装,安装完点击红色按钮:       2、点击next进行下一步安装;       3、安装完成,点击红包按钮,等待程序运行完毕即可激活office2016。   下载链接:   链接:http://pan.baidu.com/s/1mif2MDE 密码:kt95    
继续阅读 »
  Office 突然不能编辑:提示由于所选内容已被锁定 您无法进行此更改。   原因:Office 未激活或者已过试用期   下面提供 office2016的激活办法,是十分简单:   下载下面提供的软件,安装之后,重启office即可。   1、下载完成点击安装,安装完点击红色按钮:       2、点击next进行下一步安装;       3、安装完成,点击红包按钮,等待程序运行完毕即可激活office2016。   下载链接:   链接:http://pan.baidu.com/s/1mif2MDE 密码:kt95     收起阅读 »

linux删除邮件

  使用crontab跑定时作业,发现邮箱里面有很多垃圾邮件,想要全部删除可以这样做 cd /var/spool/mail echo ''>root 当然你想crontab 不发送邮件可以在cronab头部加上这一句 MAILTO=''
  使用crontab跑定时作业,发现邮箱里面有很多垃圾邮件,想要全部删除可以这样做 cd /var/spool/mail echo ''>root 当然你想crontab 不发送邮件可以在cronab头部加上这一句 MAILTO=''

cardbin 国内银行卡类型查询接口

    代码如下:   public function card_bin($card_no){ $card_list = array( 'SRCB'=>'深圳农村商业银行', 'BGB'=>'广西北部湾银行', 'SHRCB'=>'上海农村商业银行', 'BJBANK'=>'北京银行', 'WHCCB'=>'威海市商业银行', 'BOZK'=>'周口银行', 'KORLABANK'=>'库尔勒市商业银行', 'SPABANK'=>'平安银行', 'SDEB'=>'顺德农商银行', 'HURCB'=>'湖北省农村信用社', 'WRCB'=>'无锡农村商业银行', 'BOCY'=>'朝阳银行', 'CZBANK'=>'浙商银行', 'HDBANK'=>'邯郸银行', 'BOC'=>'中国银行', 'BOD'=>'东莞银行', 'CCB'=>'中国建设银行', 'ZYCBANK'=>'遵义市商业银行', 'SXCB'=>'绍兴银行', 'GZRCU'=>'贵州省农村信用社', 'ZJKCCB'=>'张家口市商业银行', 'BOJZ'=>'锦州银行', 'BOP'=>'平顶山银行', 'HKB'=>'汉口银行', 'SPDB'=>'上海浦东发展银行', 'NXRCU'=>'宁夏黄河农村商业银行', 'NYNB'=>'广东南粤银行', 'GRCB'=>'广州农商银行', 'BOSZ'=>'苏州银行', 'HZCB'=>'杭州银行', 'HSBK'=>'衡水银行', 'HBC'=>'湖北银行', 'JXBANK'=>'嘉兴银行', 'HRXJB'=>'华融湘江银行', 'BODD'=>'丹东银行', 'AYCB'=>'安阳银行', 'EGBANK'=>'恒丰银行', 'CDB'=>'国家开发银行', 'TCRCB'=>'江苏太仓农村商业银行', 'NJCB'=>'南京银行', 'ZZBANK'=>'郑州银行', 'DYCB'=>'德阳商业银行', 'YBCCB'=>'宜宾市商业银行', 'SCRCU'=>'四川省农村信用', 'KLB'=>'昆仑银行', 'LSBANK'=>'莱商银行', 'YDRCB'=>'尧都农商行', 'CCQTGB'=>'重庆三峡银行', 'FDB'=>'富滇银行', 'JSRCU'=>'江苏省农村信用联合社', 'JNBANK'=>'济宁银行', 'CMB'=>'招商银行', 'JINCHB'=>'晋城银行JCBANK', 'FXCB'=>'阜新银行', 'WHRCB'=>'武汉农村商业银行', 'HBYCBANK'=>'湖北银行宜昌分行', 'TZCB'=>'台州银行', 'TACCB'=>'泰安市商业银行', 'XCYH'=>'许昌银行', 'CEB'=>'中国光大银行', 'NXBANK'=>'宁夏银行', 'HSBANK'=>'徽商银行', 'JJBANK'=>'九江银行', 'NHQS'=>'农信银清算中心', 'MTBANK'=>'浙江民泰商业银行', 'LANGFB'=>'廊坊银行', 'ASCB'=>'鞍山银行', 'KSRB'=>'昆山农村商业银行', 'YXCCB'=>'玉溪市商业银行', 'DLB'=>'大连银行', 'DRCBCL'=>'东莞农村商业银行', 'GCB'=>'广州银行', 'NBBANK'=>'宁波银行', 'BOYK'=>'营口银行', 'SXRCCU'=>'陕西信合', 'GLBANK'=>'桂林银行', 'BOQH'=>'青海银行', 'CDRCB'=>'成都农商银行', 'QDCCB'=>'青岛银行', 'HKBEA'=>'东亚银行', 'HBHSBANK'=>'湖北银行黄石分行', 'WZCB'=>'温州银行', 'TRCB'=>'天津农商银行', 'QLBANK'=>'齐鲁银行', 'GDRCC'=>'广东省农村信用社联合社', 'ZJTLCB'=>'浙江泰隆商业银行', 'GZB'=>'赣州银行', 'GYCB'=>'贵阳市商业银行', 'CQBANK'=>'重庆银行', 'DAQINGB'=>'龙江银行', 'CGNB'=>'南充市商业银行', 'SCCB'=>'三门峡银行', 'CSRCB'=>'常熟农村商业银行', 'SHBANK'=>'上海银行', 'JLBANK'=>'吉林银行', 'CZRCB'=>'常州农村信用联社', 'BANKWF'=>'潍坊银行', 'ZRCBANK'=>'张家港农村商业银行', 'FJHXBC'=>'福建海峡银行', 'ZJNX'=>'浙江省农村信用社联合社', 'LZYH'=>'兰州银行', 'JSB'=>'晋商银行', 'BOHAIB'=>'渤海银行', 'CZCB'=>'浙江稠州商业银行', 'YQCCB'=>'阳泉银行', 'SJBANK'=>'盛京银行', 'XABANK'=>'西安银行', 'BSB'=>'包商银行', 'JSBANK'=>'江苏银行', 'FSCB'=>'抚顺银行', 'HNRCU'=>'河南省农村信用', 'COMM'=>'交通银行', 'XTB'=>'邢台银行', 'CITIC'=>'中信银行', 'HXBANK'=>'华夏银行', 'HNRCC'=>'湖南省农村信用社', 'DYCCB'=>'东营市商业银行', 'ORBANK'=>'鄂尔多斯银行', 'BJRCB'=>'北京农村商业银行', 'XYBANK'=>'信阳银行', 'ZGCCB'=>'自贡市商业银行', 'CDCB'=>'成都银行', 'HANABANK'=>'韩亚银行', 'CMBC'=>'中国民生银行', 'LYBANK'=>'洛阳银行', 'GDB'=>'广东发展银行', 'ZBCB'=>'齐商银行', 'CBKF'=>'开封市商业银行', 'H3CB'=>'内蒙古银行', 'CIB'=>'兴业银行', 'CRCBANK'=>'重庆农村商业银行', 'SZSBK'=>'石嘴山银行', 'DZBANK'=>'德州银行', 'SRBANK'=>'上饶银行', 'LSCCB'=>'乐山市商业银行', 'JXRCU'=>'江西省农村信用', 'ICBC'=>'中国工商银行', 'JZBANK'=>'晋中市商业银行', 'HZCCB'=>'湖州市商业银行', 'NHB'=>'南海农村信用联社', 'XXBANK'=>'新乡银行', 'JRCB'=>'江苏江阴农村商业银行', 'YNRCC'=>'云南省农村信用社', 'ABC'=>'中国农业银行', 'GXRCU'=>'广西省农村信用', 'PSBC'=>'中国邮政储蓄银行', 'BZMD'=>'驻马店银行', 'ARCU'=>'安徽省农村信用社', 'GSRCU'=>'甘肃省农村信用', 'LYCB'=>'辽阳市商业银行', 'JLRCU'=>'吉林农信', 'URMQCCB'=>'乌鲁木齐市商业银行', 'XLBANK'=>'中山小榄村镇银行', 'CSCB'=>'长沙银行', 'JHBANK'=>'金华银行', 'BHB'=>'河北银行', 'NBYZ'=>'鄞州银行', 'LSBC'=>'临商银行', 'BOCD'=>'承德银行', 'SDRCU'=>'山东农信', 'NCB'=>'南昌银行', 'TCCB'=>'天津银行', 'WJRCB'=>'吴江农商银行', 'CBBQS'=>'城市商业银行资金清算中心', 'HBRCU'=>'河北省农村信用社', 'ZYB'=>'中原银行' ); $cardtype_list = array( 'DC'=>'储蓄卡', 'CC'=>'信用卡', 'SCC'=>'准贷记卡', 'PC'=>'预付费卡', ); $url = 'https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo='.$card_no.'&cardBinCheck=true'; $response = curlGet($url); $result = json_decode($response); if($result->validated){ if(isset($card_list[$result->bank]) || isset($cardtype_list[$result->cardType])){ return ['statu'=>true , 'msg'=>'接口调查成功' , 'code'=>0 , 'data'=>[ 'bank'=>$card_list[$result->bank], 'bank_code' => $result->bank, 'card_type'=>$cardtype_list[$result->cardType] ]]; } else { return ['statu'=>false , 'msg' => '未知的银行卡' , 'code'=>103402]; } } else { return ['statu'=>false , 'msg' => '银行卡格式验证失败' , 'code'=>103403]; } }
继续阅读 »
    代码如下:   public function card_bin($card_no){ $card_list = array( 'SRCB'=>'深圳农村商业银行', 'BGB'=>'广西北部湾银行', 'SHRCB'=>'上海农村商业银行', 'BJBANK'=>'北京银行', 'WHCCB'=>'威海市商业银行', 'BOZK'=>'周口银行', 'KORLABANK'=>'库尔勒市商业银行', 'SPABANK'=>'平安银行', 'SDEB'=>'顺德农商银行', 'HURCB'=>'湖北省农村信用社', 'WRCB'=>'无锡农村商业银行', 'BOCY'=>'朝阳银行', 'CZBANK'=>'浙商银行', 'HDBANK'=>'邯郸银行', 'BOC'=>'中国银行', 'BOD'=>'东莞银行', 'CCB'=>'中国建设银行', 'ZYCBANK'=>'遵义市商业银行', 'SXCB'=>'绍兴银行', 'GZRCU'=>'贵州省农村信用社', 'ZJKCCB'=>'张家口市商业银行', 'BOJZ'=>'锦州银行', 'BOP'=>'平顶山银行', 'HKB'=>'汉口银行', 'SPDB'=>'上海浦东发展银行', 'NXRCU'=>'宁夏黄河农村商业银行', 'NYNB'=>'广东南粤银行', 'GRCB'=>'广州农商银行', 'BOSZ'=>'苏州银行', 'HZCB'=>'杭州银行', 'HSBK'=>'衡水银行', 'HBC'=>'湖北银行', 'JXBANK'=>'嘉兴银行', 'HRXJB'=>'华融湘江银行', 'BODD'=>'丹东银行', 'AYCB'=>'安阳银行', 'EGBANK'=>'恒丰银行', 'CDB'=>'国家开发银行', 'TCRCB'=>'江苏太仓农村商业银行', 'NJCB'=>'南京银行', 'ZZBANK'=>'郑州银行', 'DYCB'=>'德阳商业银行', 'YBCCB'=>'宜宾市商业银行', 'SCRCU'=>'四川省农村信用', 'KLB'=>'昆仑银行', 'LSBANK'=>'莱商银行', 'YDRCB'=>'尧都农商行', 'CCQTGB'=>'重庆三峡银行', 'FDB'=>'富滇银行', 'JSRCU'=>'江苏省农村信用联合社', 'JNBANK'=>'济宁银行', 'CMB'=>'招商银行', 'JINCHB'=>'晋城银行JCBANK', 'FXCB'=>'阜新银行', 'WHRCB'=>'武汉农村商业银行', 'HBYCBANK'=>'湖北银行宜昌分行', 'TZCB'=>'台州银行', 'TACCB'=>'泰安市商业银行', 'XCYH'=>'许昌银行', 'CEB'=>'中国光大银行', 'NXBANK'=>'宁夏银行', 'HSBANK'=>'徽商银行', 'JJBANK'=>'九江银行', 'NHQS'=>'农信银清算中心', 'MTBANK'=>'浙江民泰商业银行', 'LANGFB'=>'廊坊银行', 'ASCB'=>'鞍山银行', 'KSRB'=>'昆山农村商业银行', 'YXCCB'=>'玉溪市商业银行', 'DLB'=>'大连银行', 'DRCBCL'=>'东莞农村商业银行', 'GCB'=>'广州银行', 'NBBANK'=>'宁波银行', 'BOYK'=>'营口银行', 'SXRCCU'=>'陕西信合', 'GLBANK'=>'桂林银行', 'BOQH'=>'青海银行', 'CDRCB'=>'成都农商银行', 'QDCCB'=>'青岛银行', 'HKBEA'=>'东亚银行', 'HBHSBANK'=>'湖北银行黄石分行', 'WZCB'=>'温州银行', 'TRCB'=>'天津农商银行', 'QLBANK'=>'齐鲁银行', 'GDRCC'=>'广东省农村信用社联合社', 'ZJTLCB'=>'浙江泰隆商业银行', 'GZB'=>'赣州银行', 'GYCB'=>'贵阳市商业银行', 'CQBANK'=>'重庆银行', 'DAQINGB'=>'龙江银行', 'CGNB'=>'南充市商业银行', 'SCCB'=>'三门峡银行', 'CSRCB'=>'常熟农村商业银行', 'SHBANK'=>'上海银行', 'JLBANK'=>'吉林银行', 'CZRCB'=>'常州农村信用联社', 'BANKWF'=>'潍坊银行', 'ZRCBANK'=>'张家港农村商业银行', 'FJHXBC'=>'福建海峡银行', 'ZJNX'=>'浙江省农村信用社联合社', 'LZYH'=>'兰州银行', 'JSB'=>'晋商银行', 'BOHAIB'=>'渤海银行', 'CZCB'=>'浙江稠州商业银行', 'YQCCB'=>'阳泉银行', 'SJBANK'=>'盛京银行', 'XABANK'=>'西安银行', 'BSB'=>'包商银行', 'JSBANK'=>'江苏银行', 'FSCB'=>'抚顺银行', 'HNRCU'=>'河南省农村信用', 'COMM'=>'交通银行', 'XTB'=>'邢台银行', 'CITIC'=>'中信银行', 'HXBANK'=>'华夏银行', 'HNRCC'=>'湖南省农村信用社', 'DYCCB'=>'东营市商业银行', 'ORBANK'=>'鄂尔多斯银行', 'BJRCB'=>'北京农村商业银行', 'XYBANK'=>'信阳银行', 'ZGCCB'=>'自贡市商业银行', 'CDCB'=>'成都银行', 'HANABANK'=>'韩亚银行', 'CMBC'=>'中国民生银行', 'LYBANK'=>'洛阳银行', 'GDB'=>'广东发展银行', 'ZBCB'=>'齐商银行', 'CBKF'=>'开封市商业银行', 'H3CB'=>'内蒙古银行', 'CIB'=>'兴业银行', 'CRCBANK'=>'重庆农村商业银行', 'SZSBK'=>'石嘴山银行', 'DZBANK'=>'德州银行', 'SRBANK'=>'上饶银行', 'LSCCB'=>'乐山市商业银行', 'JXRCU'=>'江西省农村信用', 'ICBC'=>'中国工商银行', 'JZBANK'=>'晋中市商业银行', 'HZCCB'=>'湖州市商业银行', 'NHB'=>'南海农村信用联社', 'XXBANK'=>'新乡银行', 'JRCB'=>'江苏江阴农村商业银行', 'YNRCC'=>'云南省农村信用社', 'ABC'=>'中国农业银行', 'GXRCU'=>'广西省农村信用', 'PSBC'=>'中国邮政储蓄银行', 'BZMD'=>'驻马店银行', 'ARCU'=>'安徽省农村信用社', 'GSRCU'=>'甘肃省农村信用', 'LYCB'=>'辽阳市商业银行', 'JLRCU'=>'吉林农信', 'URMQCCB'=>'乌鲁木齐市商业银行', 'XLBANK'=>'中山小榄村镇银行', 'CSCB'=>'长沙银行', 'JHBANK'=>'金华银行', 'BHB'=>'河北银行', 'NBYZ'=>'鄞州银行', 'LSBC'=>'临商银行', 'BOCD'=>'承德银行', 'SDRCU'=>'山东农信', 'NCB'=>'南昌银行', 'TCCB'=>'天津银行', 'WJRCB'=>'吴江农商银行', 'CBBQS'=>'城市商业银行资金清算中心', 'HBRCU'=>'河北省农村信用社', 'ZYB'=>'中原银行' ); $cardtype_list = array( 'DC'=>'储蓄卡', 'CC'=>'信用卡', 'SCC'=>'准贷记卡', 'PC'=>'预付费卡', ); $url = 'https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo='.$card_no.'&cardBinCheck=true'; $response = curlGet($url); $result = json_decode($response); if($result->validated){ if(isset($card_list[$result->bank]) || isset($cardtype_list[$result->cardType])){ return ['statu'=>true , 'msg'=>'接口调查成功' , 'code'=>0 , 'data'=>[ 'bank'=>$card_list[$result->bank], 'bank_code' => $result->bank, 'card_type'=>$cardtype_list[$result->cardType] ]]; } else { return ['statu'=>false , 'msg' => '未知的银行卡' , 'code'=>103402]; } } else { return ['statu'=>false , 'msg' => '银行卡格式验证失败' , 'code'=>103403]; } } 收起阅读 »

封装 php redis 缓存类

  封装 php redis 缓存类,源码如下 (需要自己实例化下redis):   <?php class Cache { private static function init(){ return RedisClient::getInstance('redis'); // 上面是我的实例化方式,需要修改为自己实例化redis。 } /* * #desc 根据缓存级别,定义过期时间 * * * */ private static function lifetime($level){ switch ($level) { case 'low': return 300; case 'normal': return 1200; case 'high': return 3600; default: return 1200; } } public static function set($key,$value,$level='normal'){ $redis = self::init(); $value = (is_object($value) || is_array($value)) ? json_encode($value) : $value; //对数组/对象数据进行缓存处理,保证数据完整性 return $redis->set($key,$value,self::lifetime($level)); } public static function get($key){ $redis = self::init(); $value = $redis->get($key); if (is_null($value)) { return false; } $jsonData = json_decode($value, true); return (null === $jsonData) ? $value : $jsonData; } }
继续阅读 »
  封装 php redis 缓存类,源码如下 (需要自己实例化下redis):   <?php class Cache { private static function init(){ return RedisClient::getInstance('redis'); // 上面是我的实例化方式,需要修改为自己实例化redis。 } /* * #desc 根据缓存级别,定义过期时间 * * * */ private static function lifetime($level){ switch ($level) { case 'low': return 300; case 'normal': return 1200; case 'high': return 3600; default: return 1200; } } public static function set($key,$value,$level='normal'){ $redis = self::init(); $value = (is_object($value) || is_array($value)) ? json_encode($value) : $value; //对数组/对象数据进行缓存处理,保证数据完整性 return $redis->set($key,$value,self::lifetime($level)); } public static function get($key){ $redis = self::init(); $value = $redis->get($key); if (is_null($value)) { return false; } $jsonData = json_decode($value, true); return (null === $jsonData) ? $value : $jsonData; } } 收起阅读 »

apache服务器 保护模板文件(.html、.shtml)

 apache服务器实现保护模板文件(.html、.shtml):禁止使用浏览器直接访问模板文件     适用于:thinkphp、phpcms 等开发的网站   比如:   使用phpcms 开发的网站。默认的模板放在:phpcms/templates/default/content/   用户直接使用浏览器访问 www.域名.com/phpcms/templates/default/content/index.html 就得到你的首页模板文件了,然后在copy下 css js 就可以将你的网站完整的趴下来了。   实现代码如下(利用apache的.htaccess文件):   在 phpcms/templates/default/content/ 目录下,新建.htaccess文件,加入以下代码:  <Files *.html> Order Allow,Deny Deny from all </Files> 这样使用浏览器直接访问模板文件,就会提示403
继续阅读 »
 apache服务器实现保护模板文件(.html、.shtml):禁止使用浏览器直接访问模板文件     适用于:thinkphp、phpcms 等开发的网站   比如:   使用phpcms 开发的网站。默认的模板放在:phpcms/templates/default/content/   用户直接使用浏览器访问 www.域名.com/phpcms/templates/default/content/index.html 就得到你的首页模板文件了,然后在copy下 css js 就可以将你的网站完整的趴下来了。   实现代码如下(利用apache的.htaccess文件):   在 phpcms/templates/default/content/ 目录下,新建.htaccess文件,加入以下代码:  <Files *.html> Order Allow,Deny Deny from all </Files> 这样使用浏览器直接访问模板文件,就会提示403 收起阅读 »

php curl 请求 https 接口

  php curl 请求 https 接口:   解决方法,在curl请求时,加入:   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); // 从证书中检查SSL加密算法是否存在  完整代码如下:   function curlPost($url, $data = null) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_TIMEOUT, 60); $output = curl_exec($ch); curl_close($ch); return $output; }  
继续阅读 »
  php curl 请求 https 接口:   解决方法,在curl请求时,加入:   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); // 从证书中检查SSL加密算法是否存在  完整代码如下:   function curlPost($url, $data = null) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_TIMEOUT, 60); $output = curl_exec($ch); curl_close($ch); return $output; }   收起阅读 »

php 将数组中的键名作为变量名键值作为变量

php
     php 将数组中的键名作为变量名键值作为变量。   使用场景:   接收表单提交过来的数据,$_POST   <?php /** * php 把数组中的键名所为变量名键值作为变量 */ $arr=array('a'=>1,'b'=>2,'c'=>3,'d'=>5,'e'=>6); //方法一,使用foreach循环实现 foreach($arr as $key=>$value){ $$key=$value; } echo $a; //方法二,其实php早就已经实现了这个功能extract extract($arr); echo $a;
继续阅读 »
     php 将数组中的键名作为变量名键值作为变量。   使用场景:   接收表单提交过来的数据,$_POST   <?php /** * php 把数组中的键名所为变量名键值作为变量 */ $arr=array('a'=>1,'b'=>2,'c'=>3,'d'=>5,'e'=>6); //方法一,使用foreach循环实现 foreach($arr as $key=>$value){ $$key=$value; } echo $a; //方法二,其实php早就已经实现了这个功能extract extract($arr); echo $a; 收起阅读 »

jquery $.ajax 加loading

  使用ajax提升用户体验,代码如下:   $.ajax({ type: "POST", url: "./index.php?g=api", async: false, data: {}, dataType: "json", beforeSend: function(){ $('#uppic_loading').fadeIn(300); //显示loading }, success: function(data) { //成功回掉 }, complete: function () { $('#uppic_loading').fadeOut(300); //隐藏loading } });
继续阅读 »
  使用ajax提升用户体验,代码如下:   $.ajax({ type: "POST", url: "./index.php?g=api", async: false, data: {}, dataType: "json", beforeSend: function(){ $('#uppic_loading').fadeIn(300); //显示loading }, success: function(data) { //成功回掉 }, complete: function () { $('#uppic_loading').fadeOut(300); //隐藏loading } }); 收起阅读 »

mysql设置联合主键

  语法如下:   alter table tablename add primary key (字段1,字段2);
  语法如下:   alter table tablename add primary key (字段1,字段2);

批量检测百度是否收录,检测结果导出txt工具

  安全扫描软件有可能会拦截,软件亲测可用。   1:首先将需要检测的url 复制到工具左侧框内,点击 网址导入列表     2:点击 开始批量检测     3:导出检测结果       软件下载地址:   链接:http://pan.baidu.com/s/1pKFCDQj 密码:ggcf    
继续阅读 »
  安全扫描软件有可能会拦截,软件亲测可用。   1:首先将需要检测的url 复制到工具左侧框内,点击 网址导入列表     2:点击 开始批量检测     3:导出检测结果       软件下载地址:   链接:http://pan.baidu.com/s/1pKFCDQj 密码:ggcf     收起阅读 »

php explode 以换行分割,将字符串转为数组

php
  php explode 以换行(\n)分割,将字符串转为数组:   实例代码:   <?php $str = '8403949297 3809849493 1667598561 3330813175'; $arr = explode("\n",$str); print_r($arr); 注意  "\n" 为双引号。    
继续阅读 »
  php explode 以换行(\n)分割,将字符串转为数组:   实例代码:   <?php $str = '8403949297 3809849493 1667598561 3330813175'; $arr = explode("\n",$str); print_r($arr); 注意  "\n" 为双引号。     收起阅读 »

解决 SourceTree不能安装(跳过atlassian无法注册,免登录跳过初始设置)

  安装 SourceTree 时,需要使用atlassian授权,因为各种原因无法完成授权,现提供跳过 atlassian账号 授权方法。       安装之后,转到用户本地文件夹下的 SourceTree 目录,没有则新建:   %LocalAppData%\Atlassian\SourceTree\ 新建 accounts.json 文件   %LocalAppData%\Atlassian\SourceTree\accounts.json 输入以下内容保存即可    [ { "$id": "1", "$type": "SourceTree.Api.Host.Identity.Model.IdentityAccount, SourceTree.Api.Host.Identity", "Authenticate": true, "HostInstance": { "$id": "2", "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountInstance, SourceTree.Host.AtlassianAccount", "Host": { "$id": "3", "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountHost, SourceTree.Host.AtlassianAccount", "Id": "atlassian account" }, "BaseUrl": "https://id.atlassian.com/" }, "Credentials": { "$id": "4", "$type": "SourceTree.Model.BasicAuthCredentials, SourceTree.Api.Account", "Username": "", "Email": null }, "IsDefault": false } ]     再打开 SourceTree,直接显示主窗口了。  
继续阅读 »
  安装 SourceTree 时,需要使用atlassian授权,因为各种原因无法完成授权,现提供跳过 atlassian账号 授权方法。       安装之后,转到用户本地文件夹下的 SourceTree 目录,没有则新建:   %LocalAppData%\Atlassian\SourceTree\ 新建 accounts.json 文件   %LocalAppData%\Atlassian\SourceTree\accounts.json 输入以下内容保存即可    [ { "$id": "1", "$type": "SourceTree.Api.Host.Identity.Model.IdentityAccount, SourceTree.Api.Host.Identity", "Authenticate": true, "HostInstance": { "$id": "2", "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountInstance, SourceTree.Host.AtlassianAccount", "Host": { "$id": "3", "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountHost, SourceTree.Host.AtlassianAccount", "Id": "atlassian account" }, "BaseUrl": "https://id.atlassian.com/" }, "Credentials": { "$id": "4", "$type": "SourceTree.Model.BasicAuthCredentials, SourceTree.Api.Account", "Username": "", "Email": null }, "IsDefault": false } ]     再打开 SourceTree,直接显示主窗口了。   收起阅读 »

测试mongoDB性能

硬件环境:某网站云服务器 CPU:1核 内存:1G 硬盘:20G 软件环境: 操作系统:CentOS 6.3 64位 web服务器:nginx 1.4.5 php版本:php 5.5.9 mongodb版本:mongodb 2.4.9 mongo客户端:php mongo扩展 1.4.5 执行操作: 查询 (findOne) 写入(insert) 更新(update) 测试执行时间: 执行10次查询+10次写入+10次更新  => 2.8毫秒 执行100次查询+100次写入+100次更新  => 19.5毫秒 执行1000次查询+1000次写入+1000次更新  => 191.6毫秒 执行10000次查询+10000次写入+10000次更新  => 1934.7毫秒 执行100000次查询+100000次写入+100000次更新  => 19473.7毫秒 执行1000000次查询+1000000次写入+1000000次更新  => 用时200913.2毫秒 测试结果: 在上述环境下,php每秒执行5000次mongodb读写更新。测试代码如下: set_time_limit(0); $statrTime = microtime(true); $mongo = new Mongo(); $db = $mongo->selectDB('mongodb1'); $blog_id = $db->selectCollection('blog_id'); $blog = $db->selectCollection('blog'); $options['_id'] = 1; for ($i=1; $i<=1000000; $i++) { $blog_id_item = $blog_id->findOne($options); $autoid = $blog_id_item['autoid'] + 1; $data['_id'] = $autoid; $data['title'] = '标题'.$autoid; $data['content'] = '第'.$autoid.'篇文章内容'; $data['ctime'] = time(); if ($blog->insert($data)) { //新增成功,id+1 $udata['$inc'] = array('autoid'=>1); $blog_id->update($options, $udata); } else { echo 'error .. nothing to do!<br />'; } } $mongo->close(); $endTime = microtime(true); $diffTime = round(($endTime - $statrTime) * 1000, 1); echo '<br />用时'.$diffTime.'毫秒';   如果遇到超时问题,可以修改nginx和php-fpm配置参数: nginx.conf 配置参数 fastcgi_connect_timeout 300s; fastcgi_send_timeout 300s; fastcgi_read_timeout 300s; php-fpm.conf 配置参数 request_terminate_timeout = 300s; 单独读取测试代码:   public function mongoread () { set_time_limit(0); $statrTime = microtime(true); $mongo = new Mongo(); $db = $mongo->selectDB('mongodb1'); $blog = $db->selectCollection('blog'); for ($i=1; $i<=100000; $i++) { $options['_id'] = $i; $blog_item = $blog->findOne($options); } $mongo->close(); $endTime = microtime(true); $diffTime = round(($endTime - $statrTime) * 1000, 1); echo '<br />用时'.$diffTime.'毫秒'; }   测试结果: 读取1000条记录时间 => 用时88.2毫秒 读取10000条记录时间 => 用时857.5毫秒 读取100000条记录时间 => 用时8752.1毫秒 (增加10万条数据后第二次读取用时9138.2毫秒,第三次用时8859.8毫秒) 平均每秒读取11425条记录 单独写入测试代码:   public function mongowrite () { set_time_limit(0); $statrTime = microtime(true); $mongo = new Mongo(); $db = $mongo->selectDB('mongodb1'); $blog = $db->selectCollection('blog2'); for ($i=1; $i<=10000; $i++) { $data['_id'] = $i; $data['title'] = '标题'.$i; $data['content'] = '第'.$i.'篇文章内容'; $data['ctime'] = time(); $blog->insert($data); } $mongo->close(); $endTime = microtime(true); $diffTime = round(($endTime - $statrTime) * 1000, 1); echo '<br />用时'.$diffTime.'毫秒'; }   测试结果: 写入1000条记录时间 => 用时12.5毫秒  写入10000条记录时间 => 用时234.4毫秒 写入100000条记录时间 => 用时3265.6毫秒 (第二次测试用时3180.9毫秒,第二次平均每秒写入31437条记录) 平均每秒写入30622条记录 通过测试可以看出,mongodb写入比读取要更快。        
继续阅读 »
硬件环境:某网站云服务器 CPU:1核 内存:1G 硬盘:20G 软件环境: 操作系统:CentOS 6.3 64位 web服务器:nginx 1.4.5 php版本:php 5.5.9 mongodb版本:mongodb 2.4.9 mongo客户端:php mongo扩展 1.4.5 执行操作: 查询 (findOne) 写入(insert) 更新(update) 测试执行时间: 执行10次查询+10次写入+10次更新  => 2.8毫秒 执行100次查询+100次写入+100次更新  => 19.5毫秒 执行1000次查询+1000次写入+1000次更新  => 191.6毫秒 执行10000次查询+10000次写入+10000次更新  => 1934.7毫秒 执行100000次查询+100000次写入+100000次更新  => 19473.7毫秒 执行1000000次查询+1000000次写入+1000000次更新  => 用时200913.2毫秒 测试结果: 在上述环境下,php每秒执行5000次mongodb读写更新。测试代码如下: set_time_limit(0); $statrTime = microtime(true); $mongo = new Mongo(); $db = $mongo->selectDB('mongodb1'); $blog_id = $db->selectCollection('blog_id'); $blog = $db->selectCollection('blog'); $options['_id'] = 1; for ($i=1; $i<=1000000; $i++) { $blog_id_item = $blog_id->findOne($options); $autoid = $blog_id_item['autoid'] + 1; $data['_id'] = $autoid; $data['title'] = '标题'.$autoid; $data['content'] = '第'.$autoid.'篇文章内容'; $data['ctime'] = time(); if ($blog->insert($data)) { //新增成功,id+1 $udata['$inc'] = array('autoid'=>1); $blog_id->update($options, $udata); } else { echo 'error .. nothing to do!<br />'; } } $mongo->close(); $endTime = microtime(true); $diffTime = round(($endTime - $statrTime) * 1000, 1); echo '<br />用时'.$diffTime.'毫秒';   如果遇到超时问题,可以修改nginx和php-fpm配置参数: nginx.conf 配置参数 fastcgi_connect_timeout 300s; fastcgi_send_timeout 300s; fastcgi_read_timeout 300s; php-fpm.conf 配置参数 request_terminate_timeout = 300s; 单独读取测试代码:   public function mongoread () { set_time_limit(0); $statrTime = microtime(true); $mongo = new Mongo(); $db = $mongo->selectDB('mongodb1'); $blog = $db->selectCollection('blog'); for ($i=1; $i<=100000; $i++) { $options['_id'] = $i; $blog_item = $blog->findOne($options); } $mongo->close(); $endTime = microtime(true); $diffTime = round(($endTime - $statrTime) * 1000, 1); echo '<br />用时'.$diffTime.'毫秒'; }   测试结果: 读取1000条记录时间 => 用时88.2毫秒 读取10000条记录时间 => 用时857.5毫秒 读取100000条记录时间 => 用时8752.1毫秒 (增加10万条数据后第二次读取用时9138.2毫秒,第三次用时8859.8毫秒) 平均每秒读取11425条记录 单独写入测试代码:   public function mongowrite () { set_time_limit(0); $statrTime = microtime(true); $mongo = new Mongo(); $db = $mongo->selectDB('mongodb1'); $blog = $db->selectCollection('blog2'); for ($i=1; $i<=10000; $i++) { $data['_id'] = $i; $data['title'] = '标题'.$i; $data['content'] = '第'.$i.'篇文章内容'; $data['ctime'] = time(); $blog->insert($data); } $mongo->close(); $endTime = microtime(true); $diffTime = round(($endTime - $statrTime) * 1000, 1); echo '<br />用时'.$diffTime.'毫秒'; }   测试结果: 写入1000条记录时间 => 用时12.5毫秒  写入10000条记录时间 => 用时234.4毫秒 写入100000条记录时间 => 用时3265.6毫秒 (第二次测试用时3180.9毫秒,第二次平均每秒写入31437条记录) 平均每秒写入30622条记录 通过测试可以看出,mongodb写入比读取要更快。         收起阅读 »

网站开发:XSS(跨站攻击)的防范利器HTMLPurifier

xss
  在编程开发时安全问题是及其重要的,对于用户提交的数据要进行过滤。   XSS就是需要重视的一点,先说一下什么是XSS:   简单来说就是用户提交数据(例如发表评论,发表日志)时往Web页面里插入恶意javascript代码例如死循环,疯狂的alert,这还不算还可能会修改页面页面上的html元素(例如登录表单的action),这样当用户浏览该页之时,嵌入其中Web里面的代码会被执行,从而达到用户的特殊目的。     在使用PHP开发时,可以使用htmlspecialchars将用户提交过来的数据转换使之原样显示,但是这样一来会造成一些弊端,比如用户上传的图片无法显示,html标签不会起作用,没有任何样式。解决方案就是可以使用UBB标签或者自定义标签来实现,要么就是自己写正则去过滤,但是防不胜防,并且这样在处理起来有些繁琐。下载重点介绍一个开源的HTMLPurifier,这是一个符合W3C标准的HTML过滤器,可以生成标准的HTML代码,并且有很多的自定义配置,设置白名单之后就可以把有用的css留下并且可以过滤掉javascript代码,有效的防止XSS!   实例:   <?php //引入htmlPurifier去除XSS跨站攻击代码 生成安全的html代码 require_once('./htmlpurifier/library/HTMLPurifier.includes.php'); $config = HTMLPurifier_Config::createDefault(); //创建默认配置 $purifier = new HTMLPurifier($config); //实例化 并传入默认配置 ($config为空也可) $safedata = $purifier->purify($_POST['content']); //开始过滤 返回过滤后的字符串 echo '<pre>'; print_r($safedata); ?>   下载HTMLPurifier  
继续阅读 »
  在编程开发时安全问题是及其重要的,对于用户提交的数据要进行过滤。   XSS就是需要重视的一点,先说一下什么是XSS:   简单来说就是用户提交数据(例如发表评论,发表日志)时往Web页面里插入恶意javascript代码例如死循环,疯狂的alert,这还不算还可能会修改页面页面上的html元素(例如登录表单的action),这样当用户浏览该页之时,嵌入其中Web里面的代码会被执行,从而达到用户的特殊目的。     在使用PHP开发时,可以使用htmlspecialchars将用户提交过来的数据转换使之原样显示,但是这样一来会造成一些弊端,比如用户上传的图片无法显示,html标签不会起作用,没有任何样式。解决方案就是可以使用UBB标签或者自定义标签来实现,要么就是自己写正则去过滤,但是防不胜防,并且这样在处理起来有些繁琐。下载重点介绍一个开源的HTMLPurifier,这是一个符合W3C标准的HTML过滤器,可以生成标准的HTML代码,并且有很多的自定义配置,设置白名单之后就可以把有用的css留下并且可以过滤掉javascript代码,有效的防止XSS!   实例:   <?php //引入htmlPurifier去除XSS跨站攻击代码 生成安全的html代码 require_once('./htmlpurifier/library/HTMLPurifier.includes.php'); $config = HTMLPurifier_Config::createDefault(); //创建默认配置 $purifier = new HTMLPurifier($config); //实例化 并传入默认配置 ($config为空也可) $safedata = $purifier->purify($_POST['content']); //开始过滤 返回过滤后的字符串 echo '<pre>'; print_r($safedata); ?>   下载HTMLPurifier   收起阅读 »

分析 Nginx出现Access Denied的原理以及解决方案

          如果你的Nginx服务器出现Access Denied我觉得90%的可能性是Nginx配置文件配置的有些小毛病,网上有些解决方案是修改php-fpm的配置文件中的security.limit_extensions,在这个参数中增加访问的文件扩展名,例如css、js等文件出现Access Denied错误时增加扩展名结果还真管用,其实这种方式不太可取,这些静态文件本不应该交给php-fpm解析,由此可以断定Nginx配置文件中配置的将所有的文件都交给php-fpm处理了。解决办法就是只让php文件交给php-fpm来解析,这样问题就解决了。配置方式如下:   location ~ \.php(.*)$ { #这里填写php-fpm相关参数 } 提醒:php字母前的.一定要用\转义,否则只要带php的路径或者文件名都会匹配到,造成一些异常.  
继续阅读 »
          如果你的Nginx服务器出现Access Denied我觉得90%的可能性是Nginx配置文件配置的有些小毛病,网上有些解决方案是修改php-fpm的配置文件中的security.limit_extensions,在这个参数中增加访问的文件扩展名,例如css、js等文件出现Access Denied错误时增加扩展名结果还真管用,其实这种方式不太可取,这些静态文件本不应该交给php-fpm解析,由此可以断定Nginx配置文件中配置的将所有的文件都交给php-fpm处理了。解决办法就是只让php文件交给php-fpm来解析,这样问题就解决了。配置方式如下:   location ~ \.php(.*)$ { #这里填写php-fpm相关参数 } 提醒:php字母前的.一定要用\转义,否则只要带php的路径或者文件名都会匹配到,造成一些异常.   收起阅读 »

原生php 实现微信自定义分享

  不依赖任何框架,原生php 实现微信自定义分享:   只需要两个文件:   index.php //模板文件jssdk.php   index.php (模板代码如下):   自行替换 appId 和 appSecret   <?php include_once 'jssdk.php'; $jssdk = new \JSSDK("appId", "appSecret"); $signPackage = $jssdk->GetSignPackage(); $appid = 'appId'; $timestamp = $signPackage['timestamp']; $nonceStr = $signPackage['nonceStr']; $signature = $signPackage['signature']; ?> <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <script> wx.config({ appId: '<?php echo $appid;?>', timestamp: '<?php echo $timestamp;?>', nonceStr: '<?php echo $nonceStr;?>', signature: '<?php echo $signature;?>', jsApiList: [ 'onMenuShareTimeline', 'onMenuShareAppMessage' ] }); wx.ready(function () { shareWeixin(); }); function shareWeixin(){ wx.onMenuShareTimeline({ title: '标题', link: '分享地址', imgUrl: '分享图片地址', success: function () { // 用户确认分享后执行的回调函数 //window.location.href=""; }, cancel: function () { // 用户取消分享后执行的回调函数 } }); wx.onMenuShareAppMessage({ title: '标题', desc: '简介', link: '分享地址', imgUrl: '分享图片地址', type: '', dataUrl: '', success: function () { // 用户确认分享后执行的回调函数 //window.location.href=""; }, cancel: function () { // 用户取消分享后执行的回调函数 } }); } </script> jssdk.php 代码如下:   <?php class JSSDK { private $appId; private $appSecret; public function __construct($appId, $appSecret) { $this->appId = $appId; $this->appSecret = $appSecret; } public function getSignPackage() { $jsapiTicket = $this->getJsApiTicket(); $url = "http://www.51ask.org/"; $timestamp = time(); $nonceStr = $this->createNonceStr(); // 这里参数的顺序要按照 key 值 ASCII 码升序排序 $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url"; $signature = sha1($string); $signPackage = array( "appId" => $this->appId, "nonceStr" => $nonceStr, "timestamp" => $timestamp, "url" => $url, "signature" => $signature, "rawString" => $string ); return $signPackage; } private function createNonceStr($length = 16) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $str = ""; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } private function getJsApiTicket() { // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例 $data = json_decode(file_get_contents("jsapi_ticket.json")); if ($data->expire_time < time()) { $accessToken = $this->getAccessToken(); $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken"; $res = json_decode($this->httpGet($url)); $ticket = $res->ticket; if ($ticket) { $data->expire_time = time() + 7000; $data->jsapi_ticket = $ticket; $fp = fopen("jsapi_ticket.json", "w"); fwrite($fp, json_encode($data)); fclose($fp); } } else { $ticket = $data->jsapi_ticket; } return $ticket; } private function getAccessToken() { // access_token 应该全局存储与更新,以下代码以写入到文件中做示例 $data = json_decode(file_get_contents("access_token.json")); if ($data->expire_time < time()) { $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret"; $res = json_decode($this->httpGet($url)); $access_token = $res->access_token; if ($access_token) { $data->expire_time = time() + 7000; $data->access_token = $access_token; $fp = fopen("access_token.json", "w"); fwrite($fp, json_encode($data)); fclose($fp); } } else { $access_token = $data->access_token; } return $access_token; } private function httpGet($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 500); curl_setopt($curl, CURLOPT_URL, $url); $res = curl_exec($curl); curl_close($curl); return $res; } }
继续阅读 »
  不依赖任何框架,原生php 实现微信自定义分享:   只需要两个文件:   index.php //模板文件jssdk.php   index.php (模板代码如下):   自行替换 appId 和 appSecret   <?php include_once 'jssdk.php'; $jssdk = new \JSSDK("appId", "appSecret"); $signPackage = $jssdk->GetSignPackage(); $appid = 'appId'; $timestamp = $signPackage['timestamp']; $nonceStr = $signPackage['nonceStr']; $signature = $signPackage['signature']; ?> <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <script> wx.config({ appId: '<?php echo $appid;?>', timestamp: '<?php echo $timestamp;?>', nonceStr: '<?php echo $nonceStr;?>', signature: '<?php echo $signature;?>', jsApiList: [ 'onMenuShareTimeline', 'onMenuShareAppMessage' ] }); wx.ready(function () { shareWeixin(); }); function shareWeixin(){ wx.onMenuShareTimeline({ title: '标题', link: '分享地址', imgUrl: '分享图片地址', success: function () { // 用户确认分享后执行的回调函数 //window.location.href=""; }, cancel: function () { // 用户取消分享后执行的回调函数 } }); wx.onMenuShareAppMessage({ title: '标题', desc: '简介', link: '分享地址', imgUrl: '分享图片地址', type: '', dataUrl: '', success: function () { // 用户确认分享后执行的回调函数 //window.location.href=""; }, cancel: function () { // 用户取消分享后执行的回调函数 } }); } </script> jssdk.php 代码如下:   <?php class JSSDK { private $appId; private $appSecret; public function __construct($appId, $appSecret) { $this->appId = $appId; $this->appSecret = $appSecret; } public function getSignPackage() { $jsapiTicket = $this->getJsApiTicket(); $url = "http://www.51ask.org/"; $timestamp = time(); $nonceStr = $this->createNonceStr(); // 这里参数的顺序要按照 key 值 ASCII 码升序排序 $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url"; $signature = sha1($string); $signPackage = array( "appId" => $this->appId, "nonceStr" => $nonceStr, "timestamp" => $timestamp, "url" => $url, "signature" => $signature, "rawString" => $string ); return $signPackage; } private function createNonceStr($length = 16) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $str = ""; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } private function getJsApiTicket() { // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例 $data = json_decode(file_get_contents("jsapi_ticket.json")); if ($data->expire_time < time()) { $accessToken = $this->getAccessToken(); $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken"; $res = json_decode($this->httpGet($url)); $ticket = $res->ticket; if ($ticket) { $data->expire_time = time() + 7000; $data->jsapi_ticket = $ticket; $fp = fopen("jsapi_ticket.json", "w"); fwrite($fp, json_encode($data)); fclose($fp); } } else { $ticket = $data->jsapi_ticket; } return $ticket; } private function getAccessToken() { // access_token 应该全局存储与更新,以下代码以写入到文件中做示例 $data = json_decode(file_get_contents("access_token.json")); if ($data->expire_time < time()) { $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret"; $res = json_decode($this->httpGet($url)); $access_token = $res->access_token; if ($access_token) { $data->expire_time = time() + 7000; $data->access_token = $access_token; $fp = fopen("access_token.json", "w"); fwrite($fp, json_encode($data)); fclose($fp); } } else { $access_token = $data->access_token; } return $access_token; } private function httpGet($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 500); curl_setopt($curl, CURLOPT_URL, $url); $res = curl_exec($curl); curl_close($curl); return $res; } } 收起阅读 »

原生php 实现微信授权登录

  不依赖任何框架,原生php 实现微信授权登录:   只需要两个文件:   index.phpweixin.class.php   index.php代码如下:   <?php session_start(); if($_SESSION['openid']){ exit('已经授权登录过了。。。'); } { include_once "weixin.class.php"; $wx_login = new Wxlogin(); $userinfo = $wx_login->getUserInfo(); if($userinfo['openid']){ $_SESSION['openid'] = $userinfo['openid']; var_dump($userinfo); } else { exit('授权失败'); } } weixin.clsss.php 代码如下(自行替换当中 app_id 和 app_key 和 授权回调地址):   <?php class Wxlogin{ //private $login_page_url = "https://open.weixin.qq.com/connect/qrconnect?";//微信登录界面 private $login_page_url = "https://open.weixin.qq.com/connect/oauth2/authorize?";//微信登录界面 private $get_accessToken_url = "https://api.weixin.qq.com/sns/oauth2/access_token?";//后去token的url //private $get_openId_url = 'https://graph.qq.com/oauth2.0/me';//获取openid的url private $get_user_info = "https://api.weixin.qq.com/sns/userinfo?";//获取用户信息的url private $app_id = ''; private $app_key = ''; public $redirect_url = ''; private $access_token; //QQ登录页面 private function get_wx_login_page() { $state = md5(rand(1,1000)); $query = [ 'appid' => $this->app_id, 'redirect_uri' => $this->redirect_url, 'response_type' => 'code', 'scope' => 'snsapi_userinfo', 'state' => $state, ]; $_SESSION['state'] = $state;//保存state验证 $url= $this->login_page_url.http_build_query($query).'#wechat_redirect'; header("Location:$url"); exit; } //获取access_token private function get_code() { //获取code @$code = $_GET['code']; if(!$code){ $this->get_wx_login_page(); } $state = $_GET['state']; /* if($state != $_SESSION['state']){ echo "state is wrong!"; exit; } */ $_SESSION['state'] = null; $query = [ 'grant_type' => 'authorization_code', 'code' => $code, 'secret' => $this->app_key, 'appid' => $this->app_id, ]; return $this->get_curl($this->get_accessToken_url, http_build_query($query)); } //获取token private function get_token_info() { //获取access_token /* { "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" } */ $data = json_decode($this->get_code(),true); //参数组装数组 $this->access_token = $data["access_token"]; $array = array( 'access_token' => $data["access_token"], 'openid' => $data['openid'], ); return $this->get_curl($this->get_user_info, http_build_query($array)); } //获取openid&&获取用户信息 public function getUserInfo() { $data = $this->get_token_info(); $data = json_decode($data, true); $data['access_token'] = $this->access_token; return $data; } //curl GET请求 private function get_curl($url,$query) { $url_request = $url.$query; $curl = curl_init(); //设置抓取的url curl_setopt($curl, CURLOPT_URL, $url_request); //设置头文件的信息作为数据流输出 curl_setopt($curl, CURLOPT_HEADER, 0); //设置获取的信息以文件流的形式返回,而不是直接输出. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //执行命令 $data = curl_exec($curl); //关闭URL请求 curl_close($curl); return $data; } }   以上,有问题留言回复。。      
继续阅读 »
  不依赖任何框架,原生php 实现微信授权登录:   只需要两个文件:   index.phpweixin.class.php   index.php代码如下:   <?php session_start(); if($_SESSION['openid']){ exit('已经授权登录过了。。。'); } { include_once "weixin.class.php"; $wx_login = new Wxlogin(); $userinfo = $wx_login->getUserInfo(); if($userinfo['openid']){ $_SESSION['openid'] = $userinfo['openid']; var_dump($userinfo); } else { exit('授权失败'); } } weixin.clsss.php 代码如下(自行替换当中 app_id 和 app_key 和 授权回调地址):   <?php class Wxlogin{ //private $login_page_url = "https://open.weixin.qq.com/connect/qrconnect?";//微信登录界面 private $login_page_url = "https://open.weixin.qq.com/connect/oauth2/authorize?";//微信登录界面 private $get_accessToken_url = "https://api.weixin.qq.com/sns/oauth2/access_token?";//后去token的url //private $get_openId_url = 'https://graph.qq.com/oauth2.0/me';//获取openid的url private $get_user_info = "https://api.weixin.qq.com/sns/userinfo?";//获取用户信息的url private $app_id = ''; private $app_key = ''; public $redirect_url = ''; private $access_token; //QQ登录页面 private function get_wx_login_page() { $state = md5(rand(1,1000)); $query = [ 'appid' => $this->app_id, 'redirect_uri' => $this->redirect_url, 'response_type' => 'code', 'scope' => 'snsapi_userinfo', 'state' => $state, ]; $_SESSION['state'] = $state;//保存state验证 $url= $this->login_page_url.http_build_query($query).'#wechat_redirect'; header("Location:$url"); exit; } //获取access_token private function get_code() { //获取code @$code = $_GET['code']; if(!$code){ $this->get_wx_login_page(); } $state = $_GET['state']; /* if($state != $_SESSION['state']){ echo "state is wrong!"; exit; } */ $_SESSION['state'] = null; $query = [ 'grant_type' => 'authorization_code', 'code' => $code, 'secret' => $this->app_key, 'appid' => $this->app_id, ]; return $this->get_curl($this->get_accessToken_url, http_build_query($query)); } //获取token private function get_token_info() { //获取access_token /* { "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" } */ $data = json_decode($this->get_code(),true); //参数组装数组 $this->access_token = $data["access_token"]; $array = array( 'access_token' => $data["access_token"], 'openid' => $data['openid'], ); return $this->get_curl($this->get_user_info, http_build_query($array)); } //获取openid&&获取用户信息 public function getUserInfo() { $data = $this->get_token_info(); $data = json_decode($data, true); $data['access_token'] = $this->access_token; return $data; } //curl GET请求 private function get_curl($url,$query) { $url_request = $url.$query; $curl = curl_init(); //设置抓取的url curl_setopt($curl, CURLOPT_URL, $url_request); //设置头文件的信息作为数据流输出 curl_setopt($curl, CURLOPT_HEADER, 0); //设置获取的信息以文件流的形式返回,而不是直接输出. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //执行命令 $data = curl_exec($curl); //关闭URL请求 curl_close($curl); return $data; } }   以上,有问题留言回复。。       收起阅读 »

php 合成图片(图片添加图片水印)

php
  效果图如下:   两张原图:     效果图如下:     附上源码:   <?php 原图为WechatIMG527.jpeg 水印图为logo.jpeg function watermark($filename,$water){ //获取背景图片的宽度和高度 list($b_w,$b_h) = getimagesize($filename); //获取水印图片的宽度和高度 list($w_w,$w_h) = getimagesize($water); //创建背景图片的资源 $back = imagecreatefromjpeg($filename); //创建水印图片的资源 $water = imagecreatefromjpeg($water); //使用imagecopy()函数将水印图片复制到背景图片指定的位置中 imagecopy($back, $water, $posX=331, $posY=42, 0, 0, $w_w, $w_h); //保存带有水印图片的背景图片 imagejpeg($back,$filename); imagedestroy($back); imagedestroy($water); } watermark("WechatIMG527.jpeg", "logo.jpeg"); ?>
继续阅读 »
  效果图如下:   两张原图:     效果图如下:     附上源码:   <?php 原图为WechatIMG527.jpeg 水印图为logo.jpeg function watermark($filename,$water){ //获取背景图片的宽度和高度 list($b_w,$b_h) = getimagesize($filename); //获取水印图片的宽度和高度 list($w_w,$w_h) = getimagesize($water); //创建背景图片的资源 $back = imagecreatefromjpeg($filename); //创建水印图片的资源 $water = imagecreatefromjpeg($water); //使用imagecopy()函数将水印图片复制到背景图片指定的位置中 imagecopy($back, $water, $posX=331, $posY=42, 0, 0, $w_w, $w_h); //保存带有水印图片的背景图片 imagejpeg($back,$filename); imagedestroy($back); imagedestroy($water); } watermark("WechatIMG527.jpeg", "logo.jpeg"); ?> 收起阅读 »

txt格式的sitemap转xml格式工具

  分析一个txt格式的sitemap转xml格式工具:   php 逐行读取txt   txt文件格式,每个url占一行。   如下图所示:     代码如下:   <?php $file = fopen("sitemap.txt", "r"); $fp = fopen('sitemap.xml', 'w'); $xml_str = '<?xml version="1.0" encoding="utf-8"?><urlset>'; $str = ''; while(! feof($file)) { //逐行读取txt中的url,拼接成xml的格式 $str .= '<url><loc>'.fgets($file).'</loc>'; $str .='<lastmod>'.date('Y-m-d',time()).'</lastmod>'; $str .='<changefreq>daily</changefreq>'; $str .='<priority>0.8</priority></url>'; } fclose($file); fwrite($fp, $xml_str.$str.'</urlset>'); fclose($fp); ?> 结果如下图所示:    
继续阅读 »
  分析一个txt格式的sitemap转xml格式工具:   php 逐行读取txt   txt文件格式,每个url占一行。   如下图所示:     代码如下:   <?php $file = fopen("sitemap.txt", "r"); $fp = fopen('sitemap.xml', 'w'); $xml_str = '<?xml version="1.0" encoding="utf-8"?><urlset>'; $str = ''; while(! feof($file)) { //逐行读取txt中的url,拼接成xml的格式 $str .= '<url><loc>'.fgets($file).'</loc>'; $str .='<lastmod>'.date('Y-m-d',time()).'</lastmod>'; $str .='<changefreq>daily</changefreq>'; $str .='<priority>0.8</priority></url>'; } fclose($file); fwrite($fp, $xml_str.$str.'</urlset>'); fclose($fp); ?> 结果如下图所示:     收起阅读 »