PHP基础(十一):文件管理
文件管理有哪些文件操作?
文件读操作
读取文件前,通常需要先判断文件是否存在(使用file_exists()函数)、文件能否读取(使用is_readable()函数),读取文件的方法有:
fgets(fp[, length=1024]): 会在到达指定长度($len-1)、碰到换行符、读到文件末尾 (EOF)时,停止运行,返回读取的字符串
fread(fp, length):会在到达指定长度或文件末尾(EOF)时,停止运行,返回读取的字符串
file_get_contents(path, include_path, context, start, max_length): 把整个文件读入一个字符串中
文件写操作
写入文件前,通常需要先判断文件是否存在(使用file_exists()函数)、文件能否写入(使用is_writable()函数),写入文件的方法有:
fwrite(fp, string, [, length]): 会在到达指定长度、读到文件末尾(EOF)时,停止运行,返回写入的字节数
file_put_contents($filename, $data [, $mode ...
PHP基础(十):数组
数组在PHP中,数组实际上是一个有序映射。映射是一种把values关联到keys的类型。数组的目的是把一系列数据组织成一个可以方便操作的集合整体,数组的最小单元实体是键和值。
如何进行数组的定义与声明?
数组的声明
a. 通过array函数声明数组
b. 直接为数组赋值声明
数组类型
索引数组、关联数组
数组遍历
a. 使用for语句循环遍历
b. 使用foreach语句遍历数组
c. 联合使用list()、each()和while()循环遍历
数组的增删改查操作
a. 直接追加
b. 入栈操作追加
c. unset()函数删除数组成员或数组
合并数组
array_merge()
判断数组是否为空
a. 使用count()
b. 使用empty()
c. 使用循环
d. 使用implode()
什么是多维数组?多维数组指的是数组中的元素还是数组
数组函数有哪些?
函数原型
函数作用
说明
in_array($needle, $haystack [, $strict])
在数组中搜索一个特定值,若找到,返回true;否则,返回false
对于空值与0或1时 ...
PHP基础(九):函数
函数函数分为系统函数和用户自定义函数。PHP中所有的函数和类具有全局作用域,可以在内部定义外部调用,反之亦然。PHP不支持重载,也不可能取消定义或重定义已声明的函数。
值传递和引用传递的区别是什么?PHP函数参数传递的方式有两种:值传递和引用传递,标量类型默认为值传递,对象默认为引用传递。如需引用传递可以显式在变量前加上&
什么是默认参数?什么是函数返回值?若一个函数需要返回多个值,可以通过以下两种方式实现:
返回数组
引用
如何进行函数调用?
算法-PHP
1.查找算法1.1 顺序查找时间复杂度:O(N)
代码:
123456789101112131415// 顺序查找function orderSearch(array $arr, int $needle){ /*for ($i = 0, $count = count($arr); $i < $count; $i++) { if ($arr[$i] == $needle) { return true; } }*/ foreach ($arr as $v) { if ($v == $needle) { return true; } } return false;}
1.2 二分查找时间复杂度:O(logN)
代码:
12345678910111213141516171819202122232425262728293031// 二分查找-非递归版本funct ...
PHP基础(八):正则表达式
正则表达式正则表达式的作用主要如下:
实现对一个字符串的切割,切割后返回一个数组,如split()
实现对一个字符串中符合的内容批量替换,若替换为空,则达到了过滤的作用,如preg_replace()
判断一个字符串中是否含有符合的子字符串,如preg_match()/preg_match_all()
MySQL 锁
1. 全局锁和表锁什么场景会用到?MySQL 中,锁就是协调多个用户或者客户端并发访问某一资源的机制,保证数据并发访问时的一致性、有效性。
可以分为:全局锁、表锁和行锁。
1.1 全局锁全局锁会关闭所有打开的锁,并使用全局读锁锁定所有表。
命令:
FLUSH TABLES WITH READ LOCK; 简称:FTWRL
UNLOCK TABLES;
当 session1 执行 FTWRL 后,本线程 session1 和其它线程 session2 都可以查询,本线程和其它线程都不能更新。
原因是:当执行 FTWRL 后,所有的表都变成只读状态,数据更新或者字段更新将会被阻塞。
全局锁通常使用的场景:
全局锁一般用在整个库(包含非事务引擎表)做备份(mysqldump 或者 xtrabackup)时。也就是说,在整个备份过程中,整个库都是只读的,其实这样风险挺大的。如果是在主库备份,会导致业务不能修改数据;而如果是在从库备份,就会导致主从延迟。好在 mysqldump 包含一个参数 --single-transaction,可以在一个事务中创建一致性快照,然后进行所有表的备份。因此增加 ...
贪心算法
面试实战
Assign Cookies(#455)
程序具体实现:
见代码。
PHP基础(七):字符串
字符串处理函数有哪些?
函数类别
函数原型
函数作用
查找字符位置
strpos($str, $sch [, $offset=0])
查找sch在str中从offset开始首次出现的位置,offset默认为0,标识从头开始查找;若无,返回false
stripos($str, $sch [, $offset=0])
与strpos功能类似,不同的是stripos不区分大小写
strrpos($str, $sch [, $offset=0])
查找sch在str中的最后一次出现的位置
提取字符串
substr($str, $start [, $len])
从str中start位置开始提取[len长度的字符串]
strstr($str1, $str2)
从str1搜索str2并从它开始截取到字符串结束;若无,返回false
stristr($str1, $str2)
功能同strstr,只是不区分大小写
strchr($str, $sch [, $before_search])
查找sch在str中第一次出现的位置,并返回从该位置到字符串结尾的所 ...
PHP源码
1. PHP7的新特性1.太空船操作符 <=>太空船操作符用于比较两个表达式
例如,当$a 小于、等于或大于$b 时它分别返回-1、0 或 1
2. 类型声明
3. NULL 合并操作符
4. 常量数组
5. NameSpace 批量导入
6. Throwable 接口
7. Closure::call()
8. intdiv 函数
9. list 的方括号写法
10.抽象语法树(AST)
2. 基本变量和内存管理1.小而巧的 zval定义:
12345678910111213141516171819202122232425262728293031323334353637383940414243typedef union _zend_value { zend_long lval; /* long value */ double dval; /* double value */ zend_refcounted *counted; zend_string *str; zend_array ...
Linux命令
1.压力测试相关1.1 参数说明-n:执行的请求个数,默认执行一个请求
-c:一次产生的请求个数,即并发个数
-p:模拟post请求,文件格式为name=xiaoshan&age=30,配合-T使用
-T:post数据使用的Content-Type头信息,如-T 'application/x-www-form-urlencoded'
1.2 模拟GET请求
直接在URL后面带参数即可
1ab -c 10 -n 10 [http://www.test.api.com/?gid=2](http://www.test.api.com/?gid=2)
1.3 模拟POST请求
在当前目录下创建一个post.txt
编辑文件post.txt,写入name=xiaoshan&age=30,相当于传递name,age等参数
1ab -c 10 -n 100 -p post.txt -T 'application/x-www-form-urlencoded' 'http://test.api.com/ttk/auth/info/ ...
MySQL 事务
1.数据库突然断电会丢数据吗?1.1 什么是事务?根据《高性能 MySQL》第 3 版 1.3 事务一节中定义:
事务就是一组原子性的 SQL 查询,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。
一个良好的事务处理系统,必须具备 ACID 特性:
atomicity(原子性) :要么全部执行,要么全部都不执行。原子性是由undo log来保证的,因为undo log记录着数据修改前的信息。
consistency(一致性):在事务开始和完成时,数据都必须保持一致状态。一致性是事务的目的,一致性由应用程序来保证。
isolation(隔离性):事务处理过程中的中间状态对外部是不可见的。隔离性由数据库提供隔离级别供我们选择,分别有read uncommitted, read committed, repeatable read, serializable。
durability(持久性):事务完成 ...
RabbitMQ
简介RabbitMQ是一个高可用的消息中间件,有以下作用:
异步消息传递
支持多种开发语言
可插拔的身份验证、授权
RabbitMQ-Manager可用于管理和监视
使用RabbitMQ作为生产者和消费者时,基本上有2种使用场景:
一个/多个生产者,多个共享消费者
一个/多个生产者,多个独立消费者
共享的消费者可以同时消费一个队列的数据,增加吞吐量;独立的消费者不共享队列,每个消费者都有自己的队列,可以定义规则从exchange中pull数据到自己的queue中。
概念queue
数据队列,数据可以推送到queue,也可以从queue中消费
exchange
交换机,将数据推送到交换机中,队列可以绑定交换机,交换机的类型不同,所支持的绑定规则也不同。
fanout:没有规则,所有exchange中的数据
direct:精确匹配,只绑定routingKey指定值的数据
topic:更加灵活的规则,routingKey必须是一个由 . 分隔开的词语,* 用来表示一个单词,# 用来表示任意数量(0个或多个)单词
常用操作封装
多个共享消费者多个共享消 ...
消息队列
定义来看看维基百科怎么说的,顺带学学英语这波不亏:
In computer science, message queues and mailboxes are software-engineering components typically used for inter-process communication (IPC), or for inter-thread communication within the same process. They use a queue for messaging – the passing of control or of content. Group communication systems provide similar kinds of functionality.
翻译一下:在计算机科学领域,消息队列和邮箱都是软件工程组件,通常用于进程间或同一进程内的线程通信。它们通过队列来传递消息、传递控制信息或内容,群组通信系统提供类似的功能。简单的概括下上面的定义:消息队列就是一个使用队列来通信的组件。我们日常所说的消息队列指的是消息中间 ...
数据库和缓存一致性总结
1.常见处理方式对于缓存(例如Redis)和数据库的操作,主要有以下两种处理方式:
1.1 先更新数据库,再删除缓存更新数据库成功,如果删除缓存失败或者还没有来得及删除,那么,其他线程从缓存中读取到的就是旧值,会发生不一致。
解决方案
1.消息队列
这是网上很多文章里都有写过的方案。但是这个方案的缺陷会更明显一点。先更新数据库,成功后往消息队列发消息,消费到消息后再删除缓存,借助消息队列的重试机制来实现,达到最终一致性的效果。
这个解决方案其实问题更多,如下:
引入消息中间件之后,问题更复杂了,怎么保证消息不丢失更麻烦
就算更新数据库和删除缓存都没有发生问题,消息的延迟也会带来短暂的不一致性,不过这个延迟相对来说还是可以接受的
2.进阶版消息队列
为了解决缓存一致性的问题单独引入一个消息队列,太复杂了。其实,一般大公司本身都会有监听binlog消息的消息队列存在,主要是为了做一些核对的工作。这样,我们可以借助监听binlog的消息队列来做删除缓存的操作。这样做的好处是,不用你自己引入,侵入到你的业务代码中,中间件帮你做了解耦,同时,中间件的这个东西本身就保证了高可用。当然,这样 ...
缓存
1.缓存分类归纳
缓存分层
缓存分级
内容
内容简介
用户层
DNS
DNS系统本地缓存
客户端操作系统DNS缓存
LocalDNS缓存
本地DNS提供商的缓存
DNS缓存服务器
专用的DNS缓存服务器
浏览器DNS缓存
FF默认60s, H5新特性: DNS Prefetching
应用程序DNS缓存
Java(JVM)、PHP语言本身的DNS缓存
浏览器
浏览器缓存
H5新特性: Link Prefetching
基于最后修改时间的HTTP缓存协商: Last-Modified
基于过期时间的HTTP缓存协商: Expires、Cache-Control
基于打标签的HTTP缓存协商: Etag
Web层
CDN
代理缓存
基于squid、varnish、nginx、ATS等,一般有多级
Web服务器
Web服务器缓存
Apache(mod_cache)、nginx(FastCGI缓存、proxy cache)
应用层
应用服务
Local Cache
应用本地缓存, PHP(Yac、Xca ...