未来往事
我愿像茶一样,把苦涩留在心底,散发出来的都是清香。 [2017年 第50周/共52周]

PHP垃圾回收与内存管理基本原理

内存管理机制了解:

var_dump(memory_get_usage());//获取内存方法,加上true返回实际内存,不加则返回表现内存
$a = “http://fity.cn“;
var_dump(memory_get_usage());
unset($a);
var_dump(memory_get_usage());
输出:
int 368752
int 368920
int 368752

可以直观的看出定义变量之后,内存增加,清除变量之后,内存恢复(有些可能不会恢复和以前一样),好像定义变量时申请了一次内存,其实不是这样的,php会预先申请一块内存,不会每次定义变量就申请内存。PHP不像C语言那样,只有你显示的调用内存分配相关API才会有内存的分配。也就是说, 在PHP中,有很多我们看不到的内存分配过程。隐式的内存分配点就有:
1.为变量名分配内存,存入符号表
2.为变量值分配内存
所以, 不能只看表象。别怀疑,PHP的unset确实会释放内存,但这个释放不是C编程意义上的释放,不是交回给OS。当我们调用内存分配相关API申请内存的时候,PHP并不是简单的向OS要内存,而是会像OS要一个大块的内存,然后把其中的一块分配给申请者,这样当再有逻辑来申请内存的时候,就不再需要向OS申请内存了, 避免了频繁的系统调用。详细推荐参考《深入理解PHP内存管理之谁动了我的内存

垃圾回收机制(Garbage Collector 简称GC):
+阅读全文

php imagecreatefromjpeg return bool(false)

错误描述:
imagecreatefromjpeg返回bool(false)
imagecreatefromjpeg():xxx.jpg is not a valid JPEG file
imagecreatefromjpeg(): gd-jpeg: JPEG library reports unrecoverable error

PHP载入图像的函数:
imagecreatefromgif()
imagecreatefromjpeg()
imagecreatefrompng()
imagecreatefromwbmp()
imagecreatefromstring()
作用:由文件或URL或字符串中的图像流创建一个新图象,成功后返回图象资源,失败后返回FALSE。
PS:简单的理解其作用就是将要进行分割的图片临时读到内存里面。

错误注释:
错误信息翻译:图片不是一个有效的jpeg文件

......
+阅读全文

php生成多级目录函数

php生成多级目录的方法函数.
  1. function mkdirs($dir){   
  2.   return is_dir($diror (mkdirs(dirname($dir)) and mkdir($dir,0777));   
  3. }  
函数说明:
(1)函数:bool is_dir ( string $filename )
功能:判断给定文件名是否是一个目录,如果文件名存在并且为目录则返回 TRUE。如果 filename 是一个相对路径,则按照当前工作目录检查其相对路径。
注: 本函数的结果会被缓存。更多信息参见 clearstatcache()。

(2)函数:dirname(path)
+阅读全文

php分卷备份恢复mysql数据库

本文主要阐述在大数据量下通过php程序分卷备份恢复mysql数据库的方法,代码已合并为一个文件,即为php页面版MySQL大数据库分卷备份恢复工具。由于时间关系,代码未做整理,结构相对混乱,如果你在该结构基础上做了整理也欢迎你反馈给我~~~

工具实现功能:
1.支持MySQL数据库按指定大小分卷备份和恢复;
2.支持单文件备份及下载
3.分卷备份存储在服务器端,可以直接上传导入

操作过程截图:
输入mysql链接配置信息
点击在新窗口中浏览此图片
当前权限链接下的数据库表信息
点击在新窗口中浏览此图片
选择导出备份方式
点击在新窗口中浏览此图片
导出备份选项
+阅读全文

php判断是否移动设备

php判断是否移动手机设备函数,php判断手机访问函数.

相对精准的判断方式:
  1. function is_Mobile_Device(){  
  2.  //获取ALL_HTTP全部的http信息  
  3.     $_SERVER['ALL_HTTP'] = isset($_SERVER['ALL_HTTP']) ? $_SERVER['ALL_HTTP'] : '';  
  4.     $mobile_browser = '0';  
  5.     if(preg_match('/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone|iphone|ipad|ipod|android|xoom)/i'strtolower($_SERVER['HTTP_USER_AGENT'])))  
  6.         $mobile_browser++;  
  7.     if((isset($_SERVER['HTTP_ACCEPT'])) and (strpos(strtolower($_SERVER['HTTP_ACCEPT']),'application/vnd.wap.xhtml+xml') !== false))  
  8.         $mobile_browser++;  
  9.     if(isset($_SERVER['HTTP_X_WAP_PROFILE']))  
  10.         $mobile_browser++;  
  11.     if(isset($_SERVER['HTTP_PROFILE']))  
  12.         $mobile_browser++;  
  13.   
  14.     $mobile_ua = strtolower(substr($_SERVER['HTTP_USER_AGENT'],0,4));  
  15.     $mobile_agents = array(  
  16.         'w3c ','acs-','alav','alca','amoi','audi','avan','benq','bird','blac',  
  17.         'blaz','brew','cell','cldc','cmd-','dang','doco','eric','hipt','inno',  
  18.         'ipaq','java','jigs','kddi','keji','leno','lg-c','lg-d','lg-g','lge-',  
  19.         'maui','maxo','midp','mits','mmef','mobi','mot-','moto','mwbp','nec-',  
  20.         'newt','noki','oper','palm','pana','pant','phil','play','port','prox',  
  21.         'qwap','sage','sams','sany','sch-','sec-','send','seri','sgh-','shar',  
  22.         'sie-','siem','smal','smar','sony','sph-','symb','t-mo','teli','tim-',  
  23.         'tosh','tsm-','upg1','upsi','vk-v','voda','wap-','wapa','wapi','wapp',  
  24.         'wapr','webc','winw','winw','xda','xda-'  
  25.     );  
  26.   
  27.     if(in_array($mobile_ua$mobile_agents))  
  28.         $mobile_browser++;  
  29.     if(strpos(strtolower($_SERVER['ALL_HTTP']), 'operamini') !== false)  
  30.         $mobile_browser++;  
  31.     if(strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'windows') !== false)  
  32.         $mobile_browser=0;  
  33.     if(strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'windows phone') !== false)  
  34.         $mobile_browser++;  
  35.     if($mobile_browser>0)  
  36.         return true;  
  37.     else  
  38.         return false;  
  39. }  

简单通过user-agent方式判断
+阅读全文

curl file_get_contents post方式获取数据

curl post,file_get_contents post,curl file_get_contents post请求数据

在PHP中cURL、file_get_contents函数均可以获取远程链接的数据,但是file_get_contents的可控制性不太好,对于各种复杂情况的数据采集情景,file_get_contents显得有点无能为力,cURL在数据采集情景复杂的环境下略显优势。cURL函数的curl_setopt里面还有很多参数,读者可以抽空整体看一遍,虽然平时未必用得上,但是至少做到心里有底,知道都有哪些参数,必要时还能找出来使用。本文仅粗略介绍了file_get_contents函数和cURL函数的基本使用:

curl post方式获取数据
  1. //调用示例  
  2. $post_data = array ("category" => "9");  
  3. echo postCurl('http://fity.cn/category.php',$post_data);  
  4.   
  5. //CURL函数--POST方式请求资源  
  6. function postCurl($api_url$post_data){  
  7.     $ch = curl_init(); // 初始化CURL句柄  
  8.     curl_setopt($ch, CURLOPT_URL, $api_url); // 设置访问的url地址  
  9.     curl_setopt($ch, CURLOPT_TIMEOUT, 35); // 设置超时  
  10.     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); // 等待的时间,如果设置为0,则不等待  
  11.     curl_setopt($ch, CURLOPT_HEADER, false); // 设定是否输出页面内容  
  12.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设定是否显示头信息  
  13.     curl_setopt($ch, CURLOPT_POST, true);  // post数据  
  14.     curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);// post的变量  
  15.     curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"); // 模拟浏览器头信息  
  16.     curl_setopt($ch, CURLOPT_REFERER, "http://www.x.com"); // 伪造来源地址  
  17.     $data = curl_exec($ch);  
  18.     curl_close($ch);  
  19.   if ($data) {  
  20.     return $data;  
  21.   } else {  
  22.     return false;  
  23.   }  
  24. }  

file_get_contents post方式获取数据
+阅读全文

php获取自然周_php获取自然周开始结束日期

php获取当前自然周,php获取当前为第几周,php获取自然周开始结束日期时间,php date()函数

示例:
echo getTotalWeek(); //输出当前年份全年共有多少自然周
echo getWeekNum(); //输出当前为本年的第几周
echo getWeekNum('2016-7-31');  //输出2016年7月31日为本年的第几周
print_r(getWeekDate(2016,32)); //输出2016年第32周的起止日期

PHP根据年份获取全年共多少自然周、PHP获取一年共有多少自然周(考虑闰年)
  1. /** 
  2. * 获得当前年有多少个自然周 
  3. * @param year 年份,不传参默认为当前年份,格式2016 
  4. * @author 未来往事<http://fity.cn> 
  5. * @return 总共的周数 
  6. * @return string 
  7. */  
  8. function getTotalWeek($year = '') {  
  9.   $year = ($year) ? $year : date('Y');  
  10.   $week = 0;  
  11.   $days = 365;  
  12.   //if ($year % 400 == 0 || ($year % 4 == 0 && $year % 100 != 0)){//判断是否闰年,闰年366天。最后修改2016.8.4 By未来往事<http://fity.cn>  
  13.   if (date('L') == 1){//判断是否闰年,闰年366天  
  14.     $days = 366;  
  15.   }  
  16.   //得到一年所有天数然后除以7  
  17.   $week = $days / 7;//得到多少周  
  18.   return floor($week);  
  19. }  
  20. 欢迎来访未来往事博客http://fity.cn  

PHP根据日期时间获取为当前的第几周、PHP获取当前是一年的第几周
  1.   /**  
  2.      * 获取某一年或当前日期自然周 
  3.      * @param int $date 日期时间,不传参默认为当前时间,格式2016-8-3 
  4.      * @author 未来往事<http://fity.cn> 
  5.      * @return string 
  6.      */   
  7.   function getWeekNum($date = ''){  
  8.     $datearr = ($date) ? getdate(strtotime($date)) : getdate();  
  9.     $year = strtotime($datearr['year'].'-1-1');  
  10.     $startdate = getdate($year);  
  11.     $firstweekday = 7-$startdate['wday'];//获得第一周几天  
  12.     //今年的第几天  
  13.     //$yday = $datearr['yday']+1-$firstweekday;//以周日开始计算  
  14.     $yday = $datearr['yday']-$firstweekday;//以周一开始计算  
  15.     return ceil($yday/7)+1;//取到第几周  
  16.   }  
  17. //欢迎来访未来往事博客http://fity.cn  

PHP根据日期时间及第几周获取开始日期和结束日期、PHP获取自然周的开始日期和结束日期
+阅读全文

composer安装配置

安装配置PHP环境(系统环境变量设置等-windows)

注意这点很重要。可以使用命令php -v查看PHP是否正确安装。

下载 Composer

打开命令行并依次执行下列命令安装最新版本的 Composer:

  1. php -
......
+阅读全文

PHP网站安全性浅谈

PHP网站安全性浅谈

一、web应用服务安全性设置

1、服务器各应用服务尽可能以独立用户运行,如:
 WEB服务运行帐户为www
 MySQL服务运行帐户为mysql
 Memcached用户为memcache
 Redis运行帐户为redis

2、应用服务目录的读写权限最小颗粒化
(a)缓存目录:
一般需要755/777权限,但是多数情况下缓存目录无须提供给用户访问,可以通过nginx拒绝。如:
location ~ "^/cache" {
  return 403;
}
(b)附件目录:
一般也需要755/777等写入权限,建议附件和程序分离,附件不做PHP配置解析(这点能做到最好)。
如果上面做不到,那么建议你尽可能不去解析附件目录的PHP。如:
location ~* ^/upload/.*.(php|php5)($|/){
    deny all;
}

location ~* .*\.php($|/){
      if ($request_filename ~* (.*)\.php) {
            set $php_url $1;
      }
      if (!-e $php_url.php) {
            return 403;
      }

      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      include fcgi.conf;
}
PS:
+阅读全文

PHP高质量不失真等比例图片缩放类

php图片缩放类,php不失真图片缩放类,php高质量缩略图,php缩略图函数,php无损缩放,php图片缩放后模糊解决,图片缩略图质量低解决方法。在PHP网站开发过程中,如果你建立的网站涉及大量的图片处理,必然涉及到图片上传、缩放,而如何保持图片不失真,是很多初级PHP网站开发者比较头疼的一件事,今天未来往事<http://fity.cn>就和大家分享一下如何进行等比例不失真图片缩放。

首先我们来了解几个php函数:
imagepng()http://cn2.php.net/manual/en/function.imagepng.php
注:函数的第三个参数的数值区间控制图片的质量,与imagejpeg()函数不同,imagepng()函数的区间值是0-9 (0表示质量最高,9表示质量最低)。PHP 5.1.2+支持。
imagegif()http://cn2.php.net/manual/en/function.imagegif.php
imagejpeg()http://cn2.php.net/manual/en/function.imagejpeg.php
注:函数的第三个参数控制图片的质量,区间0-100 (0表示质量最低,100表示质量最高. 默认75)

附类代码:
+阅读全文

php-fpm配置文件重要参数详解 配置参考指南

php-fpm.conf配置文件重要参数说明注释,希望对您有所帮助。
[global]
pid = /usr/local/php/var/run/php-fpm.pid
#pid设定,默认在安装目录中的var/run/php-fpm.pid,建议开启

error_log = /usr/local/php/var/log/php-fpm.log
#错误日志,默认在安装目录中的var/log/php-fpm.log

log_level = notice
#错误级别. 可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notice(一般重要信息), debug(调试信息). 默认: notice.
  
emergency_restart_threshold = 60
emergency_restart_interval = 60s
......
+阅读全文

php代码执行时间记录

php记录代码执行时间 php记录代码执行耗时
  1. $startTime = microtime(true); //开始时间,true 参数 返回浮点类型  
  2.   
  3. $endTime = microtime(true); //结束时间,true 参数 返回浮点类型  
  4. &nbs
......
+阅读全文

获取IP地址及对应城市函数 PHP

PHP获取IP地址及城市名函数
  1. //推荐方法: 更新于2016-11-23  
  2. public function getIp(){  
  3.     $unknown = 'unknown';  
  4. &nb
......
+阅读全文

PHP人民币大小写转换类(MoneyConvertor_CLS)

人民币大小写转换类 PHP:
  1. /**  
  2.  * MoneyConvertor Library For PHP 
  3.  * 人民币大小写转换类 
  4.  * --------------------------------------------------- 
  5.  * @site  http://fity.cn/post/534/ 
  6.  * @describe   对人民币进行大小写转换的类,该方法可以完美转换任何形式小写货币格式为人民币大写 
  7.  */  
  8.   
  9. final class MoneyConvertor {  
  10.     
  11.   //大写数字  
  12.   private $NUMBER_STR = array(  
  13.     "零","壹","贰","叁","肆","伍","陆","柒","捌","玖"  
  14.   );  
  15.     
  16.   //整数位货币单位  
  17.   private $I_UNIT_STR = array(  
  18.     "元","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟"  
  19.   );  
  20.     
  21.   //小数位货币单位  
  22.   private $D_UNIT_STR = array(  
  23.     "角","分","厘"  
  24.   );  
  25.     
  26.   //转换结果  
  27.   private $resultString = null;  
  28.   
  29.   /** 
  30.    * 使用一个小写数字金额的字符串来转换resultString对象 
  31.    * --------------------------------------------------- 
  32.    * @param  $numberStr    将要转换的小写数字金额 
  33.    * @return   $this->resultString 
  34.    */  
  35.   
  36.   public function convert($numberStr) {  
  37.       
  38.     //处理小数位为0  
  39.     if(preg_match('/^[0-9]+\.[0]+$/',$numberStr))  
  40.       $numberStr = intval($numberStr);  
  41.       
  42.     //补齐类似.5这样的无整数位数字  
  43.     if(substr($numberStr, 0, 1) == '.')  
  44.       number_format($numberStr);  
  45.       
  46.     //如果带逗号分隔符的数字  
  47.     if(strpos($numberStr','))  
  48.       $numberStr = str_replace(",","",$numberStr);  
  49.       
  50.     //判断是否为数字  
  51.     if (!is_numeric($numberStr))  
  52.       return '不是有效的货币数值';  
  53.       
  54.     //执行转换  
  55.     self::convertor($numberStr);  
  56.       
  57.     //返回转换结果  
  58.     return $this->resultString;  
  59.   }  
  60.     
  61.     
  62.   /** 
  63.    * 执行转换 
  64.    * --------------------------------------------------- 
  65.    * @param  $numberStr    将要转换的小写数字金额 
  66.    * @return   void 
  67.    */  
  68.   private function convertor($numberStr){  
  69.     //分差整数与浮点位,整数和小数部分分开,分别进行转换  
  70.     $cutedNumber = explode('.', (string)$numberStr);  
  71.   
  72.     //如果只有整数部分  
  73.     if (count($cutedNumber) == 1) {  
  74.       self::convertInteger($numberStr, TRUE);  
  75.     } else {  
  76.       self::convertInteger($cutedNumber[0]);  
  77.       self::convertDecimal($cutedNumber[1]);  
  78.     }  
  79.   
  80.     //去除无用零字符  
  81.     self::removeZero();  
  82.   }  
  83.     
  84.   /** 
  85.    * 对整数部分进行转换 
  86.    * ------------------------------------------------------------------ 
  87.    * @param  $integer        将要转换的小写数字整数部分 
  88.    * @param  $without_fractional    是否原数不带浮点数,即在最后显示“整” 
  89.    * 
  90.    * @return   $this 
  91.    */  
  92.   private function convertInteger($integer$without_fractional = false) {  
  93.     $resultString = null;  
  94.         
  95.     for ($i = 0; $i < strlen($integer); $i++) {  
  96.       $resultString .= $this->I_UNIT_STR[$i];  
  97.       $resultString .= $this->NUMBER_STR[substr(strrev($integer), $i, 1)];  
  98.     }  
  99.     //如果没有小数位  
  100.     $tidy = $without_fractional == false ? '' : '整';  
  101.     $this->resultString = self::str_reverse($resultString) . $tidy;  
  102.   
  103.     return $this;  
  104.   }  
  105.   
  106.   /** 
  107.    * 对小数点后三位部分进行转换 
  108.    * ------------------------------------------------------------------ 
  109.    * @param  $integer        将要转换的小数点后三位部分 
  110.    * @return   $this 
  111.    */  
  112.   private function convertDecimal($decimal) {  
  113.       
  114.     $resultString = null;  
  115.       
  116.     for ($i = 0; $i < strlen($decimal); $i++) {  
  117.       $resultString .= $this->NUMBER_STR[substr($decimal$i, 1)];  
  118.       $resultString .= $this->D_UNIT_STR[$i];  
  119.     }  
  120.     $this->resultString .= $resultString;  
  121.   
  122.     return $this;  
  123.   }  
  124.   
  125.   /** 
  126.    * 去掉多余的"零X" 
  127.    * ------------------------------------------------------------------ 
  128.    * @return   $this 
  129.    */  
  130.   private function removeZero() {  
  131.     while (strpos($this->resultString, "零拾") || strpos($this->resultString, "零佰") || strpos($this->resultString, "零仟") || strpos($this->resultString, "零万") || strpos($this->resultString, "零亿") || strpos($this->resultString, "零角") || strpos($this->resultString, "零分") || strpos($this->resultString, "零厘") || strpos($this->resultString, "零零") || strpos($this->resultString, "亿万") || strpos($this->resultString, "零元")) {  
  132.       $this->resultString = str_replace("零拾""零"$this->resultString);  
  133.       $this->resultString = str_replace("零佰""零"$this->resultString);  
  134.       $this->resultString = str_replace("零仟""零"$this->resultString);  
  135.       $this->resultString = str_replace("零万""万"$this->resultString);  
  136.       $this->resultString = str_replace("零亿""亿"$this->resultString);  
  137.       $this->resultString = str_replace("零角""零"$this->resultString);  
  138.       $this->resultString = str_replace("零分""零"$this->resultString);  
  139.       $this->resultString = str_replace("零厘""零"$this->resultString);  
  140.       $this->resultString = str_replace("零零""零"$this->resultString);  
  141.       $this->resultString = str_replace("亿万""亿"$this->resultString);  
  142.       $this->resultString = str_replace("零元""元"$this->resultString);  
  143.     }  
  144.   
  145.     return $this;  
  146.   }  
  147.   
  148.   /** 
  149.    * 中文UTF-8字符串反转 
  150.    * ------------------------------------------------------------------ 
  151.    * @param   $str  需要转换的UTF-8字符串 
  152.    * @return   void 
  153.    */  
  154.   function str_reverse($str) {  
  155.     //判断输入的是不是utf8类型的字符,否则退出  
  156.     if (!is_string($str) || !mb_check_encoding($str'UTF-8')) {  
  157.       return;  
  158.     }  
  159.     $array = array();  
  160.     //将字符串存入数组  
  161.     $l = mb_strlen($str'UTF-8');  
  162.     for ($i = 0; $i < $l$i++) {  
  163.       $array[] = mb_substr($str$i, 1, 'UTF-8');  
  164.     }  
  165.     //反转字符串  
  166.     krsort($array);  
  167.     //拼接字符串  
  168.     $string = implode($array);  
  169.     return $string;  
  170.   }  
  171.   
  172. }  

使用方法:
+阅读全文

php模拟get提交数据请求

本文介绍几种php模拟发送get请求方法

file_get_contents 模拟发送 get 请求


  1. $sourceUrl='http://fity.cn/action/id/1';  
  2. $res=file_get_contents($sourceUrl);  
......
+阅读全文