PHP进阶

###

PHP会话:session

如果浏览器禁用了Cookie,那么可以通过重写Url来传递session_id

https://www.cnblogs.com/usa007lhy/p/5913466.html

默认的会话处理程序会把会话数据存储在硬盘中,如果把会话数据保存在内存中,可以免掉不必要的磁盘I/O,还有助于伸缩,如果把会话数据存放在Memcached或Redis里,任何一台分布式PHP-FPM服务器都能访问会话数据

如果想把会话数据保存在Memcached中,需做如下配置:

session.save_handler = 'memcached'

session.save_path = '127.0.0.1:11211'

###

从PHP 5.5.0开始,PHP内置了字节码缓存功能,名为Zend Opcache。

如果php.ini中配置了opcache.validate_timestamps值为0,需要小心,因为Zend Opcache将不能觉察PHP脚本的变化,必须手动清空Zend OPcache缓存的字节码,才能让它发现PHP文件的变动。这个配置适合在生产环境中设置为0,但在开发环境会带来不便,我们可以在开发环境中这样配置启用自动验证缓存功能

opcache.validate_timestamps=1
opcache.revalidate_freq=0

###

PHP会缓存应用使用的文件路径,在php.ini中设置路径缓存大小:

realpath_cache_size = 64k

###

缓冲输出:如果在较少的块中发送更多的数据,而不是在较多的块中发送较少的数据,那么网络的效率会更高,也就是说在较少的片段中把内容传递给访问者的浏览器,能减少http请求总数

因此,我们要让 PHP 缓冲输出,默认情况下(除cli模式),PHP 已经启用了输出缓冲功能,PHP 缓冲 4096 字节的输出之后才会把内容发送给 Web 服务器,推荐配置如下:

output_buffering = 4096

implicit_flush = false

如果想要修改输出缓冲区的大小,确保使用的值是4(32位系统)或8(64位系统)的倍数

 

###

判断函数

有时候需要知道PHP脚本使用的是PHP内置的Web服务器还是使用传统的Web服务器,这样方便我们为不同服务器设定不同的响应头。我们可以使用php_sapi_name()函数检查使用的是哪个PHP Web服务器,如果当前脚本使用的是PHP内置服务器,则该函数返回字符串cli-server

 

<?php
if (php_sapi_name() == ‘cli-server') {
    // PHP 内置 Web 服务器
} else {
    // 其他Web服务器
}

###

服务器部署篇:http://laravelacademy.org/post/7514.html

###

一个非常安全的做法就是把 PHP 解释器放在 web 目录外的地方,比如说 /usr/local/bin。这样做唯一不便的地方就是必须在每一个包含 PHP 代码的文件的第一行加入如下语句:

#!/usr/local/bin/php

还要将这些文件的属性改成可执行。也就是说,要像处理用 Perl 或 sh 或其它任何脚本语言写的 CGI 脚本一样,使用以 #! 开头的 shell-escape 机制来启动它们。

在这种情况下,要使 PHP 能正确处理 PATH_INFO 和 PATH_TRANSLATED 等变量的话,在编译 PHP 解释器时必须加入 --enable-discard-path 参数

###

闭包和匿名函数(闭包对象实现了__invoke()魔术方法,只要变量名后有(),PHP就会查找并调用__invoke方法

https://blog.youkuaiyun.com/xiaoerduo123x/article/details/53291754

http://laravelacademy.org/post/4341.html

###

  • 生成器即时计算并产出后续值,不占用宝贵的内存空间
  • 迭代器需要预先计算出数据集,性能相对较低

生成器只是向前进的迭代器,这意味着不能使用生成器在数据集中执行后退、快进或查找操作,只能让生成器计算并产出下一个值(一旦返回的Generator对象被遍历完成,便不能调用他的rewind方法来重置;Generator对象不能被clone关键字克隆

生成器就是PHP函数,只不过在函数中一次或多次使用yield关键字。与普通的PHP函数不同的是,生成器不返回值,只产出(产生)值

如果函数包含了yield关键字的,那么函数执行后的返回值永远都是一个Generator对象

Generator类实现了Iterator接口

在包含yield的函数返回的对象被foreach遍历时,函数体内部的代码会被对应的执行。PHP会分析其内部的代码从而生成对应的Iterator接口的方法:

  1. 其中key方法实现是返回的yield出现的次序,从0开始递增
  2. current方法则是yield后面表达式的值
  3. vaild则是在当前yield语句存在的时候返回true,如果当前不在yield语句的时候返回false;next方法则执行从当前yield到下一个yield、或者return、或者函数结束之间的代码

http://laravelacademy.org/post/4317.html

当一个生成器被调用的时候,它返回一个可以被遍历的对象。当你遍历这个对象的时候(例如通过一个foreach循环),PHP 将会在每次需要值的时候调用生成器函数,并在产生一个值之后保存生成器的状态,这样它就可以在需要产生下一个值的时候恢复调用状态

一旦不再需要产生更多的值,生成器函数可以简单退出,而调用生成器的代码还可以继续执行,就像一个数组已经被遍历完了

###

语言结构比函数效率高

###

命名空间

命名空间是现代PHP组件生态的基础,现代的PHP组件框架代码都是放在各自全局唯一的厂商命名空间中,以免和其他厂商使用的常见类名冲突

命名空间的作用是封装和组织相关的PHP类,就像在文件系统中把相关的文件放在同一个目录中一样。PHP命名空间和操作系统的物理文件系统不同,这是一个虚拟概念,没必要和文件系统中的目录结构完全相同,虽然如此,但是大多数PHP组件为了兼容广泛使用的PSR-4自动加载标准,会把命名空间放到对应文件系统的子目录中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值