分类: PHP

PHP

  • PHP 8.4.1发布:新特性强化开发者体验,安全性能大幅提升

    PHP 8.4.1发布:新特性强化开发者体验,安全性能大幅提升

    2024年11月21日,PHP开发团队正式发布了PHP 8.4.1版本,标志着8.4主要分支的首次亮相。该版本不仅修复了多个重要的安全漏洞,还引入了一系列新特性和改进。这一版本的发布对于PHP社区而言,既是安全性的一次强化,也是开发者使用体验的一次重大提升。

    主要特性属性:

    钩子新版本最引人注目的特性之一是“属性钩子”。这一功能大大简化了开发者在处理计算属性时所需的代码。通过属性钩子,开发者不再需要依靠可能会失效的注释来保证静态分析工具和IDE的正确工作。此外,这项功能还允许开发者在值被调用之前或之后进行可靠的预处理或后处理,无需再检查类中是否存在配套的getter或setter。这一改进不仅提升了代码的可读性,也降低了维护成本。

    非对称可见性:

    另一项重大的更新是“非对称可见性”,这一新特性使得开发者能够独立控制属性的写入和读取权限。这意味着开发者可以更灵活地设计类的接口,而无需编写繁琐的getter方法来公开属性值,同时又可以确保属性不被外部随意修改。这种灵活性不仅增强了代码的安全性,也使得面向对象编程的实践更加高效。

    其他增强:

    PHP 8.4.1还新增了处理HTML5文档的DOM API,以及其他多个功能增强和优化,比如延迟加载对象、数组处理工具,甚至允许新的实例化对象属性和方法被访问而无需使用括号。这些特性均为开发者提供了更为高效和便捷的开发体验。在实际使用中,开发者发现,这些新功能大幅度提升了应用程序的响应速度和用户体验,尤其是在处理大型数据和复杂业务逻辑时表现尤为突出。

    在市场上,PHP一直占据着重要的地位,尤其是在网站开发和服务器端处理方面。与其他编程语言相比,PHP以其简单易用和广泛的社区支持赢得了许多开发者的青睐。而PHP 8.4.1的重要更新无疑是在竞争激烈的开发环境中再次巩固了其市场地位。这些新特性使得PHP能够更好地与现代化编程语言展开竞争,满足开发者对高效、安全和灵活性的需求,对社区形成良好的吸引力。

    PHP 8.4.1的发布显著提升了开发者的工作效率和代码安全性,尤其对于中小型企业和初创团队,能够用更少的成本实现更高效的开发流程。面对愈加复杂的市场需求,开发者们应及时更新至PHP 8.4.1,利用其新特性来优化自己的项目,抓住数字化转型的机遇。

  • 安装PHP Composer

    安装PHP Composer

    若要在当前目录中快速安装 Composer,请在终端中运行以下脚本:

    php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    php -r "if (hash_file('sha384', 'composer-setup.php') === 'dac665fdc30fdd8ec78b38b9800061b4150413ff2e3b6f88543c636f7cd84f6db9189d43a81e5503cda447da73c7e5b6') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
    php composer-setup.php
    php -r "unlink('composer-setup.php');"
    ShellScript

    这个安装程序脚本将简单地检查一些设置, 如果设置不正确,请警告您,然后 下载当前目录中的最新版本。

    上面的 4 行将按顺序排列:php.inicomposer.phar

    • 将安装程序下载到当前目录
    • 验证安装程序 SHA-384,您也可以在此处进行交叉检查
    • 运行安装程序
    • 删除安装程序

    最有可能的是,您希望将 放入 PATH 上的目录中,以便您可以简单地从任何目录(全局安装)调用,例如:composer.pharcomposer

    sudo mv composer.phar /usr/local/bin/composer
    ShellScript

    测试:

    composer -V
    composer self-update
    ShellScript

    输出如下:

    Composer version 2.7.4 2024-04-22 21:17:03
    PHP version 8.3.6 (/usr/local/php/bin/php)
    Run the "diagnose" command to get more detailed diagnostics output.
    You are already using the latest available Composer version 2.7.4 (stable channel).
    ShellScript

    参考:Composer官方网站 (getcomposer.org)

  • Drupal Nginx rewrite配置

    Drupal Nginx rewrite配置

    Drupal推荐一般使用Apache Httpd进行部署,但是我们也可以直接使用Nginx进行部署,只是官方的nginx配置一直没有名正言顺的写出来,一直琢磨和查询了很久其实只有3条配置如下,即可。

    rewrite ^/core/authorize.php/core/authorize.php(.*)$ /core/authorize.php$1;
    if (!-e $request_filename) {
      rewrite ^/update.php(.*)$ /update.php?q=$1 last;
      rewrite ^/(.*)$ /index.php?q=$1 last;
    }

  • PHP安装apcu扩展

    PHP安装apcu扩展

    下载地址 http://pecl.php.net/get/apcu-5.1.16.tgz

     tar zxvf apcu-5.1.16.tgz
    cd apcu-5.1.16

    生成configure文件

    执行,其中/usr/local/php为php安装目录

     /usr/local/php/bin/phpize 

    配置编译参数,其中usr/local/php为php安装目录

    ./configure --with-php-config=/usr/local/php/bin/php-config 

    编译并安装

    make && make install

    修改配置文件php.ini

    extension = apcu.so
    apc.enabled= on
    apc.shm_size= 64M
    apc.enable_cli = on

    重启php-fpm

    service php-fpm restart
  • CentOS8安装Redis Server及PHPRedis

    CentOS8安装Redis Server及PHPRedis

    1.从https://redis.io/下载最新版redis,解压缩

    wget https://download.redis.io/releases/redis-6.2.5.tar.gz
    tar xvzf redis-6.2.5.tar.gz

    2.安装依赖及编译软件

    yum install gcc tcl -y

    3.编译

    cd redis-6.2.5
    make PREFIX=/usr/local/redis install

    4.生产配置文件,以及生产目录

    mkdir /usr/local/redis/conf
    cp redis.conf /usr/local/redis/conf
    mkdir -p /usr/local/redis/data
    mkdir -p /usr/local/redis/data/logs
    mkdir -p /usr/local/redis/data/data

    5.修改配置文件

    #daemonize no
    #bind 0.0.0.0
    daemonize yes
    protected-mode yes
    #requirepass 123456
    logfile "/usr/local/redis/data/logs/redis.log"
    dir "/usr/local/redis/data/"
    maxmemory 128MB
    

    6.生产配置service文件

    vi /lib/systemd/system/redis.service
    #输入如下内容
    [Unit]
    Description=Redis
    After=network.target
    
    [Service]
    Type=forking
    PIDFile=/var/run/redis_6379.pid
    ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/bin/kill -s QUIT $MAINPID
    PrivateTmp=true
    
    [Install]
    WantedBy=multi-user.target

    6.设置service及测试

    systemctl daemon-reload 
    systemctl start redis
    systemctl status redis
    systemctl enable redis
    ln -s /usr/local/redis/bin/redis-cli /usr/bin/redis
    redis -v

    7.安装phpredis

    #在http://pecl.php.net/package/redis下载最新版本PHPredis扩展
    wget http://pecl.php.net/get/redis-5.3.4.tgz
    tar xvzf redis-5.3.4.tgz
    cd redis-5.3.4
    /usr/local/php/bin/phpize
    ./configure --with-php-config=/usr/local/php/bin/php-config
    make && make install
    vim /usr/local/php/etc/php.d/04-redis.ini
    extension=redis.so
    service php-fpm restart
  • Laravel 使用 HTTPS

    Laravel 使用 HTTPS

    Laravel框架搭建的网站在使用过程中,对于我们习惯于折腾的人,不全面支持SSL是很难受的一件事。特别是框架搭载的静态文件都不直接支持ssl

    其实,只需要在app/Providers/AppServiceProvider.php文件中添加以下内容:

    class AppServiceProvider extends ServiceProvider
    {
        public function boot()
        {   
            Paginator::defaultView('pagination::bulma');
            Paginator::defaultSimpleView('pagination::simple-bulma');
            \URL::forceScheme('https');  #增加内容
        }
    

    即可有效解决该问题,我再laravel中验证通过。

  • PHP CURL证书错误问题

    PHP CURL证书错误问题

    CURL证书错误的时候,会导致PHP调用CURL执行下载任务的时候,因为无法解析证书,导致下载失败,出现:cURL error 77: (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)”错误,我们需要做的就是正确配置php调用CURL的CA证书。

    vim /usr/local/php/etc/php.ini
    #修改以下curl.cainfo openssl.cafile openssl.cafile三个选项,保证CA证书在这个目录下
    
    [curl]
    curl.cainfo = "/usr/local/openssl/cert.pem"
    [openssl]
    openssl.cafile = "/usr/local/openssl/cert.pem"
    openssl.capath = "/usr/local/openssl/cert.pem"
    cd /usr/local/openssl/
    wget https://curl.haxx.se/ca/cacert.pem
    mv cacert.pem cert.pem
    service php-fpm restart
  • PHP编译安装imagic扩展

    #Ubuntu系统中直接用如下命令,安装需求的ImageMagick库文件
    sudo apt-get install libmagickwand-dev libmagickcore-dev
    #其他系统可以手动编译ImageMagick
    wget http://www.imagemagick.org/download/ImageMagick.tar.gz
     tar -xzvf ImageMagick
     cd ImageMagick-7.0.10-25
     ./configure --prefix=/usr/local/imagemagick
     make && make install
     ln -s /usr/local/imagemagick/include/ImageMagick-7 /usr/local/imagemagick/include/ImageMagick
    #安装imagic
     cd ..
     wget https://pecl.php.net/get/imagick-3.4.4.tgz
     tar xvzf imagick-3.4.4.tgz
     cd imagick-3.4.4
     /usr/local/php/bin/phpize
    ./configure --with-php-config=/usr/local/php/bin/php-config --with-imagick=/usr/local/imagemagick
     make && make install
     vim /usr/local/php/etc/php.d/03-imagick.ini
    #增加以下内容
     extension=imagick.so
    service php-fpm restart
    
  • 编译安装PHP8.0测试版开启Opcache JIT

    编译安装PHP8.0测试版开启Opcache JIT

    PHP已经进入了PHP8.0的测试研发阶段,其中就包括万众期待的PHP JIT新特性,这里我们尝新编译安装PHP8.0,并试着开启opcache中的JIT

    环境:Debian10,假设已按照完成nginx

    1. 安装编译软件及依赖
    apt install libonig-dev pkg-config build-essential autoconf bison re2c libxml2-dev libsqlite3-dev git

    2. 安装PHP常用的库依赖,这里是debian的,不同版本系统和不同类型的系统可能不一样,需要自己查找必须的依赖。

    apt-get install libssl-dev zlib1g-dev libcurl4-gnutls-dev libpng-dev libonig-dev libsodium-dev libargon2-dev 

    3. 下载PHP8测试版源码,这个是测试版的源码,实时更新,因此可能存在BUG甚至无法编译安装成功的情况。

    git clone https://github.com/php/php-src.git
    cd php-src
    ./buildconf

    进行编译前config

    ./configure --prefix=/usr/local/php8 \
    --with-config-file-path=/usr/local/php8/etc \
    --with-config-file-scan-dir=/usr/local/php8/etc/php.d \
    --with-fpm-user=www \
    --with-fpm-group=www \
    --enable-mbstring  \
    --enable-ftp  \
    --enable-gd   \
    --enable-opcache   \
    --enable-gd-jis-conv \
    --enable-mysqlnd \
    --enable-pdo   \
    --enable-sockets   \
    --enable-fpm   \
    --enable-xml  \
    --enable-soap  \
    --enable-pcntl   \
    --enable-cli   \
    --with-freetype   \
    --with-jpeg \
    --with-openssl  \
    --with-mysqli=mysqlnd   \
    --with-pdo-mysql=mysqlnd   \
    --with-pear   \
    --with-zlib  \
    --with-iconv \
    --with-curl \
    --enable-bcmath \
    --enable-shmop \
    --enable-exif  \
    --enable-sysvsem \
    --enable-mbregex \
    --with-password-argon2 \
    --with-sodium=/usr/local \
    --with-mhash \
    --enable-ftp \
    --enable-intl \
    --with-xsl \
    --with-gettext \
    --with-zip \
    --disable-debug  \
    PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/: 

    4.编译及安装

    make & make test & make install

    5. 配置与测试

    /usr/local/php8/bin/php -v

    增加全局php环境变量

    vim /etc/profile

    末尾增加

    PATH=$PATH:/usr/local/php8/bin
    export PATH

    6.基础php配置

    cp php.ini-production /usr/local/php8/etc/php.ini
    cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php8/etc/php-fpm.conf
    cp /usr/local/php8/etc/php-fpm.d/www.conf.default /usr/local/php8/etc/php-fpm.d/www.conf
    cp sapi/fpm/init.d.php-fpm /etc/init.d/php8-fpm
    chmod +x /etc/init.d/php8-fpm
    service php8-fpm start
    systemctl enable php8-fpm

    修改php配置,去掉 php8-fpm.conf中 pid = run/php8-fpm.pid 前面的分号

    vim /usr/local/php8/etc/php-fpm.conf
    pid = run/php8-fpm.pid 

    修改www.conf中的启动用户和用户组为www-data已经监听端口为listen = 127.0.0.1:9080

    user = www-data
    group = www-data
    
    listen = 127.0.0.1:9080

    这里需要注意如果php-fpm无法使用service php-fpm start是可能因为系统启动项出现了误判,建议重启reboot再试。

    7.开启opcache和JIT

    cd /usr/local/php8/etc/php.d
    vim 02-opcache.ini

    增加以下内容:

    [opcache]
    zend_extension=opcache.so
    opcache.enable=1
    opcache.enable_cli=1
    opcache.memory_consumption=192
    opcache.interned_strings_buffer=8
    opcache.max_accelerated_files=100000
    opcache.max_wasted_percentage=5
    opcache.use_cwd=1
    opcache.validate_timestamps=1
    opcache.revalidate_freq=60
    ;opcache.save_comments=0
    opcache.fast_shutdown=1
    opcache.consistency_checks=0
    ;opcache.optimization_level=0
    #启动JIT
    opcache.jit_buffer_size=64m
    opcache.jit=1205

    重启php-fpm

    service php8-fpm restart

    以上问题需要注意找到对应的扩展php.ini的文件夹再建立设置开启opcache的配置文件。

    经过以上配置后,搭配nginx或者apache就可以启动php文件的解析。

    8. 修改php对应的nginx配置,修改对应的nginx.conf文件或扩展的配置conf文件,包含内容类似如下酌情调整:

    server {
            listen          80;
            server_name  test.sopans.com;
            access_log  /var/log/nginx/test.sopans.com.access.log  main;
            root   /var/www/html/test;
            index  index.html index.htm index.php;
     
            location ~ \.php {
                    fastcgi_pass   127.0.0.1:9080;
                    fastcgi_index  index.php;
                    root   /var/www/html/test;
                    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    #               fastcgi_split_path_info ^(.+\.php)(/.*)$;
    #               fastcgi_param PATH_INFO $fastcgi_path_info;
                    include        fastcgi_params;
            }  
     
    }  

    这里需要注意一个问题,就是有的配置文件中需要指明location ~ \.php 下的root文件夹,不然这个傻子php总是找不到php文件的位置。

    经过以上设置,你可以测试一个phpinfo的文件进行测<?php echo phpinfo(); ?>

    如果没有意外我们将看到php中正确开启了jit

  • PHP8.0测试版发布

    PHP8.0测试版发布

    在PHP 庆祝 25 周年之际,PHP8.0测试版本也露出庐山面目,新的测试版本已经发布。当然其中新的期待也包括众望所归的PHP JIT 编译器.

    其中主要新的功能包括: JIT 编译器、联合类型和属性等。

    JIT 编译器

    Roose 解释称,尽管还没有基准测试,但 JIT 编译器有可能改善 PHP 的性能。不像 C 或 Java 这样的编译语言,PHP 是一种解释性语言,这意味着它会在运行时转换为机器码。JIT 在运行时编译部分代码,以便可以使用代码的编译版本。并表示,将 JIT 编译器添加到 PHP 的原因是,它可能使其能够在 Web 开发上下文之外被视为一种高性能语言,并且可以随着时间的流逝而得到改进。但是,一个很大的缺点是维护起来很复杂。

    联合类型

    联合类型是两种或多种类型的集合,表示可以使用其中任何一种。而由于 PHP 是一种动态类型的语言,因此联合类型有很多用例。

    属性

    属性在其他语言中通常称为注解,它提供了一种向类添加元数据的方法,而无需解析文档块。

    源码地址https://downloads.php.net/~pollita/

    新特性:https://github.com/php/php-src/blob/php-8.0.0alpha1/NEWS

    更新记录:https://github.com/php/php-src/blob/php-8.0.0alpha1/NEWS

  • 安装启用phpmyadmin

    1.下载phpmyadmin,可以下载到你想放置的网站目录下,前提是你的mysql、php和web服务器(nginx/httpd/litespeed/IIS等)安装好。

    wget  https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-all-languages.zip
    unzip phpMyAdmin*
    mv phpMyAdmin-5.0.2-all-languages pma

    2.查询mysql的socket地址,用于后面对接php中的设置.UNIX socket: /var/lib/mysql/mysql.sock

    mysql -u root -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 10
    Server version: 8.0.19-10 Percona Server (GPL), Release 10, Revision f446c04
    
    Copyright (c) 2009-2020 Percona LLC and/or its affiliates
    Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> STATUS;
    --------------
    mysql  Ver 8.0.19-10 for Linux on x86_64 (Percona Server (GPL), Release 10, Revision f446c04)
    
    Connection id:          10
    Current database:
    Current user:           root@localhost
    SSL:                    Not in use
    Current pager:          stdout
    Using outfile:          ''
    Using delimiter:        ;
    Server version:         8.0.19-10 Percona Server (GPL), Release 10, Revision f446c04
    Protocol version:       10
    Connection:             Localhost via UNIX socket
    Server characterset:    utf8
    Db     characterset:    utf8
    Client characterset:    utf8
    Conn.  characterset:    utf8
    UNIX socket:            /var/lib/mysql/mysql.sock
    Binary data as:         Hexadecimal
    Uptime:                 55 min 28 sec
    
    Threads: 2  Questions: 11  Slow queries: 0  Opens: 115  Flush tables: 3  Open tables: 35  Queries per second avg: 0.003
    --------------
    
    mysql> 

    3.修改php.ini中的mysqli.default_socket和pdo_mysql.default_socket设置为对应的/var/lib/mysql/mysql.sock

    vi  /etc/php.ini
    mysqli.default_socket = /var/lib/mysql/mysql.sock 
    pdo_mysql.default_socket = /var/lib/mysql/mysql.so

    你也可以设置mysql配置文件my.cnf

    vi /etc/my.cnf
    
    [client]
    socket          = /var/lib/mysql/mysql.sock
    [mysqld]
    socket          = /var/lib/mysql/mysql.sock

    至此,重启php或httpd就可以登录phpmyadmin.下一步我们讨论优化lnmp

  • 编译安装PHP7.4

    编译安装PHP7.4

    1. 安装编译libzip新版需要的CMKAE3

    wget https://cmake.org/files/v3.17/cmake-3.17.2.tar.gz
    tar xvzf cmake-3.17.2.tar.gz
    yum remove cmake*
    yum install -y gcc gcc-c++ make automake openssl-deve
    cd cmake*
    ./bootstrap
    gmake
    gmake install
    /usr/local/bin/cmake --version
    ln -s /usr/local/bin/cmake /usr/bin/
    cmake --version

    2. 安装最新版本libzip

    yum -y remove libzip-devel
    wget https://libzip.org/download/libzip-1.6.1.tar.gz
    tar -zxvf libzip-1.6.1.tar.gz
    cd libzip-1.6.1
    mkdir build
    cd build
    cmake ..
    make & make test & make install
    cd ..
    export PKG_CONFIG_PATH="/usr/local/lib64/pkgconfig/"
    ldconfig /usr/local/lib
    ldconfig /usr/local/lib64

    3.下载php7.4

    yum install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libsqlite3x-devel oniguruma-devel libcurl libcurl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel gmp gmp-devel libmcrypt libmcrypt-devel readline readline-devel libxslt libxslt-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel ncurses curl gdbm-devel db4-devel libXpm-devel libX11-devel gd-devel gmp-devel expat-devel xmlrpc-c xmlrpc-c-devel libicu-devel libmcrypt-devel libmemcached-devel
    wget https://www.php.net/distributions/php-7.4.6.tar.gz
    tar xvzf php-7.4.6.tar.gz
    cd php-7.4.6
    ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-config-file-scan-dir=/usr/local/php/conf.d --enable-fpm --with-fpm-user=www --with-fpm-group=www --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv-dir --with-freetype --with-jpeg  --with-zlib --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --enable-intl --enable-pcntl --enable-ftp --enable-gd --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --with-zip --with-zlib --enable-soap --with-gettext  --enable-opcache --with-xsl --with-pear
    make & make test & make install
    

    测试与配置

    /usr/local/php/bin/php -v

    增加系统变量,便于全局使用php命令

    vim /etc/profile

    在文件末尾加入:

    PATH=$PATH:/usr/local/php/bin
    export PATH

    配置php基础设置

    cp php.ini-production /usr/local/php/etc/php.ini
    cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
    cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
    cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
    chmod +x /etc/init.d/php-fpm
    service php-fpm start
    systemctl enable php-fpm

    至此,你可以在你的网站或目录下编辑测试文件进行测试php文件了。

    下一步我们再来介绍mysql数据库percona的源安装。