反射的常见操作 & 使用方法

反射在编程中是一个非常重要的概念,我理解的是,反射就是对目标函数、类、对象等构造结构的一种展现,并且利用反射API可以便捷的搭建一些基础类的设施(比如framework),对于反射最最常见的操作就是实例化对象,也许有人会说,我直接new一个对象不就OK了,为啥还需要这么繁琐的操作,没错,在我写这篇文章的时候其实也在思考这个问题,但是结合例子看起来,还是有区别的,如果我new一个我完全知道它内部结构的Class,那你这时再通过Reflection API去实例化确实有点脱裤子放屁的感觉,但是对于未知的一些对象实例化,就有些摸不着北了,因为你没办法知道这个将要被实例化的Class的construct方法具体需要传入哪些参数?而这时Reflection API就可以发挥很大的作用了~

以PHP为例,从5.0版本开始,PHP内置类引入了Reflection,并且包含众多的API,方便我们使用,下面介绍几种常见操作:

1、实例化对象: 针对构造方法中有参数的Class使用Reflection才有意义,没有参数确实直接new最方便

// 测试对象
class Person
{
    private $name;

    private $age;

    public function __construct($name, $age)
    {
        $this->name = $name;
        $this->age  = $age;
    }

    public function updateAge($age)
    {
        $this->age = $age;
    }

    public function desc()
    {
        return "name: $this->name, age: $this->age";
    }
}

// 实例化
$className       = Person::class;
$classReflection = new \ReflectionClass($className);
$object = $classReflection->newInstanceArgs(['George', 18]);

2、`类成员方法` or `函数`参数分析: 类的成员方法其实跟函数是一样的,只是有些许的区别,函数能独立的生存,而类成员方法是需要依托于整个类,Reflection API中的也是这样设计的,类成员方法主要借助于ReflectionMethod这个API,而函数主要借助于ReflectionFunction,两者都继承自ReflectionFunctionAbstract这个抽象类,通过这个抽象类中的getParameters()可以分析出类成员方法或函数中入参名称、所属位置、默认值等信息(类型为ReflectionParameter),以下分别对类成员方法和函数进行举例说明:

// 类成员方法
$methodName       = 'updateAge';
$methodReflection = new \ReflectionMethod($object, $methodName);
var_dump($methodReflection->getParameters()); // ReflectionParameter[]

// 函数
$function1 = function (Person $person) {
    return $person->desc();
};

$reflection = new \ReflectionFunction($function1);
$reflectionParameters = $reflection->getParameters();
var_dump($reflectionParameters);

3、类成员属性分析: 有时类成员属性也需要我们动态的进行设置(注入),通过以下例子可以实现:

$property1 = new \ReflectionProperty($className, 'name');
if (!$property1->isPublic()) {
    $property1->setAccessible(true);
}
$property1->setValue($object, 'George is not good!');

待补充…

发表在 涨姿势 | 留下评论

nginx配置一个简单的重定向页面


location ~ .* {
rewrite_by_lua '
local newDomain = "https://www.baidu.com"
local redirectUrl = newDomain..ngx.var.request_uri
ngx.header["Content-Type"] = ""
ngx.header["Refresh"] = "3; url="..redirectUrl
ngx.status = 302
ngx.say([[





已迁移至新域名 ]]..newDomain..[[


]])
';
}

发表在 nginx | 留下评论

opcache开启

1、php.ini文件中开启opcache:

[opcache]
zend_extension = /www/server/php/73/lib/php/extensions/no-debug-non-zts-20180731/opcache.so

;opcache开关
opcache.enable=1

;CLI环境下,PHP启用OPcache
opcache.enable_cli=0

;OPcache共享内存存储大小,单位MB
opcache.memory_consumption=128

;PHP使用了一种叫做字符串驻留(string interning)的技术来改善性能。例如,如果你在代码中使用了1000次字符串“foobar”,在PHP内部只会在第一使用这个字符串的时候分配一个不可变的内存区域来存储这个字符串,其他的999次使用都会直接指向这个内存区域。这个选项则会把这个特性提升一个层次——默认情况下这个不可变的内存区域只会存在于单个php-fpm的进程中,如果设置了这个选项,那么它将会在所有的php-fpm进程中共享。在比较大的应用中,这可以非常有效地节约内存,提高应用的性能。这个选项的值是以兆字节(megabytes)作为单位,如果把它设置为16,则表示16MB,默认是4MB
opcache.interned_strings_buffer=8

;这个选项用于控制内存中最多可以缓存多少个PHP文件。这个选项必须得设置得足够大,大于你的项目中的所有PHP文件的总和。
;设置值取值范围最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。也就是说在200到1000000之间。
opcache.max_accelerated_files=10000

;设置缓存的过期时间(单位是秒),为0的话每次都要检查
opcache.revalidate_freq=60

;从字面上理解就是“允许更快速关闭”。它的作用是在单个请求结束时提供一种更快速的机制来调用代码中的析构器,从而加快PHP的响应速度和PHP进程资源的回收速度,这样应用程序可以更快速地响应下一个请求。把它设置为1就可以使用这个机制了。
opcache.fast_shutdown=1

;如果启用(设置为1),OPcache会在opcache.revalidate_freq设置的秒数去检测文件的时间戳(timestamp)检查脚本是否更新。
;如果这个选项被禁用(设置为0),opcache.revalidate_freq会被忽略,PHP文件永远不会被检查。这意味着如果你修改了你的代码,然后你把它更新到服务器上,再在浏览器上请求更新的代码对应的功能,你会看不到更新的效果,强烈建议你在生产环境中设置为0,更新代码后,再平滑重启PHP和web服务器。
opcache.validate_timestamps=0

;开启Opcache File Cache(实验性), 通过开启这个, 我们可以让Opcache把opcode缓存缓存到外部文件中, 对于一些脚本, 会有很明显的性能提升.这样PHP就会在/tmp目录下Cache一些Opcode的二进制导出文件, 可以跨PHP生命周期存在.
; opcache.file_cache=/tmp

opcache.error_log=/www/wwwlogs/opcache.error.log

2、重启php-fpm服务,让配置生效(每次发布新代码都要重启)

/etc/init.d/php-fpm-73 restart

当然最好是平滑重启: /etc/init.d/php-fpm-73 reload

3、效果

参考资料:

https://www.laruence.com/2015/12/04/3086.html

https://zhuanlan.zhihu.com/p/100209787

https://zhuanlan.zhihu.com/p/75869838

发表在 涨姿势 | 留下评论

openssl生成rsa密钥对

1. openssl genrsa -out ../mycerts/rsa_private_key.pem 2048 生成rsa私钥,文本存储格式,长度2048

2. openssl rsa -in ../mycerts/rsa_private_key.pem -pubout -out ../mycerts/rsa_public_key_2048.pub 根据私钥生成对应的公钥

3. openssl pkcs8 -topk8 -inform PEM -in ../mycerts/rsa_private_key.pem -outform PEM -nocrypt > ../mycerts/rsa_private_key_pkcs8.pem 私钥转化成pkcs8格式

发表在 算法 | 留下评论

科学上网方法

安卓端:

发表在 互联网, 小技巧 | 留下评论

HTTPS双向认证配置

参考: https://zhuanlan.zhihu.com/p/269817944

基本生成步骤:
1、生成CA根证书
2、生成服务端证书
3、生成客户端证书(如果需要做双向认证的话)

1.生成根证书
# 生成root私钥
openssl genrsa -out root.key 1024

# 根据私钥创建根证书请求文件,需要输入一些证书的元信息:邮箱、域名等
# 注意: Common Name随意填写且不能跟服务端、客户端的Common Name相同,密码为空
openssl req -new -out root.csr -key root.key

# 结合私钥和请求文件,创建根证书,有效期10年
openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650

2.生成服务端证书
# 创建服务端私钥
openssl genrsa -out server.key 1024

# 根据私钥生成请求文件
# 注意: Common Name为域名或IP,密码为空
openssl req -new -out server.csr -key server.key

# 结合私钥和请求文件创建服务端证书,有效期10年
openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650

如果需要只需要部署服务端证书端话,就可以结束了。拿着server.crt公钥和server.key私钥部署在服务器上,然后解析域名到改服务器指向到IP,证书就部署成功了。

3.生成客户端证书
如果需要做双向验证的,也就是服务端要验证客户端证书的情况。那么需要在同一个根证书下再生成一个客户端证书

# 生成私钥
openssl genrsa -out client.key 1024

# 申请请求文件
# 注意: Common Name为域名或IP,密码为空
openssl req -new -out client.csr -key client.key

# 生成证书
openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650

# 生成客户端集成证书pkcs12格式的文件,方便浏览器或者http客户端访问(密码:123456)
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12

4、Nginx配置

server
{
    listen 80;
    listen 443 ssl http2;

    server_name 域名;

    index index.php index.html;

    root /www/wwwroot/web1;

    ssl_certificate  /www/server/nginx/conf/keys/server.crt; # server公钥路径
    ssl_certificate_key  /www/server/nginx/conf/keys/server.key; # server私钥路径
    ssl_client_certificate  /www/server/nginx/conf/keys/root.crt; # 根级证书公钥路径,用于验证各个二级client
    ssl_verify_client on;

    access_log  /www/wwwlogs/web1.access.log;
    error_log  /www/wwwlogs/web1.error.log;
}

5、测试验证
url –cert client.crt –key client.key -H ‘Host: 域名’ https://IP地址 -v –insecure

6、Wireshark配置与测试
1、配置SSL key的日志记录,如curl、firefox的请求https的交换密钥都会记录在里面
1、将下面的内容下入文件 ~/.bash_profile
export SSLKEYLOGFILE=/path/tls_key.log
2、生效 source ~/.bash_profile
2、配置Wireshark
情况A: 当我们使用RSA进行秘钥交互的时候, 就对RSA keys list项进行配置, 导入server端的私钥.
情况B: 当我们使用DH进行秘钥交互的时候, 就对Master Secret log filename进行配置, 导入单次会话的主密钥. 因为DH的秘钥交互过程是明文交互的, 所以只配这个,也能解开全部的密文.

发表在 http, nginx | 留下评论

离线安装Centos7系统

背景是我10年买的一台台式机,距今很久了,打算看看能不能继续用,主要是有GPU

1、USB制作启动盘: https://www.jibing57.com/2019/05/01/way-to-make-centos7-bootable-usb-on-macos/
2、设置BIOS以USB启动安装系统
3、安装显卡驱动
1、离线安装必要软件
2、下载驱动并安装

参考链接:

https://blog.csdn.net/u010048823/article/details/51306175

https://syxdevcode.github.io/2020/05/11/Centos7%20挂载iso镜像(yum离线安装)/

https://blog.csdn.net/qq_40309341/article/details/124292907

https://blog.csdn.net/hl449006540/article/details/79778748

https://askubuntu.com/questions/841876/how-to-disable-nouveau-kernel-driver

https://www.reddit.com/r/CentOS/comments/wlqqiz/what_is_the_alternative_for_running_sudo/

发表在 linux | 留下评论

PHP7 ?? 与 ?: 的作用和区别

// 判断变量$b是否存在,和isset一样,不包含值为null的情况
$a = $b ?? $c; // 等同于 $a = isset($b) ? $b : $c;

// 判断变量是否为空
$a = $b ?: $c; // 等同于 $a = !empty($b) ? $b : $c;

发表在 php | 留下评论

Nginx设置为开机启动

1.先创建开机自启脚本

cd /etc/systemd/system
vim nginx.service

内容:

[Unit]
Description=nginx service
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

2.设置开机自启动

systemctl enable nginx

3.启动nginx服务

systemctl start nginx.service

4.重新启动服务

systemctl restart nginx.service

5.查看服务当前状态

systemctl status nginx.service

6.停止开机自启动

systemctl disable nginx.service

发表在 linux, nginx | 留下评论

跨域设置Cookie不生效

场景是 a.com 中页面 标签中嵌套 b.com, 而 b.com 是设置 b.com 的 Cookie, 于是在 chrome 调试模式看到如下图的提示, 解决办法其实提示已经告诉了:

但是发现如果设置成 None 的话还需要加 Secure 即须支持 https, 果断放弃, 最终选择 Lax 的方式, 其中预加载的方式可以解决:

SameSite详细参数: https://www.cnblogs.com/tianma3798/p/13517336.html
预加载格式: https://www.w3school.com.cn/tags/tag_link.asp

发表在 跨域解决方案 | 留下评论