echo和print是语言结构、print_r和var_dump是普通函数
echo:输出一个或多个字符串
print:输出字符串
print_r:打印关于变量的易于理解的信息
var_dump:打印关于变量的易于理解的信息(带类型)
拓展阅读 《echo、print、print_r、var_dump区别》
双引号可以被分析器解析,单引号则不行
isset:检测变量是否已设置并且非 NULL
empty:判断变量是否为空,变量为 0/false 也会被认为是空;变量不存在,不会产生警告
static:static 可以用于静态或非静态方法中,也可以访问类的静态属性、静态方法、常量和非静态方法,但不能访问非静态属性
self:可以用于访问类的静态属性、静态方法和常量,但 self 指向的是当前定义所在的类,这是 self 的限制
$this:指向的是实际调用时的对象,也就是说,实际运行过程中,谁调用了类的属性或方法,$this 指向的就是哪个对象。但 $this 不能访问类的静态属性和常量,且 $this 不能存在于静态方法中
require 和 include 几乎完全一样,除了处理失败的方式不同之外。require 在出错时产生 E_COMPILE_ERROR 级别的错误。换句话说将导致脚本中止而 include 只产生警告(E_WARNING),脚本会继续运行
include_once 语句在脚本执行期间包含并运行指定文件。此行为和 include 语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含。如同此语句名字暗示的那样,只会包含一次
array_count_values — 统计数组中所有的值
array_flip — 交换数组中的键和值
array_merge — 合并一个或多个数组
array_multisort — 对多个数组或多维数组进行排序
array_pad — 以指定长度将一个值填充进数组
array_pop — 弹出数组最后一个单元(出栈)
array_push — 将一个或多个单元压入数组的末尾(入栈)
array_rand — 从数组中随机(伪随机)取出一个或多个单元
array_keys — 返回数组中部分的或所有的键名
array_values — 返回数组中所有的值
count — 计算数组中的单元数目,或对象中的属性个数
sort — 对数组排序
Cookie:PHP 透明的支持 HTTP cookie 。cookie 是一种远程浏览器端存储数据并以此来跟踪和识别用户的机制
Session:会话机制(Session)在 PHP 中用于保持用户连续访问Web应用时的相关数据
对于全部脚本而言,PHP 提供了大量的预定义变量
超全局变量 — 超全局变量是在全部作用域中始终可用的内置变量
$GLOBALS — 引用全局作用域中可用的全部变量 $_SERVER — 服务器和执行环境信息 $_GET — HTTP GET 变量 $_POST — HTTP POST 变量 $_FILES — HTTP 文件上传变量 $_REQUEST — HTTP Request 变量 $_SESSION — Session 变量 $_ENV — 环境变量 $_COOKIE — HTTP Cookies $php_errormsg — 前一个错误信息 $HTTP_RAW_POST_DATA — 原生POST数据 $http_response_header — HTTP 响应头 $argc — 传递给脚本的参数数目 $argv — 传递给脚本的参数数组 超全局变量PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们
超全局变量:$GLOBALS、$_SERVER、$_GET、$_POST、$_FILES、$_COOKIE、$_SESSION、$_REQUEST、$_ENV
传值导致对象生成了一个拷贝,传引用则可以用两个变量指向同一个内容
构造函数:PHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作
析构函数:PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke() 等方法在 PHP 中被称为"魔术方法"(Magic methods)
对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问
PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承
客户端IP: $_SERVER['REMOTE_ADDR']
服务端IP: $_SERVER['SERVER_ADDR']
客户端IP(代理透传): $_SERVER['HTTP_X_FORWARDED_FOR']
静态方法在内存中只有一份,无论调用多少次,都是共用的
实例化不一样,每一个实例化是一个对象,在内存中是多个的
不同点静态调用不需要实例化即可调用
静态方法不能调用非静态属性,因为非静态属性需要实例化后,存放在对象里
静态方法可以调用非静态方法,使用 self 关键字。php 里,一个方法被 self:: 后,自动转变为静态方法
调用类的静态函数时不会自动调用类的构造函数
静态调用、使用 PHP 反射方式
502
502 表示网关错误,当 PHP-CGI 得到一个无效响应,网关就会输出这个错误
php.ini 的 memory_limit 过小php-fpm.conf 中 max_children、max_requests 设置不合理php-fpm.conf 中 request_terminate_timeout、max_execution_time 设置不合理php-fpm 进程处理不过来,进程数不足、脚本存在性能问题504
504 表示网关超时,PHP-CGI 没有在指定时间响应请求,网关将输出这个错误
Nginx+PHP 架构,可以调整 FastCGI 超时时间,fastcgi_connect_timeout、fastcgi_send_timeout、fastcgi_read_timeout500
php 代码问题,文件权限问题,资源问题
503
超载或者停机维护
MySQL
$conn = mysql_connect('127.0.0.1:3306', 'root', '123456'); if (!$conn) { die(mysql_error() . "\n"); } mysql_query("SET NAMES 'utf8'"); $select_db = mysql_select_db('app'); if (!$select_db) { die(mysql_error() . "\n"); } $sql = "SELECT * FROM `user` LIMIT 1"; $res = mysql_query($sql); if (!$res) { die(mysql_error() . "\n"); } while ($row = mysql_fetch_assoc($res)) { var_dump($row); } mysql_close($conn);MySQLi
$conn = @new mysqli('127.0.0.1:3306', 'root', '123456'); if ($conn->connect_errno) { die($conn->connect_error . "\n"); } $conn->query("set names 'utf8';"); $select_db = $conn->select_db('user'); if (!$select_db) { die($conn->error . "\n"); } $sql = "SELECT * FROM `user` LIMIT 1"; $res = $conn->query($sql); if (!$res) { die($conn->error . "\n"); } while ($row = $res->fetch_assoc()) { var_dump($row); } $res->free(); $conn->close();PDO
$pdo = new PDO('mysql:host=127.0.0.1:3306;dbname=user', 'root', '123456'); $pdo->exec("set names 'utf8'"); $sql = "SELECT * FROM `user` LIMIT 1"; $stmt = $pdo->prepare($sql); $stmt->bindValue(1, 1, PDO::PARAM_STR); $rs = $stmt->execute(); if ($rs) { while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { var_dump($row); } } $pdo = null;MySQL
允许 PHP 应用与 MySQL 数据库交互的早期扩展提供了一个面向过程的接口,不支持后期的一些特性MySQLi
面向对象接口prepared 语句支持多语句执行支持事务支持增强的调试能力PDO
PHP 应用中的一个数据库抽象层规范PDO 提供一个统一的 API 接口,无须关心数据库类型使用标准的 PDO API,可以快速无缝切换数据库把 PHP 用作多进程 web 服务器的一个模块,这种方法目前只适用于 Apache。
对于一个多进程的服务器,其典型特征是有一个父进程和一组子进程协调运行,其中实际生成 web 页面的是子进程。每当客户端向父进程提出请求时,该请求会被传递给还没有被其它的客户端请求占用的子进程。这也就是说当相同的客户端第二次向服务端提出请求时,它将有可能被一个不同的子进程来处理。在开启了一个持久连接后,所有请求 SQL 服务的后继页面都能够重用这个已经建立的 SQL Server 连接。
PHP 代码 => 启动 php 及 zend 引擎,加载注册拓展模块 => 对代码进行词法/语法分析 => 编译成opcode(opcache) => 执行 opcode
PHP7 新增了抽象语法树(AST),在语法分析阶段生成 AST,然后再生成 opcode 数组
124.205.30.150=2093817494 list($p1,$p2,$p3,$p4) = explode(',','124.205.30.150'); $realNum = $p1<<24+$p2<<16+$p3<<8+$p4;
MVC 包括三类对象。模型 Model 是应用对象,视图 View 是它在屏幕上的表示,控制器 Controller 定义用户界面对用户输入的响应方式。不使用 MVC,用户界面设计往往将这些对象混在一起,而 MVC 则将它们分离以提高灵活性和复用性
Laravel
易于访问,功能强大,并提供大型,强大的应用程序所需的工具
简单快速的路由引擎强大的依赖注入容器富有表现力,直观的数据库 ORM提供数据库迁移功能灵活的任务调度器实时事件广播Symfony
Database engine-independentSimple to use, in most cases, but still flexible enough to adapt to complex casesBased on the premise of convention over configuration--the developer needs to configure only the unconventionalCompliant with most web best practices and design patternsEnterprise-ready--adaptable to existing information technology (IT) policies and architectures, and stable enough for long-term projectsVery readable code, with phpDocumentor comments, for easy maintenanceEasy to extend, allowing for integration with other vendor librariesCodeIgniter
基于模型-视图-控制器的系统框架比较轻量全功能数据库类,支持多个平台Query Builder 数据库支持表单和数据验证安全性和 XSS 过滤全页面缓存ThinkPHP
采用容器统一管理对象支持 Facade更易用的路由注解路由支持路由跨域请求支持验证类增强配置和路由目录独立取消系统常量类库别名机制模型和数据库增强依赖注入完善支持 PSR-3 日志规范中间件支持支持 Swoole/Workerman 运行优点
缩短编码时间、减少甚至免除对 model 的编码,降低数据库学习成本动态的数据表映射,在表结构发生改变时,减少代码修改可以很方便的引入附加功能(cache 层)缺点
映射消耗性能、ORM 对象消耗内存SQL 语句较为复杂时,ORM 语法可读性不高(使用原生 SQL)类定义一个内置变量,让类中其他定义方法可访问到
set_exception_handler — 设置用户自定义的异常处理函数
使用 try / catch 捕获
加锁、队列
消息队列、socket、信号量、共享内存、信号、管道
array_map、array_filter、array_walk、usort
is_callable + callbacks + 匿名函数实现
cURL、file_get_contents、fopen、fsockopen
PHP 中声明的变量,在 zend 引擎中都是用结构体 zval 来保存,通过共同体实现弱类型变量声明
zend_module_entry 定义 Extension name 编写 PHP_FUNCTION 函数
编译安装 $ phpize $ ./configure $ make && make install引用计数器
自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait
一个生成器函数看起来像一个普通的函数,不同的是普通函数返回一个值,而一个生成器可以yield生成许多它所需要的值
那你知道swoole的进程模型
标量类型声明、返回值类型声明、通过 define() 定义常量数组、匿名类、相同命名空间类一次性导入
ZVAL 结构体优化,占用由24字节降低为16字节
内部类型 zend_string,结构体成员变量采用 char 数组,不是用 char*
PHP 数组实现由 hashtable 变为 zend array
函数调用机制,改进函数调用机制,通过优化参数传递环节,减少了一些指令