PHP 基础
-
简述 PHP
PHP 是一个基于 服务端 来创建 动态网站 的脚本语言,可以结合 HTML 来生成主页;
-
PHP 的八种类型
boolean(布尔值)、integer(整型)、float(浮点型)、string(字符串)、array(数组)、object(对象)、null、resource(资源);
-
以下预定义全局变量的作用
// 当前运行脚本所在目录的根目录 $_SERVER['DOCUMENT_ROOT']; // 当前请求 Host 头部的内容 $_SERVER['HTTP_HOST']; // 当前请求用户的 ip $_SERVER['REMOTE_ADDR']; 或者 getenv['REMOTE_ADDR']; // 获取服务器 ip $_SERVER['SERVER_ADDR']; // 链接到当前页面的前一页的 url 地址 $_SERVER['HTTP_REFERER']; // 当前服务器的名称 $_SERVER['SERVER_NAME']; // 上传文件的所有信息 $_FILE;
-
比较
include()
和require()
两者最大的区别就是对包含文件需求程度;
include()
就是包含,如果包含的文件不存在,会提示一个错误,但是程序仍然往下执行;
require()
是需要,如果包含的文件不存在,则报出一个致命的错误,程序也会终止执行;
include()
执行文件时,每次都要读取和评估;require()
文件只处理一次;如果大量代码只读取一个文件require()
效率更高,读取多个文件include()
效率更高;
include_once()
和require_once()
都是包含一次,避免重复包含; -
POST 和 GET 的最大传输容量分别是多少?
POST 是根据 php.ini 文件配置的(默认是 8M);
GET 一般大小限制在 2kb;
一般来说 get/post 是没有长度限制的,主要的限制是来源于 浏览器 和 服务器区别:
- get 可以被 cache ,而 post 不能被缓存;
- get 请求有长度的限制,post 理论上是没有长度的限制的;
- get 提交的数据较小,一般是 2k ~ 8k ,而 post 提交的数据较大,大小是根据服务器设定来的;
-
如何判断接收的数据是 POST 还是 GET
$_SERVER['REQUEST_METHOD']
-
echo
、print
、print_r
的区别echo
是一个语言结构,输出一个或者多个字符串;
print()
输出一个字符串;
print_r()
是一个函数,打印的是变量的信息,对象、数组等 -
传值赋值和引用赋值的区别
传值赋值是将内容复制一份,修改其中一个变量另一个变量不会受到影响;引用传值是将两个变量指向同一个内存空间,其中一个变量改变会影响到另一个变量;
引用赋值使用&
-
将 1234567890 修改成 1,234,567,890
$b = strrev($a); // 翻转字符串 $c = chunk_split($b, 3, ','); // 分割字符串 $d = strrev($c); $e = substr($d, 1);// 截取字符串 // $e = ltrim($d, ','); // 删除字符串开头的空白字符(或其他字符) echo $e . PHP_EOL;
-
PHP 中
error_reporting
这个函数的作用打开或者关闭错误报告:
error_reporting(2047)
打开所有错误报告 -
echo count('abc')
返回的是什么返回 1 ,
count()
是计算array
的,其他类型返回 1 ,count('null')
返回 0; -
session()
和cookie
的区别- cookie 是放到客户端上的, session 是放到服务器上的;
- cookie 不是很安全,别人可以分析本地 cookie 来进行 cookie 欺骗,考虑安全应当使用 session;
- session 是放在内存中的,大量 session 会影响服务器性能;
- 单个 Cookie 保存的长度不能超过 4K,一个网址被限制只能保存 20 个 cookie;
-
如何设置 session 的生存时间
session_set_cookie_params()
MySQL
-
MySQL 函数
mysql_num_rows()
取得的查询返回集总数 -
SQL 语句应该考虑哪些安全性
- 防 sql 注入;
- 最小用户权限原则,最好不要使用 root 连接数据库;
- 当 sql 运行出错时,不要把所有错误信息暴露给用户;
-
MySQL 索引
普通索引,唯一索引,主键索引
-
char 和 varchar 的区别
char 定长,不管储存是否达到设定的值,都按设定的值储存,效率较高,varchar 变长;varchar 储存字符比 char 长;
-
MySQL 取得当前时间和格式化时间的函数
now()
date_format(time, '%Y%m%d')
-
优化 sql 查询语句
- 尽量选择较小的列;
- 将 where 后面使用较频繁的字段加上索引;
- select 语句中避免使用 ‘*’;
- 避免在索引列上计算,使用 not in 和 <> 等操作;
- 合理使用 limit 字段;
- 合适分割表,查询较慢时用 explain 分析查询语句;
- (使用缓存);//
-
MySQL 中的事务
保证成批的 sql 语句要么同时完成要么同时失败,保证数据的完整性;
四个特性(ACID):原子性、一致性、隔离性、持久性;
-
优化数据库方法
- 选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段 设置 not null 例如’省份,性别’,最好设置为 enum
- 使用连接(join)来代替子查询
- 使用联合(union)来代替手动创建的临时表
- 事务处理
- 锁定表,优化事务处理
- 使用外键,优化锁定表
- 建立索引
- 优化查询语句
-
对于大流量访问网站,怎么来优化访问量
- 确认服务器硬件是否足够支持当前流量;
- 优化数据库访问;
- 禁止外部盗链;
- 控制大文件下载;
- 使用不同主机分流主要流量;
HTTP 协议
-
http 响应状态码
1xx:请求被接受;2xx:成功;3xx:重定向;4xx:客服端错误;5xx:服务端错误
常见 Code 码:200:成功;301/2:永久/临时重定向;307:重定向中保持原有的请求数据;404:网页不存在;503:服务器暂时不可用;500:服务器内部错误;
优化安全
-
防 SQL 注入漏洞可以用哪些函数?
addslashes()
mysql_escape_string()
-
开发过程中有什么方法加快页面加载速度
- 数据库优化;
- php 缓存;
- 使用 smarty、zend 引擎;
- 分布式部署;
- 静态化处理;
Linux
-
常用的 linux 命令及功能
- ls 显示文件或者目录 -a 所有文件 -l 详细显示
- mkdir 创建目录
- cd 切换目录
- touch 创建空文件
- cat 查看文件内容
- cp 拷贝
- mv 移动或者重命名
- rm 删除文件 -r 递归删除 -f 强制删除
- pwd 显示当前目录
- ln 链接文件
-
find 和 grep 的区别
find 是查找文件,grep 是查找文件内容;
简单算法
-
冒泡排序
// 将大数放在后面 function bubble($arr) { for ($i=0; $i <count($arr) ; $i++) { for ($j=$i + 1; $j < count($arr) ; $j++) { if ($arr[$i] > $arr[$j]) { $tmp = $arr[$i]; // 将大数暂存 $arr[$i] = $arr[$j]; $arr[$j] = $tmp; } } } return $arr; }
-
快速排序
// 将第一个数来作为比较,使用递归 function quickSort($arr) { if (count($arr) <= 1) { return $arr; } $firstOne = $arr[0]; $left = $right = []; for ($i=1; $i <count($arr) ; $i++) { if ($arr[$i] < $firstOne) { $left[] = $arr[$i]; }else { $right[] = $arr[$i]; } } $left = quickSort($left); $left[] = $firstOne; $right = quickSort($right); $result = array_merge($left, $right); return $result; }
-
约瑟夫闭环问题
function king($n, $m) { $monkey = range(1, $n); $i = 0; while (count($monkey) > 1) { $i += 1; $head = array_shift($monkey); if ($i % $m != 0) { array_push($monkey, $head); } } return $monkey[0]; }
-
遍历文件夹
function showFile($path) { $result = []; $handle = opendir($path); if ($handle) { while (false !== ($file = readdir($handle))) { if ($file != '.' && $file != '..') { $cur_path = $path . '/' .$file; if (is_dir($cur_path)) { $result['dir'][$cur_path] = showFile($cur_path); }else { $result['file'][] = $cur_path; } } } closedir($handle); } return $result; }