标签: php

  • Debian12 安装 PHP8.3

    当前 Debian12 官方源中带的 PHP 版本是8.2,而 PHP8.2 的 Active Support 到今年年底(31 Dec 2024),所以直接装8.3吧,可以用的时间长一点。

    首先安装sury源

    #!/bin/sh
    # To add this repository please do:
    if [ "$(whoami)" != "root" ]; then
        SUDO=sudo
    fi
    ${SUDO} apt-get update
    ${SUDO} apt-get -y install lsb-release ca-certificates curl
    ${SUDO} curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
    ${SUDO} dpkg -i /tmp/debsuryorg-archive-keyring.deb
    ${SUDO} sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
    ${SUDO} apt-get update

    注意,如果安装sury源时报错:

    The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY B188E2B695BD4743

    意思是系统缺少sury源的公钥。只要把公钥下载到系统就可以了,执行以下命令添加公钥:
    wget -qO /etc/apt/trusted.gpg.d/sury-php.gpg https://packages.sury.org/php/apt.gpg
    公钥添加完成后,执行apt update刷新包列表即可。

    然后执行以下命令安装PHP8.3:

    apt install -y php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-curl php8.3-xml php8.3-imagick php8.3-zip php8.3-gd php8.3-intl php8.3-bcmath

    如果需要支持 Laravel 框架,那么最后一个 bcmath 扩展是必须的。

  • PHP 常用代码片断

    记录了一些PHP常用的代码片段,方便查阅使用。

    <?php
    // 判断请求类型
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    }
    
    //php 判断是否为 ajax 请求
    if (isset($_SERVER["HTTP_X_REQUESTED_WITH"]) && strtolower($_SERVER["HTTP_X_REQUESTED_WITH"]) == "xmlhttprequest") {
        // ajax 请求的处理方式 
    } else {
        // 正常请求的处理方式 
    }
    
    // PHP设置页面编码:
    header("Content-type:text/html; charset=utf-8");
    
    header("Content-type:application/json;charset=utf-8");
    
    // PHP获取当前时间:
    date("Y-m-d H:i:s");
    
    // PHP获取页面执行时间:
    // 在脚本最后添加
    echo microtime(TRUE) - $_SERVER['REQUEST_TIME_FLOAT'];
    
    // PHP header跳转:
    header("Location: http://www.baidu.com/");
    
    // PHP清空所有session:
    session_destroy();
    
    // 获取昨天日期
    date("Y-m-d", strtotime("-1 day"));
    
    // 当前时间:
    date('Y年m月d日 H点i分s秒', time());

     

     

  • 安装PHP 8.3

    apt install php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-curl php8.3-xml php8.3-imagick php8.3-zip php8.3-gd php8.3-intl php8.3-bcmath

    对于Laravel 需要安装 apt install php8.3-bcmath

    要把 php8.3-dom 换成 php8.3-xml

    说明:需要通过sury源来安装

    https://packages.sury.org/php/README.txt

    #!/bin/sh# To add this repository please do:
    if [ "$(whoami)" != "root" ]; then    SUDO=sudofi
    ${SUDO} apt-get update${SUDO} apt-get -y install lsb-release ca-certificates curl${SUDO} curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb${SUDO} dpkg -i /tmp/debsuryorg-archive-keyring.deb${SUDO} sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'${SUDO} apt-get update

    或:

    apt install apt-transport-httpscurl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpgsh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'apt update

    https://wiki.crowncloud.net/?How_to_Install_PHP_8_3_on_Debian_11

  • Debian安装PHP 8.1

    apt install php8.1-fpm php8.1-mysql php8.1-mbstring php8.1-curl php8.1-xml php8.1-imagick php8.1-zip php8.1-gd php8.1-intl php8.1-bcmath

    如果需要支持 Laravel 框架,那么 bcmath 扩展是必须的。

  • 关于PHP的mcrypt扩展

    PHP 的 mcrypt 扩展从 php 7.1.0 开始废弃,自 PHP7.2.0 起,会作为 pecl 扩展进行维护。

    后续,为了不折腾,凡是要用到 mcrypt 扩展的项目,一律使用 php7.0 来部署。

  • PHP7.4 升级到 PHP8.1

    由于 php7.4 马上结束维护了,所以把博客服务器 PHP 版本做了个升级,直接升级到当前的最新稳定版 PHP8.1。

    升级,直接安装PHP8.1 即可。

    PHP8.1 的安装命令如下:

    apt install php8.1-fpm php8.1-mysql php8.1-mbstring php8.1-curl php8.1-xml php8.1-imagick php8.1-zip php8.1-gd php8.1-intl php8.1-bcmath

    安装完成后,顺便开启了 PHP8.1 的 JIT,以提高性能,开启方法如下:

    编辑 php.ini,在 opcache 配置部分添加加粗的两行:

    [opcache]
    ; Determines if Zend OPCache is enabled
    opcache.enable=1
    opcache.jit=tracing
    opcache.jit_buffer_size=50M

    保存后记得重启 php8.1-fpm。

    参考链接:https://stitcher.io/blog/php-8-jit-setup

  • Hello, Laravel

    经过一周的紧张开发,又一个面向银行的内部系统总算完成了。这个系统本来打算是用 .NET 来做,但这段时间一直心心念念 Laravel 框架,就像所有趁手好用的工具一样,只要用过一次,就忘不掉她的好。

    经过简单分析,发现这个系统其实并没有复杂的业务和计算,由于是内部系统,也不存在高并发的可能,所以,对于 Laravel 是适用的。本来 .NET 开发的系统已经完成了 70% ,花了一周不到的时间就用 Laravel 重写完成了,不得不感慨开发速度之快,同时开发体验拉满。

    这么多年来,虽说 PHP 也在断断续续的用,但从没怎么把它当回事,一般的项目主要还是使用 .NET 来做。对于自由开发者来说,.NET 可谓是相当的万金油,既可以做桌面开发,也可以做 Web 开发,关键时刻还可以拿来写一写安卓移动应用。由于是静态编译型语言,性能基本够用,配合 SQL Server 数据库,基本没有做不了的项目。

    但是,自从知道 Laravel 框架后,就在慢慢地在不断了解,越了解就越被她的优雅所打动,这里我也用了优雅这个词,因为实在没有想到更好的词能描述那种感觉。直到去年,尝试用她开发了一个小项目,由于当时对 Eloquent 了解还不够深入,甚至多对多、一对多这种关系的用法还不太清楚,就强行上了,结果也还行,顺顺利利的开发完成。

    这次的项目开发,在彻底弄清了 Eloquent 之后,就果断切换到 Laravel 来开发,真的是太好用了,再也不用定义 ASP.NET 里面的那一堆堆的实体类,再也不再需要 AutoMapper,再也不用那蹩脚的表单验证,再也不用等待编译生成,等等好处无法一一言说。总之就是开发轻量了,保存即生效,刷新即可看效果,整个过程轻松加愉快,身心愉悦!

    当然,Laravel 并不是完美的,并不适用于所有场景,比如高并发场景,计算密集、IO密集型应用,对于这些场景和应用,Laravel 不是不能做,而是不够好,性能不够高!当然,这不能怪 Laravel,这是 PHP 的问题,什么时候等 PHP 进化出高性能的运行模式,那 Laravel 就是完美的。

    最后,程序语言、程序框架始终是工具,只有根据需求和场景选择合适的工具才是真理。

    后记:该项目最终使用ASP.NET Core重新开发,重业务的项目还是要使用强类型语言,懂得都懂,不解释。

  • Debian 10 PHP 7.4编译安装imagick扩展

    下载 imagick 源码,解压并进入目录

    wget https://pecl.php.net/get/imagick-3.4.4.tgz
    tar xf imagick-3.4.4.tgz
    cd imagick-3.4.4

    安装依赖

    apt install -y libmagickcore-dev libmagickwand-dev autoconf

    进入 imagick 代码目录后执行 phpize

    /usr/local/php/php74/bin/phpize

    配置

    ./configure --with-php-config=/usr/local/php/php74/bin/php-config --with-imagick=/usr/local/imagemagick

    编译安装

    make && make install

    编译安装完成后会显示扩展模块编译到了哪个目录,记录下这个目录的路径,以便在 php.ini 中进行配置,我这里是 /usr/local/php/php74/lib/php/extensions/no-debug-non-zts-20190902/

    配置 php.ini

    extension_dir = "/usr/local/php/php74/lib/php/extensions/no-debug-non-zts-20190902/"
    extension=imagick.so

    保存并退出,重启 php-fpm 即可。

  • PHP-FPM和Nginx使用Unix Domain Socket通讯

    第一步,创建 unix domain sock 文件

    cd /run
    mkdir php && cd $_
    touch php7.4-fpm.sock
    chown www-data:www-data php7.4-fpm.sock
    chmod 777 ./php7.4-fpm.sock

    第二步,配置 php-fpm

    cd /usr/local/php/php74/etc/php-fpm.d
    vi www.conf

    listen = 127.0.0.1:9074 改为 listen = /run/php/php7.4-fpm.sock

    保存后,执行systemctl restart php7.4-fpm重启 php-fpm 。

    第三步,配置 nginx

    fastcgi_pass 127.0.0.1:9074;改为fastcgi_pass unix:/run/php/php7.4-fpm.sock;

    保存后,执行nginx -s reload使 nginx 配置生效。

    PS. 可以把 Unix Domain Socket 文件放到 /dev/shm 下以提高性能。因为这个目录不在硬盘上,而是在内存里。

    PS. 这么改完之后,一定记得所有用到这个 PHP-FPM 的站点,nginx 配置都要做如上修改,不然网站就访问不了了。

  • Debian10编译PHP7.4问题记录

    系统镜像是基于阿里云的 Debian10.6。

    configure参数:

    ./configure --prefix=/usr/local/php/php74 --enable-gd --with-curl --enable-fpm --enable-cgi --with-openssl --enable-mbstring --with-pdo-mysql --with-zlib --with-zip --with-mysqli --enable-opcache --enable-mysqlnd --with-libxml --with-jpeg --with-freetype --with-pdo-sqlite --with-sqlite3 --enable-cli --enable-shared --enable-exif
    

    问题记录

    问题:
    configure: error: Package requirements (openssl >= 1.0.1) were not met:
    No package ‘openssl’ found

    解决:

    apt install libssl-dev

    问题:
    configure: error: Package requirements (sqlite3 > 3.7.4) were not met:
    No package ‘sqlite3’ found

    解决:
    apt-get install libsqlite3-dev

    问题:
    configure: error: Package requirements (libcurl >= 7.15.5) were not met:
    No package ‘libcurl’ found

    解决:
    apt-get install libcurl4-gnutls-dev

    问题:
    configure: error: Package requirements (oniguruma) were not met:
    No package ‘oniguruma’ found

    解决:
    apt install libonig-dev

    问题:
    configure: error: Package requirements (libzip >= 0.11 libzip != 1.3.1 libzip != 1.7.0) were not met:
    No package ‘libzip’ found

    解决:
    apt-get install libzip-dev

    另外,编译时遇到 virtual memory exhausted: Cannot allocate memory 的错误,这是由于阿里云的镜像默认没开启swap的原因,创建一个 swap 内存再编译即可。

    总结一下,在阿里云提供的 debina10 镜像上编译安装 PHP7.4 ,必须安装的依赖有:

    apt install -y  libssl-dev libsqlite3-dev libcurl4-gnutls-dev libonig-dev  libzip-dev

    一点感想:与 CentOS7 相比,Debian10 安装一些依赖非常方便,不用像 CentOS 一样要到处找源,要安装“野包”才能编译。