站内公告:

我们的虚拟社区正式开通了

Main Menu

最新帖子

#61
PHP 开发 / 报错file_get_contents(): SSL ope...
上次发布者 jvip_chen - 2022-5月-03 07:39 下午
报错内容
file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:\nerror:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed

这和本地环境有关,是否开启了ssl验证。
解决方式:修改配置,或者修改代码

$stream_opts = [
    "ssl" => [
        "verify_peer"=>false,
        "verify_peer_name"=>false,
    ]
]; 
 
$response = file_get_contents($url, false, stream_context_create($stream_opts));
#62
Linux 系统 / linux增加swap分区和删除swapfile文件的方法
上次发布者 jvip_chen - 2022-4月-29 09:42 上午
创建swapfile文件
执行命令:dd if=/dev/zero of=swapfile bs=1024 count=5000000
注:可根据实际需要更改count值的大小,这里设置5000000,大概就是4G多

dd if=/dev/zero of=swapfile bs=1024 count=500000
500000+0 records in
500000+0 records out
512000000 bytes (512 MB) copied, 0.847481 s, 604 MB/s
 ll
total 500000
-rw-r--r-- 1 root root 512000000 Sep 11 16:24 swapfile

将swapfile设置为swap空间

执行命令:mkswap swapfile

[root@dics-no iflytek]# mkswap swapfile
Setting up swapspace version 1, size = 499996 KiB
no label, UUID=bf7c48ab-d829-4291-a477-f75cdd33f72a
[root@dics-no iflytek]#

启用交换空间

执行命令:swapon swapfile

[root@dics-no iflytek]# swapon swapfile
swapon: swapfile: insecure permissions 0644, 0600 suggested.
[root@dics-no iflytek]#

查看是否增加swap分区

执行命令:free -h

[root@dics-no iflytek]# free -h
total used free shared buffers cached
Mem: 31G 918M 30G 8.3M 704K 589M
-/+ buffers/cache: 328M 30G
Swap: 488M 0B 488M
[root@dics-no iflytek]#
删除swapfile

如果创建了swapfile之后,想要删除,必须先执行以下命令
swapoff swapfile
[root@i-5608690E /]# swapoff swapfile
然后再执行删除文件操作
rm swapfile
[root@i-5608690E /]# rm swapfile
注:如果没有执行swapoff操作,就执行执行删除文件的操作,系统会报错,不给删除。swapoff相当于是卸载swap分区。
#63
Linux 系统 / Linux统计文件个数
上次发布者 jvip_chen - 2022-4月-27 05:58 下午
1.显示目录中的文件:
ls -l | grep "^-"
我们可以用wc命令进行统计:

wc [-lwm]

参数:

-l 仅列出行数;

-w 仅列出多少字(英文单字);

-R 递归列出子目录

-m 多少字符;

那么,
2.统计文件夹中文件个数
ls -l ./|grep "^-"|wc -l
3.统计文件夹中目录个数
ls -l ./|grep "^d"|wc -l
4.统计文件夹下文件个数,包括子文件
ls -lR | grep "^-"| wc -l
5.统计文件夹下目录个数,包括子目录
ls -lR | grep "^d"| wc -l
#64
PHP框架-Yii / yii2 mysql 版本_yii2 数据库版本控制 mig...
上次发布者 jvip_chen - 2022-4月-27 02:56 下午
对于在日常的开发,我们用mysql,当线下分几个小组对一个网站进行开发的时候,在线下建立表,如何同步到线上就成了一个问题。

svn git等版本控制系统,可以控制文件的版本,yii2通过migrate,来进行sql文件的上传,以及执行。

migrate的使用:

1.首先创建migrate文件,语法很简单:

./yii migrate/create test_user
执行后,就会在/console/migrations/下面生成m160511_080937_test_user.php。

下面是执行log

[root@services datacenter_1000]# ./yii migrate/create test_user

Yii Migration Tool (based on Yii v2.0.7)

Create new migration '/www/web/datacenter/datacenter_1000/console/migrations/m160511_080937_test_user.php'? (yes|no) [no]:yes

New migration created successfully.

默认的路径是在console/migrations下面。

如果执行 ./yii migrate   就会执行console/migrations 下面的sql,当然,在执行前,需要到表migration 中查看信息,然后在决定执行那些sql,执行的是文件中的up()方法里面的sql,如果是事务操作,则不适用up(),而使用safeUp()方法。

有时候我们有自己的扩展,然后把migration放到自己的扩展里面,可以通过加入参数–migrationPath=@yii/log/migrations

来创建,执行相应的数据库脚本、

./yii migrate --migrationPath=@yii/log/migrations/
同样 down() , 采用 safeDown()方法。

如下是所有这些数据库访问方法的列表:

yii\db\Migration::execute(): 执行一条 SQL 语句
yii\db\Migration::insert(): 插入单行数据
yii\db\Migration::batchInsert(): 插入多行数据
yii\db\Migration::update(): 更新数据
yii\db\Migration::delete(): 删除数据
yii\db\Migration::createTable(): 创建表
yii\db\Migration::renameTable(): 重命名表名
yii\db\Migration::dropTable(): 删除一张表
yii\db\Migration::truncateTable(): 清空表中的所有数据
yii\db\Migration::addColumn(): 加一个字段
yii\db\Migration::renameColumn(): 重命名字段名称
yii\db\Migration::dropColumn(): 删除一个字段
yii\db\Migration::alterColumn(): 修改字段
yii\db\Migration::addPrimaryKey(): 添加一个主键
yii\db\Migration::dropPrimaryKey(): 删除一个主键
yii\db\Migration::addForeignKey(): 添加一个外键
yii\db\Migration::dropForeignKey(): 删除一个外键
yii\db\Migration::createIndex(): 创建一个索引
yii\db\Migration::dropIndex(): 删除一个索引

有时,你可能只需要提交一个或者少数的几个迁移,你可以使用该命令指定需要执行的条数,而不是执行所有的可用迁移。例如,如下命令将会尝试提交前三个可用的迁移:

yii migrate 3
你也可以指定一个特定的迁移,按照如下格式使用 migrate/to 命令来指定数据库应该提交哪一个迁移:

yii migrate/to 150101_185401 # using timestamp to specify the migration 使用时间戳来指定迁移
yii migrate/to "2015-01-01 18:54:01" # using a string that can be parsed by strtotime() 使用一个可以被 strtotime() 解析的字符串
yii migrate/to m150101_185401_create_news_table # using full name 使用全名
yii migrate/to 1392853618 # using UNIX timestamp 使用 UNIX 时间戳

其他:来自于官网资料。

还原迁移

你可以使用如下命令来还原其中一个或多个意见被提交过的迁移:

yii migrate/down # revert the most recently applied migration 还原最近一次提交的迁移
yii migrate/down 3 # revert the most 3 recently applied migrations 还原最近三次提交的迁移

重做迁移

重做迁移的意思是先还原指定的迁移,然后再次提交。如下所示:

yii migrate/redo # redo the last applied migration 重做最近一次提交的迁移
yii migrate/redo 3 # redo the last 3 applied migrations 重做最近三次提交的迁移

列出迁移

你可以使用如下命令列出那些提交了的或者是还未提交的迁移:

yii migrate/history # 显示最近10次提交的迁移
yii migrate/history 5 # 显示最近5次提交的迁移
yii migrate/history all # 显示所有已经提交过的迁移
yii migrate/new # 显示前10个还未提交的迁移
yii migrate/new 5 # 显示前5个还未提交的迁移
yii migrate/new all # 显示所有还未提交的迁移

修改迁移历史

有时候你也许需要简单的标记一下你的数据库已经升级到一个特定的迁移,而不是实际提交或者是还原迁移。这个经常会发生在你手动的改变数据库的一个特定状态,而又不想相应的迁移被重复提交。那么你可以使用如下命令来达到目的:

yii migrate/mark 150101_185401 # 使用时间戳来指定迁移
yii migrate/mark "2015-01-01 18:54:01" # 使用一个可以被 strtotime() 解析的字符串
yii migrate/mark m150101_185401_create_news_table # 使用全名
yii migrate/mark 1392853618 # 使用 UNIX 时间戳
#65
Linux 系统 / Linux下使用UUID挂载2t以上硬盘
上次发布者 jvip_chen - 2022-4月-26 05:57 下午
一、查看硬盘

lsblk
选择自己要挂载的硬盘,不要选错了

二、分区

sudo parted /dev/sdb #使用parted来对GPT磁盘操作,进入交互式模式

(parted) mklabel gpt # 将MBR磁盘格式化为GPT

(parted) mkpart primary ext4 0% 100% 将所有容量分为一个主分区

(parted) p #打印当前分区

(parted) q #退出

三、格式化

sudo mkfs.ext4 /dev/sdb1
四、挂载
sudo mkdir /disk1
sudo mount /dev/sdb1 /disk1 #挂载在disk1上

五、查看UUID

sudo blkid
六、修改/etc/fstab

加入下一行

UUID=cf116c95-b7f0-4ce4-b0da-7f2856784c43 /disk1 ext4 defaults 0 2
#66
WEB前端开发 / Layui 内置方法 - layer.close(关闭特定层...
上次发布者 jvip_chen - 2022-4月-22 11:54 上午
关于它似乎没有太多介绍的必要,唯一让你疑惑的,可能就是这个index了吧。事实上它非常容易得到:

当你想关闭当前页的某个层时

var index = layer.open();
var index = layer.alert();
var index = layer.load();
var index = layer.tips();
正如你看到的,每一种弹层调用方式,都会返回一个index

layer.close(index); //此时你只需要把获得的index,轻轻地赋予layer.close即可
如果你想关闭最新弹出的层,直接获取layer.index即可

layer.close(layer.index); //它获取的始终是最新弹出的某个层,值是由layer内部动态递增计算的
当你在iframe页面关闭自身时

var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
parent.layer.close(index); //再执行关闭
#67
WEB前端开发 / layer.close()关闭弹窗
上次发布者 jvip_chen - 2022-4月-22 11:51 上午
layer.closeAll(); //疯狂模式,关闭所有层
layer.closeAll('dialog'); //关闭信息框
layer.closeAll('page'); //关闭所有页面层
layer.closeAll('iframe'); //关闭所有的iframe层
layer.closeAll('loading'); //关闭加载层
layer.closeAll('tips'); //关闭所有的tips层 
#68
Nginx服务器 / Nginx 反向代理 TCP
上次发布者 jvip_chen - 2022-4月-21 11:00 上午
Nginx 除了可以代理 HTTP 以外,其实还可以转发 TCP / UDP,但之前的版本需要通过源码编译安装 Nginx 的时候启用 Stream 模块,目前新版本的 Nginx 默认已经启用了 Stream 模块。

检查 Nginx 是否启用了 Stream 模块
nginx -V | grep with-stream # 如果有启用 Stream 模块,则会显示相关内容,这里的 Nginx 版本为 1.20.X
nginx version: nginx/1.20.1
built by gcc 10.2.1 20201203 (Alpine 10.2.1_pre1)
built with OpenSSL 1.1.1i  8 Dec 2020 (running with OpenSSL 1.1.1k  25 Mar 2021)
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-perl_modules_path=/usr/lib/perl5/vendor_perl --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-Os -fomit-frame-pointer -g' --with-ld-opt=-Wl,--as-needed
2. 修改 nginx.conf,添加 Stream 配置

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}


# 启用流转发
stream {

    log_format proxy  '$remote_addr [$time_local] '
                      '$protocol $status $bytes_sent $bytes_received '
                      '$session_time "$upstream_addr" '
                      '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';

    access_log /var/log/nginx/tcp-access.log proxy ;
    open_log_file_cache off;
    include /etc/nginx/tcp.d/*.conf;
}
3. 新建一个 tcp.d 目录,用于存放 TCP 转发配置

mkdir tcp.d && cd tcp.d
4. MySQL 转发示例配置

vi mysql.conf

upstream tcp {
    server {目标机器 IP}:3306;
}

server {
    listen 3306;
    proxy_connect_timeout 8s;
    proxy_timeout 24h;
    proxy_pass tcp;
}
5. Redis 转发示例配置

vi redis.conf

upstream tcp {
    server {目标机器 IP}:6379;
}

server {
    listen 6379;
    proxy_connect_timeout 8s;
    proxy_timeout 24h;
    proxy_pass tcp;
}
6. 启动指令 - docker 方式

docker run --name tcp-nginx -d -p 3306:3306 -p 6379:6379 -v $PWD/nginx.conf:/etc/nginx/nginx.conf -v $PWD/tcp.d:/etc/nginx/tcp.d nginx:1.20-alpine
#69
python3 开发 / Python 三元运算符
上次发布者 jvip_chen - 2022-4月-21 07:03 上午
Python 三元运算符
Python 三元运算符用于根据条件选择两个值之一。它是 if-else 语句的一个缩影,它将两个值之一分配给一个变量。

Python 三元运算符的语法是:

[statement_1] if [expression] else [statement_2]
如果表达式的计算结果为True,则选择statement_1。否则,如果表达式的计算结果为False,则选择statement_2。

您可以为statement_1和statement_2提供值、变量或语句。

提示:以下是本篇文章正文内容,下面案例可供参考


一、示例 1:使用三元运算符找出两个数字中的最大值。
以下程序中的三元运算符根据条件 a>b 分别计算为 True 或 False 来选择 a 或 b。

Python客栈送红包、纸质书

a, b = 2, 5
 
# 得到a,b的最大值
max = a if a > b else b
 
print(max) # 5;运行程序,由于 a> b 返回 False,因此选择了 b。

二、示例 2:根据条件的返回值,Python 执行打印语句之一

a, b = 2, 5
 
# 三元运算符
print('a') if a > b else print('b') # b

三、示例 3:使用嵌套的三元运算符,找到三个数字中的最大值

a, b, c = 15, 93, 22
 
# 嵌套三元运算符
max = a if a > b and a>c else b if b>c else c
 
print(max) # 93
#70
WEB前端开发 / DataTable新增序号列 自增
上次发布者 jvip_chen - 2022-4月-20 06:46 上午
切换分页也自动叠加序号
{
  "data": "no",
    orderable : false,
    className: "text-center", //居中显示
    title: "序号", //表头
    render: function (data, type, row, meta) {
        return meta.row + 1 + meta.settings._iDisplayStart; //切换分页序号 也自动叠加
      //return meta.row + 1 ; //每页序号重新排序
    }
},