PHP

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 API中,MYSQL与MYSQLI的持久连接区别

很久很久以前,我也是因为工作上的bug,研究了php mysql client的连接驱动mysqlnd 与libmysql之间的区别php与mysql通讯那点事,这次又遇到一件跟他们有联系的事情,mysqli与mysql持久链接的区别。写出这篇文章,用了好一个多月,其一是我太懒了,其二是工作也比较忙。最近才能腾出时间,来做这些事情。每次做总结,都要认真阅读源码,理解含义,测试验证,来确认这些细节。而每一个步骤都需要花费很长的时间,而且,还不能被打断。一旦被打断了,都需要很长时间去温习上下文。也故意强迫自己写这篇总结,改改自己的惰性。…

    

微信网页授权,错误40163,ios正确,安卓错误?

点击一个公众号菜单,跳转到【微信网页授权】,ios平台没问题,安卓平台始终是错误40163,官方的说法是code被重复使用了,从index.php里获取了马上就跳转到oauth.php里去换取access_token,中间没有任何使用过!看到网上一条线索,用苹果手机没任何问题,安卓一直是错误40163,换了两台安卓设备,微信都更新到了最新版本,错误一直在~

代码如下:

index.php

<?php
header('location:https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$appid.'&redirect_uri='.$myappurl.'oauth.php&response_type=code&scope=snsapi_userinfo&state=1&connect_redirect=1#wechat_redirect');

oauth.php

<?php
    $code = $_GET['code'];
    $state = $_GET['state'];

    
    if (empty($code)) $this->error('授权失败');

    //获取oauth_token
    $token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$appsecret.'&code='.$code.

关于微信网页授权获取用户基本信息的切入问题

微信网页授权获取用户基本信息
这个功能一直有一个疑问,没有想到很好的处理方式!
用户在如何跳转到网页授权这里的?这个要如何设置呢?
请大师指点!
我想了很多方式:
1、用户打开一个静态页面,使用window.locathion来跳转到微信授权的页面;
2、在菜单或者发送给用户的链接中,直接使用微信授权链接,在用户授权后,跳转到目标页面;
但是这两种方法有一定的弊端:使用snsapi_userinfo时,用户可能每次打开,都要授权,实际上,用户可能已经授权过了,于是想到了第三种方法:
3、用户打开目标页面,目标页面发送ajax请求到服务器,在服务器查询当前用户是否已经有过授权记录,如果有直接去获取用户基本信息,返回到页面;如果没有授权记录,则返回未授权信息给页面,页面再执行跳转请求微信授权。但是这样做,依然有一个点无法跨越,那就是在向服务器查询是否有授权记录时,需要的OpenID该从何而来?
求指点!谢谢!

php开发基于mongodb数据库的字段类型问题

比如下面的数据结构

{
    'field_1': 1,
    'field_2': '1',
    'field_3': true
}

在脚本语言里,这三个值是相等的,但mongodb可不这样认为,如果你用string类型去寻找field_1的值,那么永远找不到。

可是像在php这种弱类型语言里,本来就是string,int傻傻分不清楚,所以使用mongodb的php程序员经常会出现以下杯具场景,你存储的时候主键是一个用函数生成的int型数字,但取出记录的时候可能直接使用前端传递过来的GET参数,很不巧它只能是一个string类型,这样你就永远找不到这条记录了。

解决以上问题,我觉得一开始就用php7的标量类型约束,最好启用严格模式是个好习惯,这样类型不对了,能有个提示,你就可以进行类型转换了。

 

转载请注明:http://blog.p2hp.com/archives/4708…

        

微信公众平台—-带参数二维码生成和扫描事件

摘要: 账号管理—-生成带参数的二维码 消息管理—-接收消息—-接收事件推送

为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众平台提供了生成带参数二维码的接口。使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送。

目前有2种类型的二维码:

1、临时二维码,是有过期时间的,最长可以设置为在二维码生成后的30天(即2592000秒)后过期,但能够生成较多数量。临时二维码主要用于帐号绑定等不要求二维码永久保存的业务场景。
2、永久二维码,是无过期时间的,但数量较少(目前为最多10万个)。永久二维码主要用于适用于帐号绑定、用户来源统计等场景。

 

获取带参数的二维码的过程包括两步,首先创建二维码ticket,然后凭借ticket到指定URL换取二维码。

 

创建二维码ticket

每次创建二维码ticket需要提供一个开发者自行设定的参数(scene_id),分别介绍临时二维码和永久二维码的创建二维码ticket过程。

临时二维码请求说明:

http请求方式: POST
URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKENPOST数据格式:json
POST数据例子:{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}

永久二维码请求说明:

http请求方式: POST
URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKENPOST数据格式:json
POST数据例子:{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}
或者也可以使用以下POST数据创建字符串形式的二维码参数:
{"action_name": "QR_LIMIT_STR_SCENE", "action_info": 

深入了解 Laravel 5.5 包自动发现 Package Auto Discovery

Laravel 5.5 发布在即,目前已经确定会增加一个神奇的新特性:Package Auto Discovery。本文不是聚焦于他是怎么用的,而是看看它的源码,是怎么实现Package Auto Discovery的。

composer.json

一切的起源都是来自 composer.json ,在使用 composer 的时候,你可以在 post-autoload-dump 部分指定你想执行的脚本,比如在 Laravel 5.5 的时候,我们可以看到这样的定义:…

    
第 4 页,共 49 页« 最新...23456...102030...最旧 »