作者: admin

  • 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 配置都要做如上修改,不然网站就访问不了了。

  • CentOS7 升级 Mysql 到 5.7.32

    升级mysql服务端

    yum update mysql-server

    然后升级数据

    mysql_upgrade -uroot -p

    顺便把客户端版本也升级了

    yum update mysql

    最后用 SELECT @@version; 查看版本。

    注意:我这里是小版本升级,没备份直接升了。如果跨主版本建议先做数据备份再升级。

  • 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 一样要到处找源,要安装“野包”才能编译。

  • WordPress 代码高亮插件

    一直想做这个事情,但又觉得可有可无,就一直拖到现在。这几天事情不多,今天下午突然想起来这事,不如把它实现了。

    在 plugins 目录新建文件夹 MyHighlight ,然后在 MyHighlight 文件夹下新建文件 MyHighlight .php ,代码如下:

    <?php 
    /*
    Plugin Name: MyHighlight 
    Plugin URI: https://lwbj.cn
    Description:代码高亮插件
    Version: 1.1
    Author: wujie
    Author URI: https://wujie.me
    License: GPL
    */
    
    function add_my_plugin_stylesheet() {
        wp_register_style('highlight', '//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.4.1/styles/atom-one-light.min.css');
        wp_enqueue_style('highlight');
    }
    add_action( 'wp_print_styles', 'add_my_plugin_stylesheet' );
    
    function add_my_plugin_script() {
        wp_register_script('highlight','//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.4.1/highlight.min.js');
        wp_enqueue_script('highlight');
    }
    add_action( 'wp_enqueue_scripts', 'add_my_plugin_script' );
    
    function init_highlighting() { ?>
        <style>
            @import url('https://fonts.googleapis.com/css?family=Fira+Code&display=swap');
            .hljs{ background:transparent; }
            code {
                font-family: 'Fira Code', consolas,'Microsoft YaHei', monospace;
                background: #dcd7ca;
                border-radius: 0.2rem;     
                padding: 0.3rem 0.4rem 0.3rem 0.4rem;
                font-size: 0.8em;
            }
            
            .wp-block-code code, kbd, pre, samp {
                font-family: 'Fira Code', consolas,'Microsoft YaHei', monospace;
                font-size: 0.5em;
                padding: 0.4rem 0.6rem;
                white-space: pre-wrap;
            }     
        </style>
        <script>
            hljs.initHighlightingOnLoad();
        </script>
    <?php
    }
    add_action('wp_head', 'init_highlighting');

    保存后,到后台启用该插件即可看到效果。

    备注:2025.3.1已改为prismjs实现代码高亮。

  • 解决apache内存占用过高的问题

    Windows 服务器上的 Apache2.4 占用内存过高,在没有什么请求的情况下,启动服务没一会就占用300多M。

    解决办法:

    打开httpd.conf,把Include conf/extra/httpd-mpm.conf前面的注释掉去(如下图),重启服务即可。

    这样修改后,Apache会使用httpd-mpm.conf里面的配置,当然,也可以在里面进行更精细的调优。重启服务之后,可以看到内存占用是正常的,内存大小随负载的增高而变化。

  • WordPress的最佳固定链接

    WordPress提供了六种固定链接结构,前五种是固定结构,最后一种是可以自定义的结构。既然提供了不同的选择,自然就有不同的适用场景,这两天我一直在思考这个问题。

    第一种类型,朴素型,https://example.com/?p=123,这种类型以前是WordPress的默认类型。这种结构的固定链接,没有任何语义性,人类和搜索引擎都无法理解链接中包含的信息,所以不建议使用。

    第二种类型,日期和名称型,链接结构如下https://example.com/2019/12/28/sample-post/,这种类型强调日期。一天发布多篇文章的网站可以使用这种,比如新闻性质的网站或企业博客等,可以通过日期来判断文章的时效性。WordPress目前默认的固定链接就是这种类型。使用这种链接类型的企业博客网站之一微软官方博客(用的是WordPress),因为一天可能发布多篇文章,所以使用了这种类型。

    第三种类型, 月份和名称型 ,https://example.com/2019/12/sample-post/,这种类型的固定链接和第二种差不多,强调月份,用于发布不是特别频繁并且需要明确大体日期的站点,例如个人博客、技术网站等。WordPress创始人Matt Mullenweg的博客就是使用的这种类型。

    第四种是数字型,即https://example.com/archives/123,这种类型如同第一种,不过把URL参数变成了目录结构的形式。由于链接没有任何语义,不推荐这种。

    第五种是文章名型,即https://example.com/sample-post/,链接只有postname一种元素,这种类型不强调时间,不强调时效性,只注重文章的关键信息。而且修改文章的发布时间、目录等属性不影响固定链接的构成,同时由于只有一个层级,对搜索引擎的权重相对高,方便提取关键信息,对于人类也很容易读懂。注重SEO和营销类型的网站可以使用这种

    第六种,自定义类型,通过使用不同的标记来自定义链接的结构。

    总体来说,对于个人博客,比较适合的类型是第五种和第三种。个人博客,适合使用年月进行归档,就像按年份和月份建立文件夹一样,把某年某月的文章整理到一起。在做外链或者做记录的时候,看到链接就能知道文章的发布年月和标题,做到心中有数,虽然有时候并不希望这样。 第五种也不错,简单纯粹,除了post-name,再无其它干扰,并且URL更短,层级最小,更利于搜索引擎抓取,修改文章的一些属性不会影响固定链接。

    最后一点,固定链接一旦确定下来,就不要换来换去。一但更改,对于站内链接和站外链接的修复都很麻烦,如果注重SEO的话,对于SEO也是灾难。当然这些问题都有应对的办法,不过为了不折腾,选择了就坚持下去,只管写文章,再不用考虑这个问题。

  • 修改wordpress twentytwenty主题的中文显示效果

    今天没什么事,把博客主题的文字显示效果做了修改。之前默认的字体和行距是为英文优化的,显示英文很完美,但是显示中文就不怎么好看,字体粗行距小,看起来糊成了一片。

    修改样式有三种方式,一种是直接修改主题的样式文件style.css,但这种方式有缺点,在主题更新后,自己所做的修改就被覆盖了,每次更新都要改一次,麻烦了点。好处是在后台编辑器里面也能实现和前台看到的相同的文字效果。

    第二种方式是使用“自定义—额外CSS”功能,把自定义样式写进额外CSS里就能实现想要的效果了,而且更新主题无影响。缺点是后台编辑器还是默认字体,无法实现和前台一致的效果。不过这也无所谓,后台只有自己在看,前台阅读体验好就行了。

    还有另外一种方式是使用子主题功能,既能做到更新无影响又能实现前后台文字显示效果一致,但我感觉,这个还是有点过于麻烦了,不想折腾,就没有尝试。

  • CentOS7.3编译安装PHP7.4.1

    PHP最近发布了最新版本7.4.1,这几天早就想把博客升级到最新版本了,但一直没时间弄。今晚正好没事,就想升级一下,于是开启了一晚上的折腾之路,一直折腾到凌晨3点多才弄好,下面把过程记录一下。


    一、编译前准备

    PHP7.4.1的libzip依赖要求0.11版本以上,由于CentOS7.3自带的是libzip-0.10.1,不满足要求, 所以要先升级libzip。本来在编译PHP7.3的时候,已经源码编译安装过libzip-1.2.0,在PHP7.3的时候可以正常编译通过,但是到了PHP7.4就会报错找不到libzip这个包No package 'libzip' found,怎么编译都不行,试过修改环境变量PATH,试过1.5.2最新版,统统都不行。在这个问题上浪费了大量的时间,通过大量的搜索摸索,最后通过使用第三方源才安装成功。第三方源使用的是remi源,在搜索的过程中,知道这个源用的还挺多的,使用方式如下:

    这种使用remi源升级libzip的这一部分已不是最佳做法,请查看后面2020年3月20的更新。使用remi源安装只能解决这一个版本的问题,到了PHP7.4.2版本以后就编译不通了。

    1. 添加remi源

      rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
    2. 使用yum安装libzip5-devel-1.5.2,–enablerepo=remi表示启用remi源

      yum --enablerepo=remi install libzip5-devel-1.5.2-1.el7.remi.x86_64

      经网友留言提示,这里最好使用:

      yum --enablerepo=remi install libzip5-devel

      因为上面那句会由于会更新导致失效。

    这样就安装好了libzip的最新版本,这版本应该足够以后升级PHP使用了。


    2020年3月20日更新:

    可以通过源码安装的形式升级libzip,而不必使用第三方的源,因为到了PHP7.4.2以后,使用remi源安装的libzip,在编译PHP代码的时候,会报错。而使用源码安装的libzip则没有问题。使用源码安装方式如下:

    wget https://nih.at/libzip/libzip-1.2.0.tar.gz
    tar -xvf libzip-1.2.0.tar.gz
    cd libzip-1.2.0
    ./configure && make && make install

    这样安装好了之后,在PHP configure的时候还是找不到我们安装的libzip,解决这个问题的方法有两种:

    第一种,在PHP configure命令的参数最后添加一项PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/ 即:

    // 这里只是演示,省略了中间的参数
    ./configure ... PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/

    第二种,在编译完libzip-1.2.0之后,紧接着执行一句:

    export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig/"

    这两种都是告知系统,要到/usr/local/lib/pkgconfig/路径中寻找依赖,因为我们编译好的libzip就在这个路径中。到这里,升级libzip完成。


    由于这台服务器之前编译过PHP7.3,一些基础的依赖都已经安装好了,所以这里只针对PHP7.4.1安装两个必要的依赖库,命令如下:
    yum install -y libsqlite3x-devel.x86_64 oniguruma-devel

    基础编译环境的配置完成。


    二、编译

    PHP7.4的configure配置参数有些已经更改,在网上查到已知的变动如下:

    --with-gd 改为 --enable-gd
    --with-freetype-dir 改为 --with-freetype
    --with-jpeg-dir 改为 --with-jpeg
    --with-webp-dir 改为 --with-webp
    --with-xpm-dir 改为 --with-xpm
    --with-libxml-dir 改为  --with-libxml 
    --enable-zip 改为 --with-zip
    --enable-zlib-dir 改为 --with-zlib

    最终的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 \
    PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/

    如果之前执行过
    export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig/"
    那么最后一句可以去掉。

    configure完成之后,执行make && make install

    编译安装完成。


    、配置

    把php.ini拷贝到php7.4目录下,当前目录是在PHP7.4.1的源代码目录下。

    cp php.ini-development /usr/local/php/php74/lib/php.ini
    #下面是为了使用service命令来管理 
    cd sapi/fpm
    cp init.d.php-fpm /etc/init.d/php74-fpm
    chmod 755 /etc/init.d/php74-fpm

    这样配置好之后,就可以正确使用service php74-fpm xxx命令了。php74-fpm开机自启动通过编辑/etc/rc.d/rc.local实现:
    vi /etc/rc.d/rc.local

    #!/bin/bash
    touch /var/lock/subsys/local
    /usr/bin/setterm -blank 0 || true
    /etc/init.d/php56-fpm start
    /etc/init.d/php73-fpm start
    /etc/init.d/php74-fpm start
    /etc/init.d/nginx start

    最后需要执行一下ldconfig

    如果使用systemd来管理,可以参照下面的做法:

    cd sapi/fpm
    cp php-fpm.service /lib/systemd/system/php74-fpm.service
    vi /usr/lib/systemd/system/php74-fpm.service
    ProtectSystem=full 改成 ProtectSystem=false 改完后保存退出
    #上面修改了系统服务,要使用这个命令重载系统服务
    systemctl daemon-reload  
    #加入开机启动
    systemctl enable php74-fpm.service
    #启动服务
    systemctl start php74-fpm.service

    配置PHP-FPM:

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

    在我的环境中,因为装了多个PHP版本,所以还需要修改下php-fpm的端口,编辑www.conf:
    vi /usr/local/php/php74/etc/php-fpm.d/www.conf

    listen = 127.0.0.1:9000 
    改为 
    listen = 127.0.0.1:9074 

    php.ini的配置,把时区改为东八区,编辑php.ini:
    vi /usr/local/php/php74/lib/php.ini

    date.timezone = "Asia/Shanghai"

    配置mysql的socket,不然连不上数据库

    mysqli.default_socket =
    改为
    mysqli.default_socket = /var/lib/mysql/mysql.sock
    pdo_mysql.default_socket= 
    改为
    pdo_mysql.default_socket= /var/lib/mysql/mysql.sock

    四、扩展安装

    wordpress需要用到imagick扩展,这个扩展之前已经编译过。

    这里再简单记录一下,进入imagick的源代码目录
    cd ~/imagick-3.4.4

    因为以前编译过,所以这里要清除编译缓存重新生成:make clean,不然编译完,执行php -m会看到如下警告信息

    [root@104 bin]# ./php -m
    PHP Warning:  PHP Startup: imagick: Unable to initialize module
    Module compiled with module API=20180731
    PHP    compiled with module API=20190902
    These options need to match in Unknown on line 0

    编译安装,以下命令在 ~/imagick-3.4.4下执行

    /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

    make install后有个路径要记录下,用于配置php.ini中的extension_dir

    Installing shared extensions:/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

    最后,启动php74-fpm:service php74-fpm start

    修改本站的nginx的配置文件,把php-fpm的端口改为9074,并重新加载nginx配置文件:service nginx reload

    至此,PHP7.4.1编译安装全部完成,网站可以访问了。

  • 灰度屏清屏

    <?xml version="1.0" encoding="utf-8"?>
    <config.boo>
      <content>
        <channel setSize="0" />
      </content>
    </config.boo>

    发这个xml过去,把节目都清了

    然后133.xml这个文件里面的 <channel action=”add” guid=”xxx”>

    现在的channel标签没有带guid属性, 就相当于每次都会往配置文件里面添加一个节目了, 所以会有问题

  • windows 安装自己开发的.NET Windows服务

    安装

    %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe  C:\Windows\service\tiegepushservice.exe

    卸载

    %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe    C:\Windows\service\tiegepushservice.exe   /u