PHP

php nginx 实时输出

PHP 里开启实时输出方法是ob_implicit_flush()
但它大部分情况下都不管用,

因为php.ini配置里output_buffering输出缓冲大部分是On开启的,
还有zlib.output_compression也经常会被开启,

除了 PHP 这一层,还有 Nginx 的缓冲设置proxy_buffering,和压缩gzip也大都是开启的。
为了一两个页面的需求,修改整个服务器的网站配置,恐怕没有人会做这种选择。

这里推荐一下简单的方法:

set_time_limit(0);
ob_end_clean();
ob_implicit_flush();

header('X-Accel-Buffering: no'); // 关键是加了这一行。

echo '现在是:'.date('H:i:s').'<br>';
sleep(5);
echo '五秒后:'.date('H:i:s');

 

    

PHP中类静态调用和范围解析操作符的区别

<?php
//在子类或类内部用“::”调用本类或父类时,不是静态调用方法,而是范围解析操作符。


class ParentClass {
    public static $my_static = 'parent var ';
    public function test() {
        self::who();    // 输出 'parent' 是范围解析,不是静态调用
        $this->who();    // 输出 'child'
        static::who();  // 输出 'child' 延迟静态绑定 是范围解析,不是静态调用
    } 

    public function who() {
        echo 'parent<br>';
    }
}

    

php发送http put/patch/delete请求Demo

CURL请求对于PHPer是必备技能,使用curl_opt函数来发送各式各样的http请求动作,不仅限于get和post。
在测试自己的restful api的时候,通过访问这个代理发送http put/patch/delete请求的php页面,完成测试。请参考下面的DEMO。

<?php
/**
 * http.php
 * 用来向服务器的RESTful API发起各类HTTP请求的工具函数。
 *
 * 使用: http://localhost/http.php?action=xxx
 * xxx \in {get,post,put,patch,delete}
 *
 * Created by PhpStorm.
 * User: Lenix
 * Date: 2018/1/6
 * Time: 下午20:22
 */

class commonFunction{
    public function 
    

鸟哥:PHP Next: JIT

鸟哥:PHP Next: JIT
12月23日,由开源中国联合中国电子技术标准化研究院主办的2017源创会年终盛典在北京万豪酒店顺利举行。作为年末最受期待的开源技术分享盛会,国内顶尖技术大拿、知名技术团队、优秀开源项目作者,及近1000名技术爱好者共聚一堂,探讨最前沿、最流行的技术话题和方向,推动国内开源创新体系发展,共建国内开源生态标准。PHP7 已发布近两年, 大幅的性能提升使得 PHP 的应用场景更加广泛,刚刚发布的 PHP7.2 相比 PHP7.1 又有了近 10% 的提升。在本次大会上,链家集团技术副总裁、PHP 开发组核心成员鸟哥发表了以 “ PHP Next: JIT ”为主题的演讲,分享了 PHP 的下一个性能提升的主要举措:JIT 的进展, 以及下一个大版本的 PHP 可能的特性。他表示,JIT 相比 PHP7.2 ,在一些场景可以达到三倍,但由于 JIT 的核心前提是类型推断,得到的信息越多效果越好,因此也容易受到限制。 JIT 发布后,随着更优秀的代码出现,性能提升会更明显。

鸟哥:PHP Next: JIT

惠新宸(鸟哥)

链家集团 技术副总裁

惠新宸 ,国内最有影响力的PHP技术专家, PHP开发组核心成员 , PECL开发者 , Zend公司外聘顾问,

2017年第三届PHP开发者大会总结(二)鸟哥JIT篇.md

THE NEXT GENERATION OF PHP(惠新宸)

鸟哥本次分享的主要内容是,在php7发布的这两年期间他们的主要工作,包括release的7.1和正在开发中的jit分支。说实话,由于本人水平有限,鸟哥分享的内容只能大概听懂意思,知道他们在做什么,但具体原理细节,鸟哥分享的我还真听不懂。这里就对鸟哥的分享内容做个总结。

php7之后还有什么?JIT

php7于15年正式发布,他的最大卖点是,无感知的100%性能提升,包含了运行速度与内存消耗。那么在此之后php该往哪里发展呢?目前已经在开发的一个大方向就是JIT

JIT是什么?为什么是JIT?
鸟哥并没有做过多的解释。我就谈一些我的肤浅认识,给phper们提供些参考。

首先JIT(just in time)并非是新技术,一大批语言如java早已实现。JIT的思想很简单,即在程序运行时动态对程序进行编译,生成平台相关的机器码,从而加快程序运行速度。

php文件的执行流程大致是首先引擎加载php文件,解释器逐条解释执行代码。引入JIT后,前面一样,重点是JIT编译器会根据Runtime信息对热点代码进行动态编译生成机器码,然后这部分代码以后就可以直接执行了,而不需要解释器逐条解释执行了,运行效率便得到了提升

看到这里不知道大家是否和我有一样的疑问,既然编译为机器码执行的效率那么高,为何不在项目正式部署前全部进行编译,何必在运行时编译?要知道运行时编译也会增加程序的执行时间的。我在查阅了一些资料和一番思考后,有以下一些浅见

代码发布前先编译,是比JIT更早的通用办法,称为AOT(ahead of time),c语言便是这种执行模式。关于这两种模式孰优孰劣,学术界一直争论不休,目前也没有定论。但JIT相比AOT有这样几个优点

  • 发布速度快。不用每次都编译,发布速度自然快
  • 优化效率更好。因为JIT是基于Runtime信息,比AOT更“了解”代码,优化的效率更好。比如分析Runtime得知某个变量虽然声明是10个字节,但运行过程中一直是1个字节,那么就可以减小程序内存消耗;再比如某段代码始终未被执行,JIT则可以直接将其忽略
  • 粒度更精细。JIT可以只针对hotspot(热点)进行编译,热点可能是一个函数或者只是一个代码段
  • 对码农透明。JIT无须码农自己对程序根据不同平台进行编译发布,只需要写高级代码即可

基于以上几个优点,再结合php一贯的简单易用原则,我想JIT确实是不错的选择。不过php也是支持AOT的,有兴趣的同学可以查一下。

但JIT技术也绝不是灵丹妙药,即便是编译也是需要时间的,当代码编译的时间消耗大于运行收益时,程序反而会变慢!会有这种情况吗?有的,比如某个项目中,热点并不明显,JIT编译的代码执行次数都很少,那么编译带来的收益是有可能小于编译本身的消耗的

以下是在标准测试中引入JIT技术后,php运行效率比7.2有100%的性能提升,不过在实际生产环境中效果不会有这么好

laruence-01.png

php7.1做了什么?类型预测

php要想实现JIT,有一个难题必须解决,那就是变量的类型预测。试想如果在动态编译时还要进行大量的类型检查,性能将会大打折扣。php7中已经可以对变量类型进行控制,7.1则是更加完善了这个机制,可以说目前php已经是半强类型语言了。但由于php的弱类型历史,仍有大量代码运行前是无法得知变量类型的,所以在7.1中鸟哥进行了大量变量类型预测的工作,为后续JIT打基础

变量预测

PHP-FPM 调优: 用 ‘pm static’ 达到最大性能

 

让我们来迅速了解一下怎样设置 PHP-FPM,以便达到高吞吐,低延迟以及稳定的使用 CPU 和内存的完美状态。在默认的情况下,大多数设置都将 PHP-FPM PM(进程管理器)设置为 dynamic,或者当你有可用内存的问题时常建议你使用ondemand。接下来,让我们根据 php.net 的官方文档来比较一下这两个管理选项和我最常用的设置 —— static之间的区别:

  • pm = dynamic:子进程的数量是根据以下指令来动态生成的:pm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_servers.
  • pm = ondemand:在服务启动的时候根据 pm.start_servers 指令生成进程,而非动态生成。
  • pm = static:子进程的数量是由 pm.max_children 指令来确定的。

查看