MVC由Model(模型), View(视图)和Controller(控制器)组成,PHP MVC可以更高效地管理好3个不同层的PHP代码。
GD库提供了一系列用来处理图片的功能,使用GD库可以处理图片,或者生成图片。在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据生成报表。
echo date(‘Y-m-d H:i:s’, strtotime(‘-1 days’));
答:确认服务器硬件是否足够支持当前的流量,数据库读写分离,优化数据表,程序功能规则,禁止外部的盗链,控制大文件的下载,使用不同主机分流主要流量。
__construct() | 类的构造函数 |
---|---|
__destruct() | 类的析构函数 |
__construct() | 类的构造函数 |
__call() | 在对象中调用一个不可访问方法时调用 |
__callStatic() | 用静态方式中调用一个不可访问方法时调用 |
__get() | 获得一个类的成员变量时调用 |
__set() | 设置一个类的成员变量时调用 |
__isset() | 当对不可访问属性调用isset()或empty()时调用 |
__unset() | 当对不可访问属性调用unset()时被调用 |
__sleep() | 执行serialize()时,先会调用这个函数 |
__wakeup() | 执行unserialize()时,先会调用这个函数 |
__toString() | 类被当成字符串时的回应方法 |
__invoke() | 调用函数的方式调用一个对象时的回应方法 |
__set_state() | 调用var_export()导出类时,此静态方法会被调用 |
__clone() | 当对象复制完成时调用 |
__autoload() | 尝试加载未定义的类 |
__debugInfo() | 打印所需调试信息 |
PHP 命名空间(namespace)是在PHP 5.3中加的.PHP 命名空间可以解决以下两类问题:
REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。
Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。
在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用 URI (Universal Resource Identifier) 得到一个唯一的地址。所有资源都共享统一的接口,以便在客户端和服务器之间传输状态。使用的是标准的 HTTP 方法,比如 GET、PUT、POST 和 DELETE。Hypermedia 是应用程序状态的引擎,资源表示通过超链接互联。
用框架写接口,普通POST,GET接口,有时候用RESTFUL接口。写控制器从模型调用数据,返回XML或者JSON数据就行了。
APP接口主要解决两个问题,一个SESSION问题,一个是TOKEN问题。客户端第一次请求,服务端生成SESSION_ID,返回给客户端。之和的请求中,客户端把SESSION_ID传给服务端,服务端用SESSION_ID函数可以确保多次请求用的同一个SESSION。TOKEN需要加密和服务端验证。
1、数据缓存——普遍的一种缓存技术
非常直观的字面意思,就是把数据先存放好,减少对数据库的访问。第一次访问时,把要用到的数据保存到一个文件里,然后用户再次访问页面时,就先检测要查询的数据是否在缓存文件里,若存在,则直接取出,不需再次访问数据库。
一般这些数据以数组的形式保存。
2、页面缓存
和数据缓存差不多,每次访问页面时,就检测相应的页面缓存是否存在,若不存在,则查询数据库得到相应的数据,同时生成缓存页面,这样,在下次访问就可以直接取出缓存页面,不必再次查询数据库。
3、内存缓存
不作过多分析,一般熟借助第三方软件进行优化,比如Memcached、Redis。
以上方法能够解决频繁访问数据库的问题,但是缺乏时效性,在数据库改变后,他们默认的数据还是修改之前的。所以就要在规定时间内清除缓存,以更新数 据。比如在每次更新缓存后设定一个时间戳t1,当前的时间戳t2,规定缓存时间为T,那么,在t1与t2相差在T之内时,就不更新缓存,否则,超过了T, 就重新查询数据库,清除之前的缓存,又得到一个新的时间戳,依次循环下去。
Smarty是很老的技术了。常用的框架如ThinkPHP,Yii都自带模板引擎。最常用的方法是3个:assign赋值,display显示页面,fetch获取页面内容而非显示。
操作符+,在前一个数的基础上插入后一个数组,如果有相同的抛弃,而array_merge 是在前一个参数基础上插入后一个参数,如果有相同用的key 用后一个覆盖。
单例模式 |
---|
简单工厂模式 |
策略模式 |
观察者模式 |
注册(树)模式 |
迭代模式 |
单例模式,简单工厂模式,策略模式,观察者模式,注册(树)模式,迭代模式。
可以使用检测(try)、抛出(throw)和捕获(catch)异常。即使用try检测有没有抛出(throw)异常,若有异常抛出(throw),使用catch捕获异常。一个 try 至少要有一个与之对应的 catch。定义多个 catch 可以捕获不同的对象。PHP 会按这些 catch 被定义的顺序执行,直到完成最后一个为止。而在这些 catch 内,又可以抛出新的异常。
php 5.3之前使用的垃圾回收机制是单纯的“引用计数”,也就是每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器 1;当变量引用撤掉后,计数器-1;当计数器=0时,表明内存对象没有被使用,该内存对象则进行销毁,垃圾回收完成。
“引用计数”存在问题,就是当两个或多个对象互相引用形成环状后,内存对象的计数器则不会消减为0;这时候,这一组内存对象已经没用了,但是不能回收,从而导致内存泄露;
php5.3开始,使用了新的垃圾回收机制,在引用计数基础上,实现了一种复杂的算法,来检测内存对象中引用环的存在,以避免内存泄露。
safe_mode,PHP安全模式,它提供一个基本安全的共享环境,在一个有多个用户账户存在的php开发的web服务器上。当安全模式打开的时候,一些函数将被完全的禁止,而另一些函数的功能将会受到限制,如:chdir,move_uploaded_file,chgrp,parse_ini_file,chown,rmdir,copy,rename,fopen,require,mkdir,unlink等。
注意,在php5.3以上版本,safe_mode被弃用,在php5.4以上版本,则将此特性完全去除了。
file_get_contents或者curl
核心思路:加锁
$fp = fopen("lock.txt","w+");
if (flock($fp,LOCK_EX)) {
//获得写锁,写数据
fwrite($fp, "write something");
// 解除锁定
flock($fp, LOCK_UN);
} else {
echo "file is locking...";
}
fclose($fp);
?>
function my_scandir($dir){
$files = array();
if(is_dir($dir)){
if ($handle = opendir($dir)) {
while (($flie = readdir($handle))!== false) {
if ($flie!="." && $file!="..") {
if (is_dir($dir."/".$file)) {
$files[$file] = my_scandir($dir."/".$file);
} else {
$files[] = $dir."/".$file;
}
}
}
closedir($handle);
return $files;
}
}
}
?>
方法一:php函数跳转,
缺点:header头之前不能有输出,跳转后的程序继续执行,可用exit中断执行后面的程序。
方法二:利用meta
过滤JavaScript脚本参考:
header("content-type:text/html;charset=utf-8");
$script = "以下内容不显示:";
$pattern = '//si';
echo preg_replace($pattern, "脚本内容", $script);//以下内容不显示:脚本内容
?>
22. 请写一个函数验证电子邮件的格式是否正确(要求使用正则)
preg_match('/^[\w\-\.]+@[\w\-]+(\.\w+)+$/',$email);
首先进入php安装目录
php -f d:/wamp/www/1.php 其中-f参数指定要执行的php文件
php -r phpinfo(); 其中-r表示直接执行php代码,无需写开始结束标记
使用key()可以获得数组中当前元素的键名,使用current()则可以返回当前元素的值。
使用array_keys()则可以得到数组中所有的键名。使用foreach结构foreach($arr as key=>value)可以通过key和value分别获取键名和值。
urlencode
常用扩展名 |
---|
mb_sring |
iconv |
curl |
GD |
XML |
socket |
MySQL |
PDO |
<IfModulemod_rewrite.c>
RewriteEngineon
RewriteCond%{REQUEST_FILENAME}!-f
RewriteCond%{REQUEST_FILENAME}!-d
RewriteBase/
RewriteRule./index.php[L]
</IfModule>
如果REQUEST_FILENAME文件存在,就直接访问文件,不进行下面的rewrite规则,
如果REQUEST_FILENAME目录存在,就直接访问目录,不进行下面的rewrite规则,
RewriteRule./index.php[L]的意思是把所有的请求都给index.php处理。
一般是在header、set_cookie以及session_start函数前面有输出(包括空格)的情况下,会报该警告信息
对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。
基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收。角色与角色的关系可以建立起来以囊括更广泛的客观情况。
addslashes() | 是强行加\ |
mysql_real_escape_string() | 会判断字符集,但是对PHP版本有要求 |
mysql_escape_string | 不考虑连接的当前字符集 |
转义引号。 | |
要完成一次CSRF攻击,受害者必须依次完成两个步骤:
1.登录受信任网站A,并在本地生成Cookie。
2.在不登出A的情况下,访问危险网站B。
服务端进行CSRF防御
1.Cookie Hashing(所有表单都包含同一个伪随机值)。因为攻击者不能获得第三方的Cookie(理论上),所以表单中的数据也就构造失败了
2.验证码。每次的用户提交都需要用户在表单中填写一个图片上的随机字符串。
3.One-Time Tokens(不同的表单包含一个不同的伪随机值)
主要是通过伪静态来实现单一入口,mvc框架都是这样。将所有请求通过apache伪静态解析转给某个指定文件,然后通过php的$_SERVER[]这个全局变量来去的请求的路径字符串,对其进行解析再分配给指定的类去处理,基本就是这样。
最简单的方法是建立一个.htaccess文件。文件内容贴给你
<IfModule !mod_rewrite.c>
ErrorDocument 500 'mod_rewrite must be enabled'
</IfModule>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php
将这个文件放在根目录下即可。文件作用很明显:将所有的请求路径转给index.php,然后在index.php里做请求字符串的判断即可打到路由解析功能。
1、CGI
CGI即通用网关接口(common gatewag interface),它是一段程序,通俗的讲CGI就象是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执 行程序,再把服务器执行程序的结果返还给HTML页。CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。
2、FastCGI
fast-cgi 是cgi的升级版本,FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager),全称PHP FastCGI进程管理器进行管理。
3、APACHE2HANDLER
PHP作为Apache模块,Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦有请求出 现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。这些服务器副本在处理完一次HTTP请求之后并不立即退出,而是停留在计算机中等待下次请求。对于客户浏览器的请求反应更快,性能较高。
4、CLI
cli是php的命令行运行模式,大家经常会使用它,但是可能并没有注意到(例如:我们在linux下经常使用 “php -m”查找PHP安装了那些扩展就是PHP命令行运行模式;
通过Show命令,慢查询日志,profiling分析查询确定瓶颈。 |
使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。 |
当只要一行数据时使用 LIMIT 1 |
为搜索字段建索引 |
在Join表的时候使用相当类型的例,并将其索引 |
尽可能的使用 NOT NULL |
水平分表 |
垂直分表 |
选择正确的存储引擎 |
避免长连接 |
//冒泡排序(数组排序)
function bubble_sort($array){
$count = count($array);
if ($count <= 0) return false;
for($i=0; $i<$count; $i++){
for($j=$i; $j<$count-1; $j++){
if ($array[$i] > $array[$j]){
$tmp = $array[$i];
$array[$i] = $array[$j];
$array[$j] = $tmp;
}
}
}
return $array;
}
//快速排序(数组排序)
function quick_sort($array) {
if (count($array) <= 1) return $array;
$key = $array[0];
$left_arr = array();
$right_arr = array();
for ($i=1; $i<count($array); $i++){
if ($array[$i] <= $key)
$left_arr[] = $array[$i];
else
$right_arr[] = $array[$i];
}
$left_arr = quick_sort($left_arr);
$right_arr = quick_sort($right_arr);
return array_merge($left_arr, array($key), $right_arr);
}
//二分查找(数组里查找某个元素)
function bin_sch($array, $low, $high, $k){
if ($low <= $high){
$mid = intval(($low+$high)/2);
if ($array[$mid] == $k){
return $mid;
}elseif ($k < $array[$mid]){
return bin_sch($array, $low, $mid-1, $k);
}else{
return bin_sch($array, $mid+1, $high, $k);
}
}
return -1;
}
//顺序查找(数组里查找某个元素)
function seq_sch($array, $n, $k){
$array[$n] = $k;
for($i=0; $i<$n; $i++){
if($array[$i]==$k){
break;
}
}
if ($i<$n){
return $i;
}else{
return -1;
}
}
//二维数组排序, a r r 是 数 据 , arr是数据, arr是数据,keys是排序的健值,$order是排序规则,1是升序,0是降序
function array_sort($arr, $keys, $order=0) {
if (!is_array($arr)) {
return false;
}
$keysvalue = array();
foreach($arr as $key => $val) {
$keysvalue[$key] = $val[$keys];
}
if($order == 0){
asort($keysvalue);
}else {
arsort($keysvalue);
}
reset($keysvalue);
foreach($keysvalue as $key => $vals) {
$keysort[$key] = $key;
}
$new_array = array();
foreach($keysort as $key => $val) {
$new_array[$key] = $arr[$val];
}
return $new_array;
}
SVN |
GIT |
ls |
pwd |
cd |
cat |
vi |
service |
chmod |
chown |
tar |
su |
使用crontab执行。
在Linux中你应该先输入crontab -e,然后就会有个vi编辑界面,再输入0 3 * * 1 /clearigame2内容到里面 :wq 保存退出。
在crontab文件中如何输入需要执行的命令和时间。该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。
每个域之间使用空格或者制表符分隔。格式如下:
minute hour day-of-month month-of-year day-of-week commands
合法值 00-59 00-23 01-31 01-12 0-6 (0 is sunday) commands(代表要执行的脚本)
除了数字还有几个个特殊的符号就是"*"、"/“和”-"、",",*代表所有的取值范围内的数字,"/“代表每的意思,”/5"表示每5个单位,"-“代表从某个数字到某个数字,”,"分开几个离散的数字。
每天早上6点
0 6 * * * echo “Good morning.” >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。
每两个小时
0 */2 * * * echo “Have a break now.” >> /tmp/test.txt
用的CentOS,Yum安装。生产环境有专门的运维工程师负责。
之前写的文章详细以参考一下
https://blog.csdn.net/github_37553763/article/details/105990241
jQuery和扩展等
javascript 中的 this 有 五种情况:
全局范围 | 它 会指向 全局对象( 浏览器下指window) |
全局函数调用 | 还是指向全局对象 |
.对象函数调用 | 调用某个对象的函数, 它指向 当前对象。 |
使用 new 实例化对象时 | 它指向 新创建的 对象 |
调用某些方法时 | 如: Function.prototype 上的 call 或者 apply 方法 以及 with等;它指向 传入的对象。 |
每个函数都有一个prototype属性,这个属性是指向一个对象的引用,这个对象称为原型对象,原型对象包含函数实例共享的方法和属性,也就是说将函数用作构造函数调用(使用new操作符调用)的时候,新创建的对象会从原型对象上继承属性和方法。 |
prototype 属性使您有能力向对象添加属性和方法。 |
第一:预处理脚本:
Bootstrap的源码是基于最流行的CSS预处理脚本-Less和Sass开发的。你可以采用预编译的CSS文件快速开发,也可以从源码定制自己需要的样式。例如。如果你页面上有很多同样的效果。只需要写一个效果类。然后让用到的地方去继承他。就不需要再写了。
第二:一个框架,多种设备
你的网站和应用能在Bootstrap的帮助下通过同一个代码快速,有效设配手机,平板、PC设备,这都是CSS媒体查询的功劳。
第三:特效齐全
Bootstrap提供了全面、美观的文档、可以找到关于HTML元素,HTML和CSS组件、jQuery插件方面的所有详细文档。
Bootstrap组件: Bootstrap中包含了丰富的Web组件,根据这些组件,可以快速的搭建一个漂亮、功能完备的网站。比如:下拉菜单、按钮组、按钮下拉菜单、导航、导航条、路径导航、分页、排版、缩略图、警告对话框、进度条、媒体对象等。
JavaScript插件Bootstrap自带了13个jQuery插件,这些插件为Bootstrap中的组件赋予了“生命”。其中包括:模式对话框、标签页、滚动条、弹出框等。 还有更重要的一点是,Bootstrap是完全开源的。它的代码托管,开发,维护都依赖GITHub平台。
其次:
我们看下使用Bootstrap的利弊:
优点:
a) 提高开发效率。
b) 规范名称定义,便于维护。
c) 规范项目开发流程 d)css代码更清晰、简单。html代码更合理。
e) 大规模项目中可以减少用户下载
缺点:
a) 学习成本提高。你需要了解整个框架,需要阅读框架的文档。
b)css框架对于一个小项目等页面来说很臃肿。框架中可能有大部分你用不到的代码。
c)可能会无法帮助你的技术提高。太依赖框架,以至于很难排除bug。包括框架中本身就带的bug。
d) 选择自己需要的框架与开发框架都很痛苦。写到后面发现越来越不灵活,越来越臃肿。
1、页面外部引用样式过多。譬如关于ul的margin定义,在格式化的css中会声明为0,而在基本样式的css中又可能会声明margin:5px 10px;所以在Yslow中会出现多次定义。
2、组件复用性的考量。譬如表单定义的css中定义了所有表单的修饰,而假定在注册这个页面中只是需要这个css的百分之三十。那是否应切割出去那不要的百分之七十?综合以上的二个问题,个人认为解决的方式便是封装,让该有的有,不该有的没有。尽量减少http连接数和css的大小。但如果彻底是这样做的话,css的复用性又会变得很差,后期手工的封装会很痛苦。
3、到底该不该支持em?可见如要支持em,最大的目的是为了在浏览器中可以根据用户的分辨率大小自由缩放,对于拥有超大显示器的用户与小显示器的用户是非常有用的。可是在采集我们用户的浏览器数据后,发现分辨处于这二端的用户非常少,可想而知,为这部分的用户多花比正常开发一倍以上的时间显然是件不划算的事情,当然这是个建议,我们也希望能使用em带给用户最好的感受。
PS:博主认为,如果有前端技术的博友们,应该都不是问题。初学者是有点难度的。
基于Bootstrap版本的使用:
目前使用较广的是版本2和3,其中2的最新版本是2.3.2,3的最新版本3.3.5。
版本4最主要变化是:
1.从Less迁移到Sass
(为什么?因为那么Sass和LESS是一样的,只是CSS预处理器中的一种而以。但是Less相对来说,语法太过严格,所以使用的人也就少了。)
2.改进网格系统
3.缺省弹性框
4.支持 Dropped wells,thumbnails,and panels for cards
5.合并所有HTML resets到一个新的模块中:Reboot 全新自定义选项
6.不再支持IE8
7.重写所有的JavaScript插件
8.改进工具提示和popovers的自动定位
9.改进文档
10.其他大量改进