IT开发与技术
IT 云技术记录与分享
首页
关于
文章分类
常用标签
您正在查看: PHP 分类下的文章

部分场合下需要对通讯数据进行简单的加密,在接受端又需要解密,可以使用下面的方法,无依赖直接实现可逆的加解密功能。

function encrypt($string, $operation, $key = 'fo_34r3=rKjjg') {
$key = md5($key);
$key_length = strlen($key);
$string = $operation == 'D' ? base64_decode($string) : substr(md5($string . $key), 0, 8) . $string;
$string_length = strlen($string);
$rndkey = $box = array();
$result = '';
for ($i = 0; $i <= 255; $i++) {
    $rndkey[$i] = ord($key[$i % $key_length]);
    $box[$i] = $i;
}
for ($j = $i = 0; $i < 256; $i++) {
    $j = ($j + $box[$i] + $rndkey[$i]) % 256;
    $tmp = $box[$i];
    $box[$i] = $box[$j];
    $box[$j] = $tmp;
}
for ($a = $j = $i = 0; $i < $string_length; $i++) {
    $a = ($a + 1) % 256;
    $j = ($j + $box[$a]) % 256;
    $tmp = $box[$a];
    $box[$a] = $box[$j];
    $box[$j] = $tmp;
    $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
if ($operation == 'D') {
    if (substr($result, 0, 8) == substr(md5(substr($result, 8) . $key), 0, 8)) {
        return substr($result, 8);
    } else {
        return'';
    }
} else {
    return str_replace('=', '', base64_encode($result));
}}

需要加密时:

$result = encrypt("string","E")

需要解密时:

$result = encrypt("string","D")

这是一段简易的生成随机字符串的 function,可以指定需要的长度,通常用于 AppKey,AppSecret,邀请码的生成。

function generateNonceStr($length=6){
    // 密码字符集,可任意添加你需要的字符
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    $str = "";
    for($i = 0; $i < $length; $i++)
    {
        $str .= $chars[mt_rand(0, strlen($chars) - 1)];
    }
    return $str;
}

本文记录下载最新版的 PHP7.4.6 的编译过程,系统环境为 Unbutn 16.04 x64。

安装依赖库

apt install libxml2-dev
apt install libreadline-dev
apt install libzip-dev
apt install libssl-dev
apt install libsqlite3-dev
apt install pkg-config
apt install open-ssl
apt install libpng-dev
可选:
apt-get install libevent2-dev -y    

libevent2 如果 apt 安装失败,可以使用源码编译,官网地址:https://libevent.org/
编译顺序:./configure,make,make install

其他几个需要编译安装的库:
bzip2:https://sourceforge.net/projects/bzip2/
curl:https://curl.haxx.se/download.html
onig:https://github.com/kkos/oniguruma/releases
bzip 和 curl 的编译安装方法:./configure,make,make install
onig 也是一样,只是完成后需要给 libonig.so.5 文件做个软链接:

ln -s /usr/local/lib/libonig.so.5 /usr/lib/libonig.so.5

编译 PHP

./configure \
--prefix=/opt/programs/php \
--with-config-file-path=/opt/programs/php/etc \
--enable-fpm \
--with-fpm-user=www-data \
--with-fpm-group=www-data \
--enable-inline-optimization \
--disable-debug \
--disable-rpath \
--enable-shared \
--enable-soap \
--with-libxml \
--with-xmlrpc \
--with-openssl \
--with-sqlite3 \
--with-zlib \
--enable-bcmath \
--with-iconv \
--with-bz2 \
--enable-calendar \
--with-curl \
--with-cdb \
--enable-dom \
--enable-exif \
--enable-fileinfo \
--enable-filter \
--enable-ftp \
--enable-gd \
--with-openssl \
--with-jpeg \
--with-webp \
--with-zlib \
--with-freetype \
--enable-gd-jis-conv \
--with-gettext \
--with-mhash \
--enable-json \
--enable-mbstring \
--enable-mbregex \
--enable-pdo \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-pdo-sqlite \
--with-readline \
--enable-pcntl \
--enable-session \
--enable-shmop \
--enable-simplexml \
--enable-sockets \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--with-zip \
--enable-mysqlnd-compression-support \
--enable-opcache

configure 过程会检测相应的包是否齐全,如果出现错误,寻找对应的包安装上即可。
这里在 make 之前,遇到了找不到 phar.phar 文件的错误,所以先这样:

cp /opt/php-source/php-7.4.6/ext/phar/phar.php /opt/php-source/php-7.4.6/ext/phar/phar.phar

然后再 make && make install

修改环境变量

编译成功后,将 php 的 bin 目录写入环境变量 /etc/profile 中:

export PATH="/opt/programs/php/bin:$PATH"

保存后:

source /etc/profile

安装其他库

1)event 库
安装步骤:

phpize
./configure 
make
make install

2) redis 库
安装步骤:

phpize
./configure
make
make install

修改 PHP 配置

最后根据需要,修改 php.ini 文件,新增如下内容:

extension_dir="/opt/programs/php/lib/php/extensions/no-debug-non-zts-20190902"
extension=redis
extension=event
zend_extension=opcache.so

创建 Init 启动文件,便于管理 php-fpm

cp sapi/fpm/init.d.php-fpm /etc/init.d/php7.4-fpm
chmod +x /etc/init.d/php7.4-fpm
#启动php-fpm
/etc/init.d/php7.4-fpm start