【框架简介】本框架主旨为API至上，顾名思义，一切以API为主，脱离原有MVC概念，正真的做为一个完全为服务器以及开发人员使用的PHP框架！框架开发由本站站长开发，框架之所有脱离原有MVC概念，是因为行业技术不断发展，M和V实际会造成开发人员繁琐的调整维护，目前前端环境多数由VUE主导，所以V的概念也就逐渐没落，而M的概念，本框架后续将会改变为额外拓展来加入到本框架，意在T概念（Tool工具），更好的维护以及更好的使用。本框架将会以C（控制器）概念来统筹API,所有的安全以及相关的功能模块都是围绕API来处理！【开发目的】开发目的如简介所言，脱离原有MVC概念，正真的做为一个完全为服务器以及开发人员使用的PHP框架！同时也为了更好的学习一些功能性的模块和更好的技术交流本框架目前还在开发中，后续会逐步开放文档以及文件下载，敬请期待！框架不作为商业用途！目前仅支持学习使用，开发人员以及本站站长有最终解释权！
使用mod_limitipconn模块限制IP并发连接数安装：wget http://dominia.org/djao/limit/mod_limitipconn-0.24.tar.bz2 tar jxvf mod_limitipconn-0.24.tar.bz2 cd mod_limitipconn-0.24 /usr/local/apache2/bin/apxs -c -i mod_limitipconn.c 其中 /usr/local/apache2/bin/apxs 这里必须是指定阿帕奇目录下的bin/apxs，这里需要看自己的服务器阿帕奇安装路径编辑httpd.confExtendedStatus On LoadModule limitipconn_module modules/mod_limitipconn.so #将路径修改为安装后的路径，保存时去掉以下代码的注释 #对应根目录 MaxConnPerIP 5 ＃最大并发数为5 NoIPLimit image/* ＃对图片不做限制 注意上面的配置复制进去之后，注释全部都要去掉，对应根目录是指自己的项目路径使用mod_bandwidth模块限制带宽mod_bandwidth可以对IP的并发数进行控制，也可以对下载流量进行控制，也可以对某个目录的流量进行控制。安装：wget http://bwmod.sourceforge.net/files/mod_bw-0.7.tgz tar zxvf mod_bw-0.7.tgz cd mod_bw /usr/local/apache2/bin/apxs -c -i mod_bw.c 其中 /usr/local/apache2/bin/apxs 这里必须是指定阿帕奇目录下的bin/apxs，这里需要看自己的服务器阿帕奇安装路径编辑httpd.confLoadModule bw_module modules/mod_bw.so ServerName vhost1.cszhi.com DocumentRoot /var/www/vhost1 BandwidthModule On ForceBandWidthModule On Bandwidth all 1024000 MinBandwidth all 50000 ＃每个客户端最高速度可达50KB LargeFileLimit * 500 50000 MaxConnection all 6 其它参数事例说明BandWidth localhost 0 #对localhost不限速 BandWidth 192.168.1.5 102400 #对192.168.1.5限速为100KB BandWidth “u:^Mozilla(.*)” 10240 #用mozilla时限速10KB BandWidth “u:wget” 102400 ＃如果用wget下载时限速10KB MinBandWidth all -1 ＃保证每个客户端最高速度可达10KB LargeFileLimit .jpg 100 10240 ＃jpg文件超过100KB，限速10KB ＃下面的510挺好，如果不设置，apache自己会报错，就根报404差不多，页面非常的丑 ErrorDocument 510 /exceed_speed.html BandWidthError 510 MaxConnection all 10 #所有ip最大连接数为10 MaxConnection 192.168.1.5 5 ＃192.168.1.5最大连接数为5 示例结果：上面功能主要用于限制，当项目存在多个php-fpm请求时需要做项目的限制处理
【技术解读】用php获取本周,上周,本月,上月,本季度日期的代码
PHP date函数参数详解time()在PHP中是得到一个数字,这个数字表示从1970-01-01到现在共走了多少秒,很奇怪吧不过这样方便计算,要找出前一天的时间就是 time()-606024;要找出前一年的时间就是 time()606024365那么如何把这个数字换成日期格式呢,就要用到date函数了$t=time();echo date("Y-m-d H:i:s",$t);第一个参数的格式分别表示:a - "am" 或是 "pm"A - "AM" 或是 "PM"d - 几日，二位数字，若不足二位则前面补零; 如: "01" 至 "31"D - 星期几，三个英文字母; 如: "Fri"F - 月份，英文全名; 如: "January"h - 12 小时制的小时; 如: "01" 至 "12"H - 24 小时制的小时; 如: "00" 至 "23"g - 12 小时制的小时，不足二位不补零; 如: "1" 至 12"G - 24 小时制的小时，不足二位不补零; 如: "0" 至 "23"i - 分钟; 如: "00" 至 "59"j - 几日，二位数字，若不足二位不补零; 如: "1" 至 "31"l - 星期几，英文全名; 如: "Friday"m - 月份，二位数字，若不足二位则在前面补零; 如: "01" 至 "12"n - 月份，二位数字，若不足二位则不补零; 如: "1" 至 "12"M - 月份，三个英文字母; 如: "Jan"s - 秒; 如: "00" 至 "59"S - 字尾加英文序数，二个英文字母; 如: "th"，"nd"t - 指定月份的天数; 如: "28" 至 "31"U - 总秒数w - 数字型的星期几，如: "0" (星期日) 至 "6" (星期六)Y - 年，四位数字; 如: "1999"y - 年，二位数字; 如: "99"z - 一年中的第几天; 如: "0" 至 "365"其它不在上列的字符则直接列出该字符下面是实际使用方式：<?php echo date("Ymd",strtotime("now")), "\n"; echo date("Ymd",strtotime("-1 week Monday")), "\n"; echo date("Ymd",strtotime("-1 week Sunday")), "\n"; echo date("Ymd",strtotime("+0 week Monday")), "\n"; echo date("Ymd",strtotime("+0 week Sunday")), "\n"; echo "*********第几个月:"; echo date('n'); echo "*********本周周几:"; echo date("w"); echo "*********本月天数:"; echo date("t"); echo "*********"; echo ' 上周起始时间: '; echo date("Y-m-d H:i:s",mktime(0, 0 , 0,date("m"),date("d")-date("w")+1-7,date("Y"))),"\n"; echo date("Y-m-d H:i:s",mktime(23,59,59,date("m"),date("d")-date("w")+7-7,date("Y"))),"\n"; echo ' 本周起始时间: '; echo date("Y-m-d H:i:s",mktime(0, 0 , 0,date("m"),date("d")-date("w")+1,date("Y"))),"\n"; echo date("Y-m-d H:i:s",mktime(23,59,59,date("m"),date("d")-date("w")+7,date("Y"))),"\n"; //从第几周找出该周的开始日期和结束日期 $dayNumber = date('W') * 7; $weekDayNumber = date("w", mktime(0, 0, 0, 1, $dayNumber, date("Y")));//当前周的第几天 $startNumber = $dayNumber - $weekDayNumber; echo date("Y-m-d", mktime(0, 0, 0, 1, $startNumber + 1, date("Y")));//开始日期 echo date("Y-m-d", mktime(0, 0, 0, 1, $startNumber + 7, date("Y")));//结束日期 echo ' 上月起始时间: '; echo date("Y-m-d H:i:s",mktime(0, 0 , 0,date("m")-1,1,date("Y"))),"\n"; echo date("Y-m-d H:i:s",mktime(23,59,59,date("m") ,0,date("Y"))),"\n"; echo ' 本月起始时间: '; echo date("Y-m-d H:i:s",mktime(0, 0 , 0,date("m"),1,date("Y"))),"\n"; echo date("Y-m-d H:i:s",mktime(23,59,59,date("m"),date("t"),date("Y"))),"\n"; $season = ceil((date('n'))/3);//当月是第几季度 echo ' 本季度起始时间: '; echo date('Y-m-d H:i:s', mktime(0, 0, 0,$season*3-3+1,1,date('Y'))),"\n"; echo date('Y-m-d H:i:s', mktime(23,59,59,$season*3,date('t',mktime(0, 0 , 0,$season*3,1,date("Y"))),date('Y'))),"\n"; $season = ceil((date('n'))/3)-1;//上季度是第几季度 echo ' 上季度起始时间: '; echo date('Y-m-d H:i:s', mktime(0, 0, 0,$season*3-3+1,1,date('Y'))),"\n"; echo date('Y-m-d H:i:s', mktime(23,59,59,$season*3,date('t',mktime(0, 0 , 0,$season*3,1,date("Y"))),date('Y'))),"\n"; ?> 输出结果
服务器php-fpm突然占用cpu和内存过高，原因是因为突然请求链接数变多，原因很多，建议检查一下代码或者项目上是否存在容易多次请求的地方解决办法如下：一、查看它的php-fpm.conf配置文件：从上面配置文件可以看出，默认的启动进程数是4个，最大的是6个，最小的是4个。二、查看linux平均负载：从上面可以看出，6个php-fpm进程占用的cpu空间都很高，平均负载（load average）情况如下：1分钟平均负载：2.32；5分钟平均负载：2.18；15分钟平均负载：3.95；可以说它现在的平均负载接近了它的cpu总核数：4；需要考虑服务器配置升级184 total ：184个总进程数4 running：4个正在运行的进程数143 sleeping：180个睡眠的进程数0 stoppe：0个停止的进程数0 zombie：0个冻结进程数三、更改 php-fpm.conf 配置文件 来做调优修改pm开头的配置，大内存服务器建议使用静态模式，配置低的建议使用动态模式
SQL注入：用户名：’ or 1 # 密码：随便写8位以上 验证码：写正确 概念如果用户在填写表单或者其他数据的时候，通过一些特殊的数据形式，对SQL的行为作出了非法的影响，就叫作SQL注入！基本原理正常执行的sql语句：select * from bg_admin where admin_name='zhouyang' and admin_pass=md5('12345678') 不正常执行的sql语句：select * from bg_admin where admin_name='' or 1 #' and admin_pass=md5('123654uiykgjfhdsav') 由于#在sql语句中是注释符，所以，上面的SQL语句真正执行的是select * from bg_admin where admin_name='' or 1 很显然，上面执行的结果就是where后面的条件永远为真！其实就相当于：select * from bg_admin 其实，在这里可以进行sql注入的“用户名”还有很多，比如：‘ or 1 or ‘select * from bg_admin where admin_name='' or 1 or '' and admin_pass=md5('ewsdfgbnvb') 如何防止注入：在业务逻辑上预防，比如要求用户名只能由特定的字符组成（比如数字字母下划线）（使用正则表达式）使用PHP函数addslashes（最常用）strip_tags(trim($data)是防止JS注入的protected function escapeData($data) { return addslashes(strip_tags(trim($data)));}使用MySQL提供的数据转义函数：mysql_real_escape_string($data,$link)；不过有一个前提是必须连接上数据库之后才可以使用！使用预处理技术，因为预处理是强制将sql语句的结构和数据部分分开！
1、字符串函数strlen：获取字符串长度，字节长度 substr_count 某字符串出现的次数 substr：字符串截取，获取字符串（按照字节进行截取） mb_strlenmb_substr strchr：与substr相似，从指定位置截取一直到最后 strrchr（获取文件后缀名）：与strchr一样，只是从右边开始查找字符 strtolower：所有的字符都小写（针对英文字母） strtoupper：所有的字符都大写 strrev：字符串反转（只能反转英文：英文存储只有一个字节），按照字节进行反转 strpos：从字符串中找对应字符出现的位置（数字下标），从最左边开始找 strrpos：与strpos一样，只是从字符串的右边开始找 trim：去掉函数两边的字符，默认是空格 str_split 函数把字符串分割到数组中。 chunk_split() 函数把字符串分割为一连串更小的部分 str_repeat("Shanghai",5);把字符串 "Shanghai " 重复 5 次 str_replace('\\', '/', dirname(__DIR__))); 替换 ucfirst 首字母大写 2、时间日期函数time：得到当前时间的时间戳（整型：从格林威治时间1970年1月1日0时0分0秒开始）秒数 date：时间序列化函数，将指定的时间戳转换成规定时间日期的显示格式（随意的字符串：有专业的格式符规定），如果没有指定时间戳，系统默认使用当前时间的时间戳 strtotime：时间日期格式的字符串转换成对应的时间戳（只要是正确的英语时间表达方式，都可以进行转换） microtime：微秒时间戳，根据不同的要求返回不同的结果 混合 microtime (布尔类型 )，可以返回一个浮点数的时间，也可以返回一个数组（时间戳和微秒数） 3、数学相关函数abs：绝对值 floor：向下取整 floor(3.2) 结果等于3 ceil：向上取整 round：四舍五入 rand：取得一个指定范围内的随机整数 mt_rand：取得一个指定范围内的随机整数（效率更高） min:PHP 会将非数值的 string 当成 0，但如果这个正是最小的数值则仍然会返回一个字符串。如果多个参数都求值为 0 且是最小值，min() 会返回按字母表顺序最小的字符串，如果其中没有字符串的话，则返回数值的 0; max:PHP 会将非数值的字符串当成 0，但如果这个正是最大的数值则仍然会返回一个字符串。如果多个参数都求值为 0 且是最大值，max() 会返回其中数值的 0，如果参数中没有数值的 0，则返回按字母表顺序最大的字符串。对于多个数组,max从左到右比较;如果同时出现数组和非数组参数总把数组作为最大值返回; 4、数组相关函数count() // 非数组返回1 key：获取当前数组当前指针所指向的元素的下标 current：获取的当前指针指向元素的数值 next：获取下一个元素的值，并且将指针下移 prev：获取上一个元素的值，并且将指针上移 end ：将指针移到数组的最后一个元素，并返回最终指针位置的值 reset：将指针移到数组的第一个元素，返回最终指针位置的值 array_keys：获取一个数组的所有键名，返回一个索引数组 array_values：获取一个数组的所有值，返回一个索引数组 explode：爆炸，将一个字符串按照某个指定的规则（通常是特殊字符），将数组分成多个段，每一段都当做一个数组的元素，返回一个索引数组 split 类似 explode explode('.', 'abc.txt')等于split('\.','abc.txt') implode：粘合，将一个数组内部的所有元素按照某个指定的规则（特殊字符），将所有的元素拼接成一个字符串 join() 把数组元素组合为一个字符串 array_merge：合并，指的是将两个数组中的元素进行累计。如果后面的数组与前面的数组有下标（键名：关联）相同的，那么后面的元素的值会覆盖前面的；如果是索引的相同下标，会自动的修改下标叠加到前面的数组里。 array_reverse — 返回反转后的数组 array_flip — 交换数组中的键和值 5、数据结构模拟函数array_shift：从数组的前面弹出元素，得到元素的值 array_pop：从数组的后面弹出元素，获得元素的值 array_unshift：从数组的前面压入元素，得到当前数组元素的个数 array_push：从数组的后面压入元素，得到当前数组元素的个数 6、判断变量is_bool：判断是否是布尔类型 is_float：判断浮点型 is_integer：判断整型 is_object：判断对象 is_array：判断数组 is_string：判断字符串 is_resource：判断资源 is_scalar：scalar是标量的，判断是基本数据类型：整型，浮点型，布尔型和字符串型 is_null 检测变量是否为NULL 是返回TRUE 否则返回false。1.被赋值为NULL;2.变量没被赋值;3.被unset() is_numeric：判断数字或者纯数字组成的字符串 gettype：获得数据类型 settype：改变数据类型 isset unset() 如果在函数中 unset() 一个全局变量，则只是局部变量被销毁，而在调用环境中的变量将保持调用 unset() 之前一样的值,如果在函数中 unset() 一个通过引用传递的变量，则只是局部变量被销毁，而在调用环境中的变量将保持调用 unset() 之前一样的值。empty//array(),"",0,"0",NULL,FALSE 都返回true 7、文件操作函数opendir(路径)：打开一个路径资源（将路径内部的所有数据读入到内存） readdir(路径资源)：从文件夹资源中读取当前资源指针所指向的文件的名字，指针会向下移动一位 closedir(资源)：释放对应的文件资源 scandir(路径)：读取一个路径内部的所有文件名，返回一个数组，数组的每一个元素都是文件名。 file_exists：判断一个文件是否存在（文件是广义：路径和文件） is_dir：判断一个指定路径是否存在（文件夹） is_file：判断一个指定路径是否是文件（文件） mkdir：创建一个路径，如果路径存在就会报错 rmdir：移除文件夹 file_get_contents：从一个指定的文件内读取数据内容。 file_put_contents：将指定的字符串写入到对应的文件 fopen：打开一个文件资源 fgetc：c代表character，一次读取一个字符 fgets：s代表string，代表可以读取多个字符，取决于指定的读取长度或者是否碰到换行（最多只能读取一行数据） 两个函数都是对当前资源指针进行操作，读取之后都会将指针下移 fread：获取指定长度的数据直到文件结束 fwrite：向文件资源指针所在的位置写入数据，写东西不会将当前位置已有的东西往后移，而是会覆盖 fseek：将指针指定到对应的位置 fclose：使用对应的文件资源 copy：复制 unlink：删除文件 rename：重命名文件 filemtime：m代表modify，文件最后被修改的时间 filesize：文件大小（字节） fileperms：文件权限（Linux下的八进制） 8、排序rsort() 函数用于对数组单元从高到低进行排序。 asort() 函数用于对数组单元从低到高进行排序并保持索引关系。 arsort() 函数用于对数组单元从高到低进行排序并保持索引关系。 ksort() 函数用于对数组单元按照键名从低到高进行排序。 krsort() 函数用于对数组单元按照键名从高到低进行排序。 9、报错error_reporting(E_ALL) ini_set('display_errors', 1) 10、常量define() 定义常量 defined() 检测常量是否定义 11、序列化serialize unserialize json_encode 对变量进行 JSON 编码 json_decode 对JSON 格式的字符串进行编码 12、编码base64_encode 本函数将字符串以 MIME BASE64 编码。在 BASE64 编码后的字符串只包含英文字母大小写、阿拉伯数字、加号与反斜线，共 64 个基本字符，不包含其它特殊的字符，因而才取名 BASE64。 base64_decode 解码