/ 后端

php

安装 PHP:

资料

Awesome PHP:https://github.com/ziadoz/awesome-php

目录

  1. 面向对象编程,http://haobing.wang/php-oop
  2. 数据库,http://haobing.wang/php-database
  3. API,http://haobing.wang/php-api
  4. 设计模式,http://haobing.wang/php-pattern
  5. 安全性,http://haobing.wang/php-security
  6. 性能,http://haobing.wang/php-performance
  7. 自动测试,http://haobing.wang/php-test
  8. 质量保证,http://haobing.wang/php-quality
  9. 部署,http://haobing.wang/php-deploy

Built-in HTTP server

vagrant 虚拟机里运行:

php -S 0.0.0.0:8000

注意这里的主机名是 0.0.0.0,而不是 localhost或者 127.0.0.1

然后访问 vagrant 虚拟机的ip,例如:http://192.168.1.88:8000/info.php

参考文档:http://php.net/manual/zh/features.commandline.webserver.php

PHP-FIG 标准

PHP-FIG(PHP Framework Interop Group), https://www.php-fig.org/
PSR (PHP Standards Recommendation) 即 PHP 推荐标准。

PHP-FIG 指定的 PSR 用于解决大多数 PHP Framework 经常会遇到的某个具体问题。PHP Framework 无需频繁解决相同的问题,它们可以遵循 PHP-FIG 制定的 PSR,使用共同的方案来解决。

PSR-1:Basic Coding Standard,基本的代码风格。
PSR-2:Coding Style Guide,严格的代码风格。
PSR-3:Logger Interface,日志记录器接口。
PSR-4:Autoloading Standard,自动加载器。

composer

http://haobing.wang/composer/

macos

 Me@MBP > ~/Documents >php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

Warning: copy(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in Command line code on line 1

Warning: copy(): Failed to enable crypto in Command line code on line 1

Warning: copy(https://getcomposer.org/installer): failed to open stream: operation failed in Command line code on line 1

这是php设置openssl 没有指定cacert.pem (证书)

解决方案

# 第一步:下载 cacert.pem
wget http://curl.haxx.se/ca/cacert.pem
# 直接下载 composer.phar
curl -sS https://getcomposer.org/installer | php -- --cafile=cacert.pem

或者修改 MAC OS 下自带php.ini配置,在php.ini 的 [openssl] 中添加 openssl.cafile= /path/to/cacert.pem

cd /private/etc/
sudo cp php.ini.default php.ini
sudo vi php.ini

Windows 系统

找到并进入 PHP 的安装目录(和你在命令行中执行的 php 指令应该是同一套 PHP)。
将 composer.phar 复制到 PHP 的安装目录下面,也就是和 php.exe 在同一级目录。
在 PHP 安装目录下新建一个 composer.bat 文件,并将下列代码保存到此文件中。

@php "%~dp0composer.phar" %*

浮点数计算(计算人民币)

http://haobing.wang/float

$a = 0.1 + 0.1 + 0.1;
var_dump($b == 0.3); // false

或者以分位单位,代码中使用整数处理。

composer require moneyphp/money

常用代码段

// 判断数组是否为空
empty($array);

// debug 专用
print_r();
var_dump();

防止 undefined

$message = isset($message) ? $message : '默认值';

PHP 常量

  • SORT_ASC 指的是升序排列。用于 sql 查询
  • SORT_DESC 指的则是降序排列。用于 sql 查询

Debug

递归bug:Illegal string offset 'parentid'

array(4) { ["cateid"]=> string(1) "1" ["title"]=> string(9) "上海市" ["parentid"]=> string(1) "0" ["createtime"]=> int(1498101178) }

foreach ($cates as $cate){
    // PHP Warning: Illegal string offset 'parentid'
    if ($cate['parentid'] == $parentid){
        $tree[] = $cate;
        
        // 再寻找当前分类的子类
        $subTree = $this->getTree($cate, $cate['cateid']);// bugfix: 这里应传入 cates 而非 cate
        $tree = array_merge($tree, $subTree);
    }
}

《PHP编程》(第3版)笔记

数据类型

PHP 提供了 8 种数据类型。4 种是标量型(单值)的:整型、浮点数、字符串和布尔值。2 种复合类型(集合):数组和对象。剩下的 2 种是特殊类型:资源和 NULL。

  • 整型,is_int()
  • 浮点数,is_float()
  • 字符串,is_string()
  • 布尔型,is_bool()
  • 数组,is_array()
  • 对象,is_object()
  • 资源,is_resource()
  • NULL,is_null()

变量

写时复制。

require 和 include

  • require 加载一个不存在的文件时,会产生一个致命错误。
  • 而 include 仅仅产生一个警告,然后继续执行脚本。

一般都用 namespace 和 use 了,这里仅做了解。

函数

函数名不区分大小写。

字符串

here 文档

使用 here 文档可以很容易地把多行字符串放在程序中,应用案例:Yii2 中在 View 注入 js 脚本

<?php

$script = <<<JS
    $("input.address").click(function(){
        var addressid = $(this).val();
        $("input[name=addressid]").val(addressid);
    });
JS;

$this->registerJs($script);
?>

这里的标识符JS

时间

//获取前一天的时间:
$mytime= date("Y-m-d H:i:s", strtotime("-1 day")); 

//获取三天前的时间:
$mytime= date("Y-m-d H:i:s", strtotime("-3 day"));

//获取前3个月的时间:
$mytime= date("Y-m-d H:i:s", strtotime("-3 month"));

//获取前一个小时的时间:
$mytime= date("Y-m-d H:i:s", strtotime("-1 hour"));

//获取前一年的时间:
$mytime= date("Y-m-d H:i:s", strtotime("-1 year"));

框架运行流程

  1. 入口文件
  2. 定义常量
  3. 引入函数库
  4. 自动加载类
  5. 启动框架
  6. 路由解析
  7. 加载控制器
  8. 返回结果

安装 php

Ubuntu16.04 安装 php

sudo apt install php-fpm php-mysql

修改 php-fpm 的配置文件:

sudo vi /etc/php/7.0/fpm/php.ini

;cgi.fix_pathinfo=1 更改为 cgi.fix_pathinfo=0

然后重启 php-fpm 让配置生效:

sudo systemctl restart php7.0-fpm

查看可用的扩展列表:

sudo apt-cache search php7.0

PHP 运行原理

  • CGI : 为了解决动态编程语言与 WebServer 的通信,出现了 CGI 协议。
  • FastCGI:解决了 CGI 的效率低的问题。
  • PHP-FPM:FastCGI 进程管理器,是 FastCGI 的一个实现。

webserver 和 php解析器(动态语言)的交互

PEAR

PEAR (PHP Extension and Application Repository),即 PHP 扩展和应用库。类似于 apt 或 yum

pear install <package>

PECL

PECL (PHP Extension Community Library),PHP 扩展库,是 PEAR 的兄弟项目。

包含常用的包:

SPL (PHP标准库)

http://www.php.net/spl

SPL是用于解决典型问题(standard problems)的一组接口与类的集合。

  • Interfaces : Countable, OuterIterator, RecursiveIterator, SeekableIterator, SplObserver, SplSubject
  • Classes : AppendIterator, ArrayIterator, ArrayObject, BadFunctionCallException, BadMethodCallException, CachingIterator, CallbackFilterIterator, DirectoryIterator, DomainException, EmptyIterator, FilesystemIterator, FilterIterator, GlobIterator, InfiniteIterator, InvalidArgumentException, IteratorIterator, LengthException, LimitIterator, LogicException, MultipleIterator, NoRewindIterator, OutOfBoundsException, OutOfRangeException, OverflowException, ParentIterator, RangeException, RecursiveArrayIterator, RecursiveCachingIterator, RecursiveCallbackFilterIterator, RecursiveDirectoryIterator, RecursiveFilterIterator, RecursiveIteratorIterator, RecursiveRegexIterator, RecursiveTreeIterator, RegexIterator, RuntimeException, SplDoublyLinkedList, SplFileInfo, SplFileObject, SplFixedArray, SplHeap, SplMinHeap, SplMaxHeap, SplObjectStorage, SplPriorityQueue, SplQueue, SplStack, SplTempFileObject, UnderflowException, UnexpectedValueException

目录:

  • 数据结构
  • 迭代器
  • 接口
  • 异常
  • spl 函数
  • 文件处理
  • 各种类及接口
    • SplObserver — The SplObserver interface is used alongside SplSubject to implement the Observer Design Pattern (观察者模式)。
    • SplSubject — The SplSubject interface

php 扩展

  • php-mbstring 处理 utf8
  • php-mcrypt 密码hash
  • php-pdo
  • php-mysql
  • php-bcmath 高精度计算,通常用于计算金额。
  • php-opcache 字节码缓存,Zend Opcache。

Q: opcacheapcu 什么关系?

apc 的操作码缓存,被 opcache 取代。
apc 的用户变量缓存,被 apcu 取代。