PHP

PHP8.0 JIT介绍,及如何在PHP 8中设置JIT

PHP 8在PHP的内核中添加了JIT(即时编译)编译器,可以极大地提高性能。

解释程序语言没有编译步骤,可以直接在虚拟机中执行代码。实际上,包括PHP在内的大多数解释型语言都有一个轻量级的编译步骤来提高其性能。

另一方面,使用Ahead-Of-Time(AOT)编译进行编程的语言要求在运行代码之前首先对其进行编译。

即时编译是解释器和提前编译的混合模型,部分或全部代码通常在运行时进行编译,而无需开发人员手动进行编译。

PHP历史上是一种解释语言,所有代码都是由虚拟机(Zend VM)解释的。通过引入由PHP代码生成的Opcache和Opcodes,可以对此进行更改,并且可以将其缓存在内存中。PHP 7.0添加了AST(抽象语法树)的概念,该概念进一步将解析器与编译器分离。

PHP的JIT内部使用LuaJIT的DynASM,并作为Opcache的一部分实现。

深入
了解JIT有关最佳JIT配置,基准以及JIT如何工作的详细指南

Opcache可以检查使用的代码(通常称为热代码),并将它们的编译版本存储在共享的Opcache内存中。什么时候应该编译代码,什么时候应该编译代码是可配置的。

平台支持

当前在运行在x86和x64处理器指令集上的Linux和Windows系统上启用了JIT。当前不支持Apple M1和ARM CPU。

DynASM是PHP JIT中使用的编译器,它也支持ARM指令,但是尚不清楚PHP JIT是否可以在ARM处理器上运行。

如果CPU支持JIT,则JIT也可以使用AVX。2011年及以后的大多数消费者和服务器级处理器都支持AVX指令。cat /proc/cpuinfo | grep

            

如何安装与升级到 PHP 8.0 (Debian/Ubuntu)

PHP 8.0 带来了一些新功能,并在性能,语法,安全性和稳定性方面进行了改进。借助目前所有受支持的Debian和Ubuntu版本中可用的预编译软件包,可以轻松地在几乎任何类型的服务器/开发设置上安装PHP 8.0。

目前尚无PHP 8.0的普遍可用版本。尽管PHP 8.0当前处于功能冻结状态,但有可能在2020年11月发布更稳定的版本之前进行许多更改。对于生产系统,请等待正式的稳定版本。

    

使用Laravel Packer创建laravel包脚手架

Laravel Packer是Sarthak Shrivastava的命令行工具,用于加快laravel软件包的创建速度。您可以在创建Laravel软件包时使用所有artisan命令,并为在软件包中创建的模型创建CRUD。要创建新程序包,可以使用packrCLI,它将为您创建所有程序包脚手架:

packr new your-package-name {vendor} {author} {author_email}

在开发软件包时,可以使用熟悉的Artisan命令生成软件包控制器,模型等:

packr make:controller ExampleController
packr make:model Post

Packer是使用Laravel Zero构建的,您可以在他的YouTube播放列表中找到有关此组合的详细教程(由Sarthak发布):

 

您可以在bitfumes/laravel-packer上了解有关此软件包的更多信息,获取完整的安装说明,并在GitHub上查看源代码。

更多创建laravel软件包方法与工具请参考 https://laravelpackage.com/

    

Composer 2.0 发布了!

1 /有什么新功能?

变更和改进的清单很长,如果您有兴趣阅读全部内容,请查看完整的变更日志。我将在这里重点介绍一些关键点。

性能提升

从Composer和packagist.org之间使用的协议到依赖关系解析,我们几乎对所有内容进行了全面检查,包括使用curl和约束评估优化来并行下载文件。这导致速度和内存使用方面的巨大改进。差异取决于您的用例,因此尽管我看到某些项目的两个方面的改进都超过50%的报告,但我无法在上面给出确切的数字。但是我敢肯定,如果您还没有尝试过Composer 2,将会感到非常惊讶。

作为补充,require/remove和部分更新现在快得多,因为Composer现在将仅加载要更改的程序包的元数据。…

        

Laravel:何时使用依赖注入,服务和静态方法

有时我们需要将应用程序逻辑放在控制器或模型之外的某个地方,通常称为服务。但是,有几种方法可以使用它们-作为静态“helpers”,作为对象或依赖注入。让我们看看每一个什么时候用是合适的。

我在本主题中看到的最大问题–关于如何使用依赖注入和服务的文章很多,但是几乎没有解释为什么应该使用它以及何时用是真正有用的。因此,让我们通过一些理论深入研究示例。…

        

Laravel前端脚手架的完整指南

关于Laravel前端脚手架的状态,存在很多争论,戏剧性和最终的困惑。我不会关注任何戏剧-谁对谁错是不重要的。

什么重要的是确保人们理解的-相对复杂-前端脚手架的状态。初学者和经验丰富的开发人员似乎都对该前端“生态系统”的某些部分感到困惑。

因此,本文将尝试作为Laravel前端脚手架完整指南

注意:如果您只是想快速了解要使用的内容,而又不对不同解决方案的用途进行解释,请跳到文章结尾。

            

laravel万能路由( 自动路由、动态路由)实现方法分享

laravel万能路由 自动路由 动态路由

有了万能路由就不用一条一条添加路由了,很方便。如果你要用资源控制器做Restful接口,那还是要写资源路由的,注意,资源路由一定要写在最上面。

Route::resource('photos', 'PhotoController');//资源路由要写在上面。

//万能路由

Route::group(['middleware'=>['web']],function (){

    Route::any("/{module}/{controller}/{action}",function ($module,$class,$action){
        $class = "App\\Http\\Controllers\$module\\".ucfirst(strtolower($class)).'Controller';
        if(class_exists($class))
        {
            $ctrl = \App::make($class);
                return \App::call([$ctrl, $action]);
        }
        return abort(404);
 
    })->where([ 'module'=>'[0-9a-zA-Z]+','class' => '[0-9a-zA-Z]+', 'action' => '[0-9a-zA-Z]+']);

});

在你的控制器方法中获取参数要用(Request $request)

public function index(Request $request)
    {
        
        

[PHP 技巧] 不要直接克隆对象,请使用深拷贝

声明:这篇文章的目的并不是让你停止使用 clone 关键字,而是让你作进一步理解它的用法,因为这部分的文档介绍不够清楚。

众所周知,PHP 的 clone 关键字用于克隆对象的所有属性。其背后的原理在于默认创建一个与原有对象的属性值完全一样的新对象,此外,也可以通过类的 __clone() 方法来实现自定义行为。

虽然该描述与我们的期望相符,但是,如果克隆的对象里面包含了对象类型的属性,可能会出现奇怪的结果。让我们看看具体的示例: