小伍

小伍 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 个人简介什么都没有

个人动态

小伍 发布了文章 · 4月14日

Docker PHP 安装扩展

编写 Dockerfile

vim Dockerfile
FROM php:7.3-fpm

ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"

RUN chmod +x /usr/local/bin/install-php-extensions && sync && \
    install-php-extensions bcmath bz2 calendar exif gd gettext gmp igbinary imagick memcached mongodb mysqli pcntl pdo_mysql pdo_pgsql pgsql redis shmop sockets swoole sysvmsg sysvsem sysvshm wddx xhprof xsl zip

RUN install-php-extensions @composer

构建镜像并运行

$ docker build -t my-php .

$ docker run -itd --name php -p 9001:9000 \
-v /mnt/website/prod/project-name:/var/www/html \
my-php:latest

支持的扩展

ExtensionPHP 7.2PHP 7.3PHP 7.4PHP 8.0
amqp
apcu
apcu_bc
bcmath
bz2
calendar
cmark
csv
dba
decimal
ds
enchant
ev
excimer
exif
ffi
gd
gearman
geoip
geospatial
gettext
gmagick
gmp
gnupg
grpc
http
igbinary
imagick
imap
interbase
intl
ioncube_loader
json_post
ldap
mailparse
maxminddb
mcrypt
memcache
memcached
mongodb
mosquitto
msgpack
mysqli
oauth
oci8
odbc
opcache
opencensus
parallel
pcntl
pcov
pdo_dblib
pdo_firebird
pdo_mysql
pdo_oci
pdo_odbc
pdo_pgsql
pdo_sqlsrv
pgsql
propro
protobuf
pspell
raphf
rdkafka
recode
redis
seaslog
shmop
smbclient
snmp
snuffleupagus
soap
sockets
solr
sqlsrv*
ssh2
swoole
sysvmsg
sysvsem
sysvshm
tensor
tidy
timezonedb
uopz
uuid
wddx
xdebug
xhprof
xlswriter
xmlrpc
xsl
yaml
yar
zip
zookeeper
zstd

已有的内置扩展

$ docker run --rm php:7.3-fpm php -m
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
ftp
hash
iconv
json
libxml
mbstring
mysqlnd
openssl
pcre
PDO
pdo_sqlite
Phar
posix
readline
Reflection
session
SimpleXML
sodium
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

[Zend Modules]

参考:https://github.com/mlocati/do...

查看原文

赞 0 收藏 0 评论 0

小伍 发布了文章 · 4月14日

Nginx 配置 ssl 证书

Nginx 配置

cd /usr/local/nginx/conf
mkdir cert
# 上传证书到此目录
cd cert

vim /usr/local/nginx/conf/sites/yourdomain.com.conf
server {
    #如果使用Nginx 1.15.0及以上版本,用listen 443 ssl代替listen 443和ssl on
    listen 443 ssl;
    
    #需要将yourdomain.com替换成证书绑定的域名
    server_name yourdomain.com;
    root  /example.com/public;
    index index.html index.htm;
    
    #证书文件的名称
    ssl_certificate cert/cert-file-name.pem;
    
    #证书密钥文件的名称
    ssl_certificate_key cert/cert-file-name.key;
    ssl_session_timeout 5m;
    
    #表示使用的加密套件的类型
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    
    #表示使用的TLS协议的类型
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    
    location / {
        try_files $uri $uri/;
    }
}

# 可选:设置HTTP请求自动跳转HTTPS。
server {
    listen 80;
    
    #需要将yourdomain.com替换成证书绑定的域名
    server_name yourdomain.com;
    
    #将所有HTTP请求通过rewrite指令重定向到HTTPS
    rewrite ^(.*)$ https://$host$1;
    location / {
        try_files $uri $uri/;
    }
}
如果使用的是云服务器,须在安全组页面,配置放行80端口和443端口,否则网站访问可能出现异常。

虚拟主机可选:设置HTTP请求自动跳转HTTPS。

vim .htaccess

RewriteEngine On
RewriteCond %{HTTP:From-Https} !^on$ [NC]
#需要将yourdomain.com替换成证书绑定的域名
RewriteCond %{HTTP_HOST} ^(www.)?yourdomain.com$ [NC]
#需要将yourdomain.com替换成证书绑定的域名
RewriteRule ^(.*)$ https://www.yourdomain.com/$1 [R=301,L]

重启Nginx服务

cd /usr/local/nginx/sbin
./nginx -s reload

验证是否安装成功

访问证书的绑定域名验证该证书是否安装成功。

https://yourdomain.com 

如果网页地址栏出现小锁标志,表示证书已经安装成功。

查看原文

赞 0 收藏 0 评论 0

小伍 发布了文章 · 4月13日

使用 Docker 运行 Portainer 可视化管理工具

# 创建数据卷
docker volume create portainer_data

# 运行portainer容器
docker run -d \
-p 8000:8000 -p 9000:9000 \
--name=portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce

curl localhost:9000

在浏览器中访问portainer:

http://localhost:9000

查看所有运行中的容器:

docker ps

通过容器名称停止容器:

docker container stop portainer

通过容器名称移除容器:

docker container rm portainer
查看原文

赞 0 收藏 0 评论 0

小伍 发布了文章 · 4月13日

使用 Docker 运行 elasticsearch 容器

# 搜索elasticsearch镜像
docker search elasticsearch

# 拉取elasticsearch镜像
docker pull elasticsearch

# 查看所有镜像
docker images

# 运行elasticsearch容器,-d 后台运行容器并打印出容器ID,-p 将容器的9200端口映射到主机的9200端口
docker run -d --name es \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
elasticsearch:7.6.2

curl localhost:9200

在浏览器中访问并显示elasticsearch信息:

http://localhost:9200

查看所有运行中的容器:

docker ps

通过容器名称停止容器:

docker container stop es

通过容器名称移除容器:

docker container rm es
查看原文

赞 0 收藏 0 评论 0

小伍 发布了文章 · 4月12日

使用 Docker 运行 Tomcat 容器

# 搜索tomcat镜像
docker search tomcat

# 拉取tomcat镜像
docker pull tomcat

# 查看所有镜像
docker images

# 运行nginx容器,-d 后台运行容器并打印出容器ID,-p 将容器的8080端口映射到主机的3355端口
docker run -d -p 3355:8080 --name tomcat01 tomcat

# 进入容器
docker exec -it tomcat01 /bin/bash

# 进入容器拷贝文件
cd /usr/local/tomcat/
cp -r webapps.dist/* webapps/
exit

在浏览器中访问并显示 tomcat 的默认页:

http://localhost:3355

查看所有运行中的容器:

docker ps

通过容器名称停止容器:

docker container stop tomcat01

通过容器名称移除容器:

docker container rm tomcat01
查看原文

赞 0 收藏 0 评论 0

小伍 发布了文章 · 4月12日

Laravel Tinker 的使用

Laravel Tinker 简介

在原生 PHP 中,可以通过 php -a 命令使用交互式 Shell:

# php -a
php > $msg = "Hello world!";
php > print $msg;
Hello world!
php > $num = array_sum([1, 2, 3]);
php > print $num;
6

此外,还可以使用 PsySH ,相较于原生的 php -a,PsySH 拥有更多高级特性,功能更加强大。

通过 Composer 全局安装:

composer g require psy/psysh:@stable

然后在命令行执行 psysh 即可进入交互式 Shell 了(需确保全局 Composer 的 bin 目录在系统路径中),在 PsySH 中可以编写各种代码,打印语句、计算表达式、编写函数等等。

Laravel Tinker 就是基于 PsySH 实现的,通过 Tinker,我们可以在命令行中实现与 Laravel 应用的各种交互,包括数据库的增删改查。

在命令行中通过 php artisan tinker 即可进入 Laravel Tinker 的交互式 Shell。

查看帮助文档

在 Laravel Tinker 中,doc 命令可用于查看某个函数或方法的帮助文档,例如,查看辅助函数 config() 如何使用:

doc config

show config

运行 Artisan 命令

运行 php artisan tinker 就相当于从控制台启动了 Laravel 应用,在运行交互式命令前,tinker 命令会添加一些命令到 Shell,这些命令定义在 Laravel\Tinker\Console\TinkerCommand$commandWhitelist 属性中:

protected $commandWhitelist = [
    'clear-compiled', 'down', 'env', 'inspire', 'migrate', 'optimize', 'up',
];

因此,可以在 Tinker Shell 中直接运行这些命令:

>>> inspire
>>> env

测试 Laravel 代码

可以使用控制台来创建一个新的模型,将其保存到数据库,然后查询这条记录。

php artisan tinker
>>> migrate
>>> use App\User;
>>> $user = new User();
>>> $user->name = "test";
>>> $user->email = "test@163.com";
>>> $user->password = bcrypt('123456');
>>> $user->save();
>>> $user = User::where('email', 'test@163.com')->first();
>>> factory(User::class, 3)->create();
>>> 
>>> $user = App\User::find(1);
>>> $user->delete();
>>> 
>>> $log = app('log');
>>> $log->info('test');
查看原文

赞 1 收藏 1 评论 0

小伍 发布了文章 · 4月12日

Laravel 记录日志

日志配置文件所在位置: config/logging.php

Log::emergency($message);  // 系统不可用信息
Log::alert($message);  // 警报提醒、必须立刻处理
Log::critical($message);  // 严重错误
Log::error($message);  // 运行时错误
Log::warning($message);  // 警告、异常
Log::notice($message);  // 提醒、重要的信息
Log::info($message);  // 普通信息
Log::debug($message);  // 调试信息

Log::info('User failed to login.', ['id' => $user->id]);
查看原文

赞 0 收藏 0 评论 0

小伍 发布了文章 · 4月11日

Laravel Artisan 命令行的使用

基础使用

# 列出所有可用命令
php artisan list

# 查看命令帮助
php artisan help migrate

编写命令

php artisan make:command SendEmails
# app/Console/Commands/SendEmails.php

namespace App\Console\Commands;

use App\User;
use App\DripEmailer;
use Illuminate\Console\Command;

class SendEmails extends Command
{
    /**
     * 命令行的名称及签名
     */
    protected $signature = 'email:send {user}';

    /**
     * 命令行的描述
     */
    protected $description = 'Send drip e-mails to a user';

    public function __construct()
    {
        parent::__construct();
    }

    /**
     * 命令运行内容
     */
    public function handle(DripEmailer $drip)
    {
        $drip->send(User::find($this->argument('user')));
    }
}
命令参数和选项
// 必填参数
email:send {user}

// 可选参数
email:send {user?}

// 带有默认值的可选参数
email:send {user=foo}

// 选项,传入即为true,否则为false
email:send {user} {--queue}

// 接收选项值
email:send {user} {--queue=}

// 选项的默认值
email:send {user} {--queue=default}

// 选项简写
email:send {user} {--Q|queue}

// 输入数组;php artisan email:send foo bar
email:send {user*}

// 选项数组;php artisan email:send --id=1 --id=2
email:send {user} {--id=*}

// 输入说明
email:send
    {user : The ID of the user}
    {--queue= : Whether the job should be queued}
获取输入
$userId = $this->argument('user');

$arguments = $this->arguments();

$queueName = $this->option('queue');

$options = $this->options();
编写输出
# 输出文本
$this->line('Display this on the screen');

# 输出信息
$this->info('Display this on the screen');

# 输出错误
$this->error('Something went wrong!');

# 输出表格
$headers = ['Name', 'Email'];
$users = App\User::all(['name', 'email'])->toArray();
$this->table($headers, $users);

# 输出进度条
$users = App\User::all();
$bar = $this->output->createProgressBar(count($users));
$bar->start();
foreach ($users as $user) {
    $this->performTask($user);
    $bar->advance();
}
$bar->finish();

注册命令

# app/Console/Kernel.php

// 手动注册命令
protected $commands = [
    Commands\SendEmails::class
];

// 自动扫描目录注册命令
protected function commands()
{
    $this->load(__DIR__.'/Commands');
    require base_path('routes/console.php');
}
查看原文

赞 0 收藏 0 评论 0

小伍 发布了文章 · 4月11日

RSA 算法基础之-案例篇

计算秘钥

1、随机选择两个不相等的质数p和q(例如选择3和11)

2、计算p和q的乘积 n=p×q=3×11=33

3、根据“欧拉函数”介绍过的公式代入计算n的欧拉函数值

φ(n)=(p-1)(q-1)
φ(33)=(3-1)×(11-1)=2×10=20

4、随机选择一个整数e,条件是1<e<φ(n),且e与φ(n)互质。在1到20之间,随机选择7,即e=7

5、因为e与φ(n)互质,根据求模反元素的公式模反元素d为:

ed≡1(mod φ(n))
7d≡1(mod 20)
7d≡21
d=3

6、将n和e封装成公钥,n和d封装成私钥

n=33,e=7,d=3
所以公钥就是(33,7),私钥就是(33,3)
其中,n的长度就是密钥长度,33写成二进制是100001

一共有6位,所以这个密钥就是6位。

加密过程

假设甲要发送一串秘密数字m=5给乙,乙发送了一个公钥(n,e)=(33,7)给甲。甲根据以下公式及公钥对密文m加密成c :

me ≡ c(mod n)

代入相关的值后为:

c = me mod n = 57 mod 33 = 78125 mod 33 = 14

甲将使用公钥加密的密文c=14发送给乙。

解密过程

乙收到密文后,使用私钥(n,d)=(33,3)根据以下公式进行解密:

cd = m(mod n)

代入相关的值后为:

m = cd mod n = 143 mod 33 = 78125 mod 33 = 5

乙使用私钥成功计算出密文m。

安全性

从始至终,用来解密的私钥(n,d)=(33,3)一直都在乙处,从未泄露。乙给甲的仅仅是用来加密的公钥(33,7),这个公钥并不能用来解密,即使被他人截获,也没有任何泄密的风险。

密钥组成与加解密公式

数值项说明
np*q,p、q均为质数且需保密
n的欧拉函数值φ(n) = (p-1)(q-1)
e条件是1<e<φ(n),且e与φ(n)互质
dd = e-1 (mod φ(n))
公钥(n,e)
私钥(n,d)
加密公式c = me mod n
解密公式m = cd mod n
查看原文

赞 0 收藏 0 评论 0

小伍 发布了文章 · 4月11日

RSA 算法基础之-概念篇

一、RSA算法

在加解密信息的过程中,使用的加密密钥(公钥)与解密密钥(私钥)不同,即:

  1. 甲要传密信给乙,乙先根据某种算法得出本次与甲通信的公钥与私钥;
  2. 乙将公钥传给甲(公钥可以让任何人知道,即使泄露也没有任何关系);
  3. 甲使用乙给的公钥加密要发送的原文m,将密文c发送给乙;
  4. 乙使用自己的私钥解密密文c,得到原文m。

这种加密模式被称为“非对称加密算法”。从始至终,私钥一直都在信息接收方乙处,只要乙自己不泄露出去,私钥就没有泄露的可能。

二、质数与互质数

一个大于1的自然数,除了1和它本身外,不能被其他自然数整除(除0以外)的数称之为质数(素数);否则称为合数

例如,15=3×5,所以15不是质数;13=13×1,以外不能为其它任何两个整数的乘积,所以13是一个质数;1不是质数,也不是合数。

公约数只有1的两个数,叫做互质数。判断或选取互质数的方法/定理有很多,如下所示:

  1. 任意两个质数一定构成互质数(如3与11、53与61);
  2. 大数是质数的两个数一定是互质数(如97与88);
  3. 一个质数如果不能整除另一个合数,这两个数为互质数;即一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系(如3与10、5与26);
  4. 1和任何一个自然数在一起都是互质数;
  5. 相邻的两个自然数是互质数(如15与16);
  6. 相邻的两个奇数是互质数(如49与51)

在RSA算法中,我们通常使用以上第1条与第2条,即选取两个本身都是质数的数作为互质数,而以上第2条定理对于计算欧拉函数值有着积极作用。

三、模运算

模运算的定义如下:让m去被n整除,用所得的余数作为结果,就叫做模运算

10 mod 3 = 1
26 mod 6 = 2
28 mod 2 = 0

四、同余

“≡”是数论中表示同余的符号,同余的定义如下:

给定一个正整数m,如果两个整数a和b满足a-b能被m整除,即(a-b) mod m = 0,那么就称整数a与b对模m同余,记作 a≡b(mod m),同时可成立a mod m=b

同余与模运算是不同的:a≡b(mod m) 仅可推出 b=a mod m

五、欧拉函数

欧拉函数本身需要一系列复杂推导,本文仅介绍对认识RSA算法有帮助的部分:任意给定正整数n,计算在小于等于n的正整数之中,有多少个与n构成互质关系?计算这个值的方法就叫做欧拉函数,以φ(n)表示

例如,在1到8之中,与8形成互质关系的是1、3、5、7,所以φ(n)=4 。

在RSA算法中,需要明白欧拉函数对以下定理成立:

  1. 如果n可以分解成两个互质的整数之积,即n=p×q,则有:φ(n)=φ(pq)=φ(p)φ(q)
  2. 根据“大数是质数的两个数一定是互质数”可以知道:一个数如果是质数,则小于它的所有正整数与它都是互质数;所以如果一个数p是质数,则有:φ(p)=p-1

所以,如果我们知道一个数n可以分解为两个质数p和q的乘积,则有:

φ(n)=(p-1)(q-1)

六、欧拉定理与模反元素

欧拉函数的用处,在于欧拉定理。“欧拉定理”指的是:如果两个正整数a和n互质,则n的欧拉函数φ(n)可以让下面的等式成立:

aφ(n) ≡ 1(mod n)

也就是说,a的φ(n)次方被n除的余数为1,模反元素的推导过程如下:

image.png

即,如果两个正整数a和n互质,那么一定可以找到整数b,使得ab-1被n整除,或者说ab被n除的余数是1

查看原文

赞 0 收藏 0 评论 0

认证与成就

  • 获得 10 次点赞
  • 获得 2 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 2 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2020-09-24
个人主页被 4.3k 人浏览