Author: admin

laravel 如何覆盖composer的 vendor类文件?

作为 Laravel 开发人员,你可能遇到过这样的情况:你不喜欢 vendor 文件夹某个包中的某些代码,并且想要更改它。你可以直接在该文件中更改它。但问题是当你点击composer update命令升级包时很容易覆盖已修改的vendor类文件。
那么有什么解决办法呢?
感谢Composer,它具有覆盖任何包/类的功能。Composer 使用PSR-4来加载类。因此,在 composer.json 中,你可以提及从哪些文件或文件夹加载类。同样你也可以排除加载它。

操作步骤:

windows用户

排除文件

请参考下面的示例以了解我如何从包tymon/jwt-auth 中排除 1个文件

"exclude-from-classmap": ["vendor\\tymon\\jwt-auth\\src\\Middleware\\BaseMiddleware.php"],

在上面的例子中可以看出我已经排除了BaseMiddleware.php文件。你必须将此行放在composer.json的autoload段中。这里要注意的一件事是,我在路径中有双反斜杠,那是因为在 Windows 机器上,并且因为它是 JSON 文件,所以我必须在那里转义 (\) ,即写上双反斜杠。

包含文件以覆盖vendor

现在我们已经排除了我们想要覆盖的文件,现在需要包含有更改的新文件,以便 composer 知道要包含哪些文件。

为此,向 composer.json 中的 'psr-4' …

        

如何优化symfony(PHP)的性能

Symfony 很快,开箱即用。但是,如果按照以下性能检查表中的说明优化服务器和应用程序,则可以加快速度。

性能优化清单

使用这些清单来验证您的应用程序和服务器是否已配置为获得最高性能:

    

使用 NGINX 将环境变量注入静态网站

静态站点生成非常适合发布文档。在最近的一个项目中,我们选择使用 NGINX 作为 Web 服务器来托管 HTML 和 CSS 文件。但是,我们还希望使用 SSO 保护站点。这就是事情变得有点困难的地方。

当然,当使用 HTTP 基本身份验证以外的 SSO 机制时,我们需要向用户显示“退出”按钮。但是当与静态站点生成 (SSG) 结合使用时,我们还不知道注销 URI,因为它可能取决于部署的特定配置。

为了实际渲染按钮,我们面临两个选择:

  1. 不在 CI 中运行 SSG 工具,而是在 Docker 容器启动时运行。
  2. 呈现没有 URI 的链接,并让 Web 服务器在运行时注入它。

在我们的例子中,SSG 工具是 Jekyll,所以添加它的整个 Ruby 工具链会违背使用 NGINX 的目的:尽可能轻量级。此外,这个巨大的图像会创造更多的攻击面。[1]

新姿势!Redis中调用Lua脚本以实现原子性操作

背景:有一服务提供者Leader,有多个消息订阅者Workers。Leader是一个排队程序,维护了一个用户队列,当某个资源空闲下来并被分配至队列中的用户时,Leader会向订阅者推送消息(消息带有唯一标识ID),订阅者在接收到消息后会进行特殊处理并再次推往前端。

问题:前端只需要接收到一条由Worker推送的消息即可,但是如果Workers不做消息重复推送判断的话,会导致前端收到多条消息推送,从而影响正常业务逻辑。…

    

Redlock(redis分布式锁)原理分析

Redlock:全名叫做 Redis Distributed Lock;即使用redis实现的分布式锁;

使用场景:多个服务间保证同一时刻同一时间段内同一用户只能有一个请求(防止关键业务出现并发攻击);

 

官网文档地址如下:https://redis.io/topics/distlock

这个锁的算法实现了多redis实例的情况,相对于单redis节点来说,优点在于 防止了 单节点故障造成整个服务停止运行的情况;并且在多节点中锁的设计,及多节点同时崩溃等各种意外情况有自己独特的设计方法;

 

此博客或者官方文档的相关概念:

1.TTL:Time To Live;只 redis key 的过期时间或有效生存时间

2.clock drift:时钟漂移;指两个电脑间时间流速基本相同的情况下,两个电脑(或两个进程间)时间的差值;如果电脑距离过远会造成时钟漂移值 过大

 

最低保证分布式锁的有效性及安全性的要求如下:

1.互斥;任何时刻只能有一个client获取锁

2.释放死锁;即使锁定资源的服务崩溃或者分区,仍然能释放锁

3.容错性;只要多数redis节点(一半以上)在使用,client就可以获取和释放锁

 

网上讲的基于故障转移实现的redis主从无法真正实现Redlock:

因为redis在进行主从复制时是异步完成的,比如在clientA获取锁后,主redis复制数据到从redis过程中崩溃了,导致没有复制到从redis中,然后从redis选举出一个升级为主redis,造成新的主redis没有clientA 设置的锁,这是clientB尝试获取锁,并且能够成功获取锁,导致互斥失效;

思考题:这个失败的原因是因为从redis立刻升级为主redis,如果能够过TTL时间再升级为主redis(延迟升级)后,或者立刻升级为主redis但是过TTL的时间后再执行获取锁的任务,就能成功产生互斥效果;是不是这样就能实现基于redis主从的Redlock;

 

redis单实例中实现分布式锁的正确方式(原子性非常重要):

1.设置锁时,使用set命令,因为其包含了setnx,expire的功能,起到了原子操作的效果,给key设置随机值,并且只有在key不存在时才设置成功返回True,并且设置key的过期时间(最好用毫秒)

SET key_name my_random_value NX PX 
        

移除无用的Composer加载文件,以提升性能。

一些PHP项目通过Composer安装了一些组件 ,其中有一些是针对特定PHP版本或PHP扩展的polyfill,如果我们的PHP版本满足安求,相关的PHP扩展也已安装好 。那么就不需要安装这些polyfill了。

我们可以通过移除这些polyfill,以减少自动加载的文件数量,达到优化性能的目的。

示例:

请在项目的composer.json中加入如下以下内容:即可移除对应的无用组件,减少加载时间。

"replace": {
"symfony/polyfill-apcu": "*",
"symfony/polyfill-php80": "*",
"symfony/polyfill-mbstring": "*",
"symfony/polyfill-ctype": "*",
"symfony/polyfill-php73": "*",
"symfony/polyfill-php72": "*",
"symfony/polyfill-php81": "*"
},