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