https://www.yuque.com/baiyutang/tech/tvgpha#frq0ff

php

  • 常用魔术方法 | 方法名称 | 描述 | | —- | —- | | construct | 类的构造函数-实例化一个类之前先执行该方法 | | destruct | 类的析构函数-在销毁一个类之前执行该方法 | | clone | 当复制完成时,如果定义了 clone() 方法,则新创建的对象(复制生成的对象)中的 clone() 方法会被调用 | | get | 读取不可访问属性的值时调用 | | set | 在给不可访问属性赋值时调用 | | toString | 当一个对象被当作字符串对待的时候,会触发这个魔术方法 | | unset | 当对不可访问属性调用 unset() 时,unset() 时调用 | | isset | 当对不可访问属性调用 isset() 或 empty() 时调用 | | sleep | 执行serialize()时,会先调用该魔术方法 | | autoload | 它会在试图使用尚未被定义的类时自动调用。
    通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。 | |
    call | 在对象中调用一个不可访问方法时调用 |

  • 字符串函数 | 方法 | 描述 | | —- | —- | | array_flip($array) | 键名键值互换 | | array_unique($array) | 删除重复values | | array_push($str) | 数组最后面添加数据 |

  • 数组函数

方法 描述
shuffle($arr) 打乱数组 value
  • 其他函数 | 方法 | 描述 | | —- | —- | | file_get_contents(“php://input”); | 获取 | | | |

控制反转 依赖注入

  1. class DB{
  2. public function quest(){}
  3. }
  4. class Controller{
  5. public $db;
  6. public function __construct($db){
  7. $this->db = $db;
  8. }
  9. public function action(){
  10. $this->db->quest();
  11. }
  12. }
  13. $db = new DB;
  14. $model = new Controller( $db );
  15. $model->action();
  16. //https://learnku.com/articles/14145/rely-on-inversion-control-inversion-ioc-container-dependency-injection
  1. calss Boss{
  2. //依赖员工
  3. private $staff;
  4. //现在老板只需要接受 hr 招聘就好,将控制权交给 hr
  5. //以设置方法来实现依赖注入
  6. public function setStaff(Standard $staff){
  7. $this->staff = $staff;
  8. }
  9. public function task(){
  10. $this->staff->work();
  11. }
  12. }
  13. //招聘所设定的标准
  14. interface Standard{
  15. public function work();
  16. }
  17. //员工需要依赖的标准
  18. class StaffA implements Standard{
  19. public function work(){
  20. echo "雇员A有能力能够完成老板指定的工作";
  21. }
  22. }
  23. class StaffB implements Standard{
  24. public function work(){
  25. echo "雇员B有能力能够完成老板指定的工作";
  26. }
  27. }
  28. //ioc容器
  29. interface Hr{
  30. public function getStaff(){
  31. return new StaffB();
  32. }
  33. }
  34. //公司老板
  35. $boss = new Boss();
  36. //老板招的hr
  37. $hr = new Hr();
  38. $staff = $hr->getStaff();
  39. //hr把招到的人给老板(控制反转和依赖注入)
  40. $boss->setStaff($staff);
  41. //老板让他工作了
  42. boss->task();
  1. function createRange($number){
  2. for($i=0;$i<$number;$i++){
  3. yield time();
  4. }
  5. }
  6. $data =createRange(10);
  7. foreach($data as $value){
  8. sleep(1);//这里停顿1秒,我们后续有用
  9. echo $value.PHP_EOL;
  10. }
  11. //使用场景 csv文件、text文件,或者一些日志文件
  12. //https://segmentfault.com/a/1190000012334856
  13. header("content-type:text/html;charset=utf-8");
  14. function readTxt(){
  15. # code...
  16. $handle = fopen("./test.txt", 'rb');
  17. while (feof($handle)===false) {
  18. # code...
  19. yield fgets($handle);
  20. }
  21. fclose($handle);
  22. }
  23. foreach (readTxt() as $key => $value) {
  24. # code...
  25. echo $value.'<br />';
  26. }

trait ???

  1. //在trait继承中,优先顺序依次是:来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。
  2. //For example:
  3. class A{
  4. public function sayHello(){
  5. echo "A";
  6. }
  7. }
  8. trait B{
  9. public function sayHello(){
  10. parent::sayHello();
  11. echo "B";
  12. }
  13. }
  14. class C extends A{
  15. use B;
  16. }
  17. $c=new C();
  18. $c->sayHello();
  19. //上述打印结果是:AB

php-fpm是 FastCGI 的实现,并提供了进程管理的功能。

进程包含 master 进程和 worker 进程两种进程。
master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。

CGI 的英文是(COMMON GATEWAY INTERFACE)公共网关接口,它的作用就是帮助服务器与语言通信,这里就是 nginx 和 php 进行通信,因为 nginx 和 php 的语言不通,因此需要一个沟通转换的过程,而 CGI 就是这个沟通的协议。

fast-cgi

传统的 cgi 协议在每次连接请求时,会开启一个进程进行处理,处理完毕会关闭该进程,因此下次连接,又要再次开启一个进程进行处理,因此有多少个连接就有多少个 cgi 进程,这也就是为什么传统的 cgi 会显得缓慢的原因,因此过多的进程会消耗资源和内存。
而 fast-cgi 每次处理完请求后,不会 kill 掉这个进程,而是保留这个进程,使这个进程可以一次处理多个请求。这样每次就不用重新 fork 一个进程了,大大提高效率。
php-cgi

php-cgi 是 php 提供给 web serve 也就是 http 前端服务器的 cgi 协议接口程序,当每次接到 http 前端服务器的请求都会开启一个 php-cgi 进程进行处理,而且开启的 php-cgi 的过程中会先要重载配置,数据结构以及初始化运行环境,如果更新了 php 配置,那么就需要重启 php-cgi 才能生效,例如 phpstudy 就是这种情况。

php-fpm
php-fpm 是 php 提供给 web serve 也就是 http 前端服务器的 fastcgi 协议接口程序,它不会像 php-cgi 一样每次连接都会重新开启一个进程,处理完请求又关闭这个进程,而是允许一个进程对多个连接进行处理,而不会立即关闭这个进程,而是会接着处理下一个连接。它可以说是 php-cgi 的一个管理程序,是对 php-cgi 的改进。
php-fpm 会开启多个 php-cgi 程序,并且 php-fpm 常驻内存,每次 web serve 服务器发送连接过来的时候,php-fpm 将连接信息分配给下面其中的一个子程序 php-cgi 进行处理,处理完毕这个 php-cgi 并不会关闭,而是继续等待下一个连接,这也是 fast-cgi 加速的原理,但是由于 php-fpm 是多进程的,而一个 php-cgi 基本消耗 7-25M 内存,因此如果连接过多就会导致内存消耗过大,引发一些问题,例如 nginx 里的 502 错误。
同时 php-fpm 还附带一些其他的功能:
例如平滑过渡配置更改,普通的 php-cgi 在每次更改配置后,需要重新启动才能初始化新的配置,而 php-fpm 是不需要,php-fpm 分将新的连接发送给新的子程序 php-cgi,这个时候加载的是新的配置,而原先正在运行的 php-cgi 还是使用的原先的配置,等到这个连接后下一次连接的时候会使用新的配置初始化,这就是平滑过渡。

简述 php 的垃圾收集机制。
php中的变量存储在变量容器zval中,zval中除了存储变量类型和值外,还有is_ref和refcount字段。refcount表示指向变量的元素个数,is_ref表示变量是否有别名。如果refcount为0时,就回收该变量容器。如果一个zval的refcount减1之后大于0,它就会进入垃圾缓冲区。当缓冲区达到最大值后,回收算法会循环遍历zval,判断其是否为垃圾,并进行释放处理。

Composer, 工作原理是什么?
Composer 是 PHP 的一个依赖管理工具。工作原理就是将已开发好的扩展包从 packagist.org composer 仓库下载到我们的应用程序中,并声明依赖关系和版本控制。

composer 简介
composer 依赖管理工具,且实现了自动加载。开发人员只需要几个命令行,就能获取其他开发者的包,PHP 开发工作因此变得如同堆积木,可以根据业务的需求,快速方便地拆解组合代码。它不是一个包管理器。是的,它涉及 “packages” 和 “libraries”,但它在每个项目的基础上进行管理,在你项目的某个目录中(例如 vendor)进行安装。默认情况下它不会在全局安装任何东西。因此,这仅仅是一个依赖管理。

PHP进程间通信的几种方式#
消息队列
信号量+共享内存
信号
管道
socket

$GLOBALS 是 PHP 的一个超级全局变量组,在一个 PHP 脚本的全部作用域中都可以访问。是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
$_SERVER 是一个包含了诸如头信息 (header)、路径 (path)、以及脚本位置 (script locations) 等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。
$_REQUEST 用于收集 HTML 表单提交的数据。
$_POST 被广泛应用于收集表单数据,在 HTML form 标签的指定该属性:”method=”post”。
$_GET 同样被广泛应用于收集表单数据,在 HTML form 标签的指定该属性:”method=”get”。
$_COOKIE 经由 HTTP Cookies 方法提交至脚本的变量
$_SESSION 当前注册给脚本会话的变量。类似于旧数组 $HTTP_SESSION_VARS 数组。
$_FILES 经由 HTTP POST 文件上传而提交至脚本的变量。类似于旧数组 $HTTP_POST_FILES 数组。
$_ENV 执行环境提交至脚本的变量。类似于旧数组 $HTTP_ENV_VARS 数组。