PHP

重大事件:PHP JIT 已进入 PHP RFC,并将在PHP 8.0中实现,而PHP 7.4中也将包含JIT作为实验性功能

重大事件:PHP JIT 已进入 PHP RFC,并将在PHP 8.0中实现,而PHP 7.4中也将包含JIT作为实验性功能.

查看 https://wiki.php.net/rfc/jit

以下为翻译:

PHP RFC:JIT

介绍

众所周知,PHP 7的性能跳跃最初是由尝试为PHP实现JIT而启动的。我们在2011年开始在Zend(主要是由Dmitry)开展这些工作,从那时起尝试了3种不同的实现。我们从未提出过发布其中任何一个的建议,主要有三个原因:它们导致典型的Web应用程序没有实质性的性能提升; 它们的开发和维护非常复杂; 我们仍然有其他方向可以探索以提高性能,而无需使用JIT。

今日JIT的案例

尽管支持JIT的PHP的大部分基础都没有改变 – 我们相信今天有一个很好的案例可用于支持JIT的PHP。

首先,我们相信我们已经达到了使用其他优化策略提高PHP性能的能力。换句话说 – 除非我们使用JIT,否则我们无法进一步提高PHP的性能。

其次

        

2018安全的PHP系统构架指南

The 2018 Guide to Building Secure PHP Software!

前言

2018 年将至,一般程序员(特别是 Web 开发程序员)应当抛弃过去开发PHP程序的很多不好的习惯和观念了。虽然部分人不以为意,但是这确实是事实。

这个指南应该以重点部分作为 PHP: The Right Way 安全章节的补充,而不是以一般的 PHP 编程话题。

正文

PHP 版本

请在 2018 年使用 PHP 7.2, 并且计划 2019 年初切换到 PHP 7.3。

PHP 7.2 已于 2017 年 11

        

PHP 7.4 新特性 — 将包含JIT作为实验性功能!

PHP 7.4 新特性

PHP7.4 新增加了一些非常给力的新特性。在未来很长一段时间内,这无疑是一个非常重大的版本升级。

PHP 7.4可能会在2019年12月发布。此页面将同时定期更新。最后更新时间:2019.2.1.

JIT

PHP 7.4中将包含JIT(Just-in-time,即时编译)作为实验性功能(默认情况下禁用).目前在讨论阶段,详情请查看 http://blog.p2hp.com/archives/5642

预加载 

预加载是PHP核心的一个惊人的补充,可以带来一些重大的性能改进。

简而言之:如果您今天使用的是框架,则必须在每次请求时加载和重新编译其文件。预加载允许服务器在启动时在内存中加载PHP文件,并使它们永久可用于所有后续请求。

性能提升当然需要付出代价:如果预加载文件的来源发生变化,则必须重新启动服务器。

此特性可以大幅提升IO性能,性能提升约30-50%,甚至更高。

类属性类型声明 

类变量可以加类型提示:

class A
{
    public string $name;
    
    public Foo $foo;
}

此RFC已被接受,并在PHP7.4 中实施。

 

协变返回和逆变参数

我以前写过PHP的类型系统,所以很高兴看到一些改进实际上是在PHP的核心。

类型变化 简而言之:你将能够使用协变返回类型……

class ParentType {}
    

启用mysqli报告,捕获PHP程序中未使用索引的查询语句.

启用mysqli报告,捕获PHP程序中未使用索引的查询语句.

使用mysqli_report($flags)函数

在代码开发和测试期间有助于改进查询的函数。根据标志,它报告来自mysqli函数调用或不使用索引的查询(或使用错误索引)的错误。

代码如下

<?php
/* 激活报告 */
mysqli_report(MYSQLI_REPORT_ALL);

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* 检查连接 */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

/* 此查询会报告错误 */
$result = mysqli_query("SELECT Name FROM Nonexistingtable WHERE population 
        

PHP 在不调用构造函数的情况下创建对象

PHP 在不调用构造函数的情况下创建对象

可以利用PHP的反射功能ReflectionClass :: newInstanceWithoutConstructor,实现这一需求。

例子:

<?php
class a
{
    public $foo=0;
    public $bar=9;
    public function __construct()
    {
        $this->foo=1;
        echo "调用构造函数\n";
    }
}
  
  $ref = new ReflectionClass('a');
  $inst = $ref->newInstanceWithoutConstructor();
  print_r($inst);

 

以上输出:

a Object
(
    [foo] => 0
    [bar] 
    

PHP的SimpleXML遍历所有子元素及访问特定节点元素和属性

PHP的SimpleXML遍历所有子元素

    

PHP获取远程http或ftp文件的md5值

PHP获取远程http或ftp文件的md5值

获取本地文件的md5值:

md5_file(“/path/file.jpg”);

获取远程http文件的md5值:

md5_file(“https://www.baidu.com/img/bd_logo1.png”)

PHP获取远程ftp文件的md5值:

md5_file(“ftp://username:password@192.168.6.1/aa4c319f1b8197e381beeb8c45e6c68d.apk”)

如果远程文件很大的话,执行会非常费时,因为要先下载下来。

 

PHP实现文件断点续传下载

PHP实现文件断点续传下载

<?php
//PHP 断点续传下载
function download($fileurl, $start = 0, $end = '')
{
    $task_sourcefile = '/path/downfile.mp4'; //本地保存的文件
        $sourceurl = $fileurl ;  //要下载的远程文件
        $tokenfile =  'downfile.token';
    $isfileexist =$this->check_remote_file_exists($sourceurl);
    if (!$isfileexist) {
        $isfileexist2 =$this->check_remote_file_exists($sourceurl);
        if (!$isfileexist2) {
            throw new \Exception('远程文件不存在');
        }
    }
    
    

PHP session.save_path目录大量session临时文件带来的服务器效率问题

如果访问量大,可能产生的 SESSION 文件会比较多,这时可以设置分级目录进行 SESSION 文件的保存,效率会提高很多,设置方法为:session.save_path=”N;/save_path”,N 为分级的级数,save_path 为开始目录。当写入 SESSION 数据的时候,PHP 会获取到客户端的 SESSION_ID,然后根据这个 SESSION ID 到指定的 SESSION 文件保存目录中找到相应的 SESSION 文件,不存在则创建之,最后将数据序列化之后写入文件。     检查了下各web节点,所有web服务器的httpd线程均达到满负荷,很奇怪。因为所有web节点都通过nfs来共享session目录来达到 session的一致性,检查了下nfs文件服务器,IO读写比较大,检查了session_tmp目录,发现session目录临时文件达到 70000多个,初步判断也许是因为一级目录下文件过多带来的IO性能下降。 …

            
第 1 页,共 48 页12345...102030...最旧 »