PHP语言基础知识总结(一)

论坛 期权论坛 脚本     
已经匿名di用户   2022-4-16 00:33   1133   0

1.数据库问题:SQL连表查询

(1).查询留言数大于10条记录的用户名,留言数量

mysql,A用户表ID、name、password、email,B留言表(字段自定义,内容、日期等),查询留言数大于10条记录的用户名,留言数量?

select a.username,count(b.id) as num from a left join b on a.id = b.user_id group by a.username having num>10;

(2).update更新数据表:

有A(id,sex,par,c1,c2),B(id,age,c1,c2)两张表,其中A.id与B.id关联,现在要求写出一条sql语句,将B中age>50的记录c1,c2更新到A表中统一记录中的c1,c2字段:

[1]:UPDATE A,B SET A.c1=B.c1,A.c2=B.c2 WHERE A.id=B.id and B.age>50;

[2]:update A inner jion B on A.id=B.id set A.c1=B.c1,A.c2=B.c2 where B.age>50;

mysql关联查询(CROSS JION),内连接(INNER JION),UNION和UNION ALL,左链接和右链接

例子:team表:参赛队伍表和match表:赛程表 查询出

team:teamID teamName

macth:matchID hostTeamID guestTeamID matchTime matchResult

[1]:select hostTeamID,matchResult,matchTime guestTeamID from match where matchTime between ''2019-6-1"and "2019-7-1";

[2]:select t1.teamName,m.matchResult,t2.teamName,m.matchTime from match as m left jion team as t1 on m.hostTeamID = t1.TeamID,left jion team t2 on m.guestTeamID = t2.TeamID where m.matchTime between "2019-6-1" and "2019-7-1";

(4).有一张shop表,有三个字段article,author,price,选出每个author的price的最高的纪录。(要包含所有字段)

解法一:使用相关子查询

SELECT article,author,price

FROM shop s1

WHERE price = (SELECT MAX(s2.price)FROM shop s2 WHERE s1.author=s2.author );

解法二:使用非相关子查询

SELECT article,s1.author,s1.price FROM shop s1

JOIN(SELECT author,MAX(price) AS price FROM shop

GROUP BY author) AS s2 ON s1.author=s2.author AND s1.price=s2.price;

解法三:left join

SELECE s1.article,s1.author,s1.price

FROM shop s1

LEFT JOIN shop s2

ON s1.author=s2.author AND s1.price<s2.price

WHERE s2.article IS NULL;

2.计算题:

<?php
function abc(){
$a = "24linux"+6;
echo $a;

}

A.30; B.24linux6; C.6; D.30linux; A.30

3.传值和传引用的区别,以及用法(在什么情况下传值,在什么情况下传引用)

php传值:在函数范围内,改变变量值的大小,都不不会影响到函数外边的变量值。
传值:<?php
$a=1; //定义变量a
$b=2; //定义变量b
$b = $a; //变量a赋值给变量b
echo $b; //显示为1

?>

PHP按引用:在函数范围内,对值的任何改变,在函数外部也有所体现,因为传引用传的是内存地址。
传引用:<?php
$a=1; //定义变量
$b = &$a //将变量2的引用传给变量1
echo $a; //显示为1
$b = 2; //把2赋值给变量1
echo $a; //显示为2

?>

4.用多种方式获取url的后缀名:$url="http://localhost/user/order.php?id=3";

//第一种:pathinfo()函数

$url1 = 'http://www.baidu.com/index.php?id=1234&a=qwer';

$array = pathinfo($url1);

$extension = $array['extension'];

$position = strpos($extension, '?');

$result = $position === false ? $extension : substr($extension, 0, $position);

echo $result."<br/>";

//第二种:parse_url()函数

$url2 = 'http://www.baidu.com/index.php?id=1234&a=qwer';

$array = parse_url($url2);

$path = $array['path'];

$result2 = substr($path, strpos($path, '.'));

echo $result2;

5.博客系统,数据库存储采用MySql,用户数量为1000万,预计文章总数为10亿,每天至少有10万的更新量,每天访问量为5000万,对数据库的读写操作的比例超过10:1你如何设计该系统以确保高效,稳定的运行?

数据库---系统架构--优化

1.分区,文章表按时间段分区,用户表按id段(或id散列)分区等。

2.分表,用户基本信息和其他信息分开存储,文章基本信息和其他信息分开存储等。

3.读写分离,注意保持读写库一致(事务级别,哈希校验等)。

3.针对热点数据、如热搜,排行和tag等,策略更新缓存(mem, redis等)。

4.负载均衡,上集群。

5.CDN加速。

6.分析log,慢日志等,explain查看,访问异常、攻击、sql注入等。

7.将数据进行页面静态化,加速。

6.PHP常用的超全局变量有9个:

1. $_GET –> get 传送方式

2. $_POST –> post 传送方式

3. $_REQUEST –> 可以接收到 get 和 post 两种方式的值

4. $GLOBALS –> 引用全局作用域中可用的全部变量

5. $_FILES –> 上传文件使用

6. $_SERVER –> 系统环境变量

7. $_SESSION –> 用于会话控制

8. $_COOKIE –> 用于会话控制

9. $_ENV –> 服务器端环境变量

8个常用预定义常量:

__FILE__ :默认常量,php程序文件名(两条下滑线)

__LINE__ :默认常量,php程序行数

PHP_VERSION :内建常量,php程序的版本,如3.0.8_dev

PHP_OS :内建常量,执行php解析器的操作系统名称,如windows

E_ERROR :该常量指到最近的错误处

E_WARNING :该变量指到最近的警告处

E_PARSE :该变量指到解析语法有潜在问题处

E_NOTICE :该变量为发生不寻常处的提示但不一定是错误处

7.设计模式总结全集:设计模式原文链接:https://learnku.com/docs/php-design-patterns/2018

PHP23中设计模式:https://my.oschina.net/botkenni/blog/1603660

创建型

抽象工厂模式(Abstract Factory) 已完成

建造者模式(Builder) 已完成

工厂方法模式(Factory Method) 已完成

多例模式(Multiton) 已完成

对象池模式(Pool) 已完成

原型模式(Prototype) 已完成

简单工厂模式(Simple Factory) 已完成

单例模式(Singleton) 已完成

静态工厂模式(Static Factory) 已完成

结构型

适配器模式(Adapter) 已完成

桥梁模式(Bridge) 已完成

组合模式(Composite) 已完成

数据映射模式(Data Mapper) 已完成

装饰模式(Decorator) 已完成

依赖注入模式(Dependency Injection) 已完成

门面模式(Facade) 已完成

流接口模式(Fluent Interface) 已完成

享元模式(Flyweight) 已完成

代理模式(Proxy) 已完成

注册模式(Registry) 已完成

行为型

责任链模式(Chain Of Responsibilities) 已完成

命令行模式(Command) 已完成

迭代器模式(Iterator) 已完成

中介者模式(Mediator) 已完成

备忘录模式(Memento) 已完成

空对象模式(Null Object) 已完成

观察者模式(Observer) 已完成

规格模式(Specification) 已完成

状态模式(State) 已完成

策略模式(Strategy) 已完成

模板方法模式(Template Method) 已完成

访问者模式(Visitor) 已完成

更多类型

委托模式(Delegation) 已完成

服务定位器模式(Service Locator) 已完成

资源库模式(Repository) 已完成

实体属性值模式(EAV 模式) 已完成

附录

反面模式(Anti-pattern)

PHP 设计模式阅读清单

TP分布式开发总结::

https://blog.csdn.net/xyy_forever/article/details/73777294

8.Linux基本的操作和基本的命令:

chmod *** 文件名 改文件的写读执行权限

ifconfig 网络配置命令

MYSQL -h -u -p

ping ping目标主机

mkdir 目录名 创建一个目录

rm 删除一个文件

cat 查看文件内容

init [0123456] 改变系统运行级

Linux的50个基本命令

1.ls -a 列出当前目录下的所有文件,包括以.头的隐含文件(如~/.bashrc)

ls –l 列出当前目录下文件的详细信息

2. pwd 查看当前所在目录的绝对路经

3. cd 目录之间的移动

4. mkdir目录名 创建一个目录

5. rm 文件名 删除一个文件

6. cat文件名 查看文件内容(全屏查看)

7.more文件名 查看文件内容(可左右移动)

8. less文件名查看文件内容(可上下左右移动)

9.mv 路径 文件名 把文件移动到路径下 mv文件名 文件名改名

10. grep字符文件名根据字符匹配来查看文件部分内容

11. find 路经 -name “字符串” 查找路经所在范围内满足字符串匹配的文件和目录

12.ln 源文件 链接名 创建源文件的硬链接 ln -s源文件 链接名创建源文件的软链接

13.touch 文件名 建立文件

14.df 显示文件系统的总容量,使用量,剩余量

15.du -b /home 查看目前/HOME目录的容量(k)及子目录的容量(k)

16. fdisk -l 查看系统分区信息

17. mount -t 文件系统类型 设备路经 访问路经

18.chmod *** 文件名 改文件的写读执行权限

19.diff 文件名 文件名 比较文件

20.top 动态 ps –aux 静态 pstree 进程树查看系统进程

21. 程序名 & 后台运行程序 ;fg 把后台运行的进程调回前台;bg 把前台运行进程调到后台

22. halt init 0 shutdown –h now 关闭系统

23. reboot init 6 重启系统

24. init [0123456] 改变系统运行级,7种

25. at at 5pm + 3 days /bin/ls 指定三天后下午5:00执行/bin/ls

26. crontab 周期性任务命令(建议详细学习)

27.date 显示日期的命令

28.cal 显示日历的命令

29.bc 不错的简单计算器

30.man 命令 查询命令帮助

31.which 查看可执行档案的位置

32.whereis 查看档案的位置

33.locate 配合数据库查看档案位置

34.gzip bzip2 compress 压缩,解压命令

35.vi 文件名 用VI编辑文件

36.alias 命令别名设置指令 unalias 释放别名

37.tar 打包 解包指令

38.head 显示文件的头几行 tail 显示文件的后几行

39.| 管道 > 重定向

40.od 以二进制形式读取档案的内容

41.su 登入超级管理员 sudo 以管理者身份执行命令

42.tar包安装指令 ./configure –prefix=/usr/local 编译前的配置

make 编译

make install 安装编译好的源码包

43.rpm –参数 rpm的安装 查询 删除 升级等

44.ifconfig 网络配置命令

ping ping目标主机

netstat 显示监听端口及进程

45.clear 清屏

46.useradd 加用户

47.passwd 修改密码

48.chgrp chown 修改文件的用户组所有者

49.dd 用来备份的指令

dd if=”input-file” of=”output-file”

50.sh 脚本文件 执行脚本文件

df 查看磁盘大小 df -h 带有单位显示磁盘信息

通过字符串查询所在的文件都有哪些:grep -rn "&&&&"

51.Linux查看端口占用/查看进程

1.使用lsof

lsof -i:端口号查看某个端口是否被占用

2.使用netstat

使用netstat -anp|grep 80

3.1先查看进程

ps -ef | grep 进程名

如 ps -ef | grep tomcat

9.高并发和访问解决:

一 高并发的概念

在互联网时代,并发,高并发通常是指并发访问。也就是在某个时间点,有多少个访问同时到来。

二 高并发架构相关概念

1、QPS (每秒查询率) : 每秒钟请求或者查询的数量,在互联网领域,指每秒响应请求数(指HTTP请求)

2、PV(Page View):综合浏览量,即页面浏览量或者点击量,一个访客在24小时内访问的页面数量

--注:同一个人浏览你的网站的同一页面,只记做一次pv

3、吞吐量(fetches/sec) :单位时间内处理的请求数量 (通常由QPS和并发数决定)

4、响应时间:从请求发出到收到响应花费的时间

5、独立访客(UV):一定时间范围内,相同访客多次访问网站,只计算为1个独立访客

6、带宽:计算带宽需关注两个指标,峰值流量和页面的平均大小

7、日网站带宽: PV/统计时间(换算到秒) * 平均页面大小(kb)* 8

三 需要注意点:

1、QPS不等于并发连接数(QPS是每秒HTTP请求数量,并发连接数是系统同时处理的请求数量)

2、峰值每秒请求数(QPS)= (总PV数*80%)/ (六小时秒数*20%)【代表80%的访问量都集中在20%的时间内】

3、压力测试: 测试能承受的最大并发数 以及测试最大承受的QPS值

4、常用的性能测试工具【ab,wrk,httpload,Web Bench,Siege,Apache JMeter】

四 优化

1、当QPS小于50时

优化方案:为一般小型网站,不用考虑优化

2、当QPS达到100时,遇到数据查询瓶颈

优化方案: 数据库缓存层,数据库的负载均衡

3、当QPS达到800时, 遇到带宽瓶颈

优化方案:CDN加速,负载均衡

4、当QPS达到1000时

优化方案: 做html静态缓存

5、当QPS达到2000时

优化方案: 做业务分离,分布式存储

五、高并发解决方案案例:

1、流量优化

防盗链处理(去除恶意请求)

2、前端优化

(1) 减少HTTP请求[将css,js等合并]

(2) 添加异步请求(先不将所有数据都展示给用户,用户触发某个事件,才会异步请求数据)

(3) 启用浏览器缓存和文件压缩

(4) CDN加速

(5) 建立独立的图片服务器(减少I/O)

3、服务端优化

(1) 页面静态化

(2) 并发处理

(3) 队列处理

4、数据库优化

(1) 数据库缓存

(2) 分库分表,分区

(3) 读写分离

(4) 负载均衡

5、web服务器优化

(1) nginx反向代理实现负载均衡

(2) lvs实现负载均衡

redis和memcache的区别(总结)

redis应用场景

1.会话缓存(最常用)

2.消息队列,比如支付

3.活动排行榜或计数

4.发布,订阅消息(消息通知)

5.商品列表,评论列表等

1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等;

2、Redis不仅仅支持简单的key/value类型的数据,同时还提供list(链表),set(集合),sortset(有序集合),hash(哈希)等数据结构的存储;

3、虚拟内存--Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘;

4、过期策略--memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定,例如expire name 10;

5、分布式--设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从;

6、存储数据安全--memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化);

7、灾难恢复--memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复;

8、Redis支持数据的备份,即master-slave模式的数据备份;

9、应用场景不一样:Redis出来作为NoSQL数据库使用外,还能用做消息队列、数据堆栈和数据缓存等;

Memcached适合于缓存SQL语句、数据集、用户临时性数据、延迟查询数据和session等。

10.PHP 写一个函数,算出两个文件的相对路径

//写一个函数,算出两个文件的相对路径,如 $a='/a/b/c/d/e.php';$b='/a/b/12/34/c.php';

//计算出$b相对于$a的相对路径应是 ../../c/d ;

方法一::

//计算出 c.php相对于e.php的相对路径应该是../../c/d/e/f/g/h/
$a = '/a/b/c/d/e/f/g/h/e.php';
$b = '/a/b/1/2/c.php';
//c.php相对于e.php
echo getpathinfo($a, $b);
//e.php相对于c.php

//echo getpathinfo($b, $b);

/**

* 方法一

* @param $path1

* @param $path2

* @return string

*/
function getpathinfo($path1, $path2) {
$a2array = explode('/', dirname($path1));
$b2array = explode('/', dirname($path2));
$pathinfo = '';
for( $i = 1; $i <= count($b2array)-1; $i++ ) {
//如果两个路径长度不同下标
if(!isset($a2array[$i])){
$a2array[$i]='';
}elseif(!isset($b2array[$i])){
$b2array[$i]='';
}

$pathinfo.=$a2array[$i] == $b2array[$i] ? '../' : $b2array[$i].'/';
}
return $pathinfo;
}
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP