比较优雅的个性签名推荐
1、只愿你眉眼如初风华如故2、愿我是阳光,明媚而不忧伤3、我将悲欢和酒饮念你平生一展眉4、我的山水落在你的眉间5、凤凰涅槃金鹏展翅待我重出江湖时6、笑叹浮生若梦追忆年华似水7、愿世间美好都如约而至8、晚风吻尽荷花叶任我醉倒在池边9、你活在人间 等于罪恶滔天10、巴黎铁塔下一颗烂草东京樱花下一朵残花11、更相不敌莫让青许两白头12、不愿放手只想到白头13、路是我选的我愿颠沛流离14、恰好那天风烟俱净阳光正好15、ヮ随风飞舞的发丝ヮ风情万种的霓裳16、给我一杯清酒说笑着说别回头17、懂得珍惜才配拥有 懂我心伴我久18、你的感情像彩虹我伸开手却只能握到风19、但愿来日方长不是匆匆一场20、你的笑能抵过风霜是我见过最美的太阳
查看详情点赞评论收藏浏览852023-05-25 11:22:29Go 接入RabbitMq实操
基本概念什么是消息队列消息队列是一种应用(进程)间的通信方式。生产者只需把消息发布到MQ,消费者只需重MQ中取出,可靠传递由消息队列中的消息系统来确保。消息队列有什么用消息队列是一种异步协作机制,最根本的用处在于将一些不需要即时生效的操作拆分出来异步执行,从而达到可靠传递、流量削峰等目的。比如如果有一个业务需要发送短信,可以在主流程完成之后发送消息到MQ后,让主流程完结。而由另外的线程拉取MQ的消息,完成发送短信的操作。常用的消息队列常用的MQ大概有ActiveMQ、RabbitMQ、RocketMQ、KafkaActiveMQ,基于Java优点:对Java的JMS支持最好;多线程并发;缺点:历史悠久,版本更新慢。现在慢慢用的少了;RabbitMQ,基于Erlang优点:生态丰富,是现在主流的MQ;支持多种客户端、支持AJAX;缺点:对想深入源码的Java选手不太友好;RocketMQ,基于Java优点:为海量数据打造;主张拉模式;天然集群、HA、负载均衡;缺点:生态较小Kafka,基于Scala优点:分布式高可拓展;高性能;容错强缺点:消息重复;乱序;维护成本高什么是RabbitMQ消息中间件erlang:一种并发函数式语言AMQP:Advanced Message Queuing Protocol,高级消息队列协议。由Exchange、Queue和Bind组成RabbitMQ是一个erlang开发的AMQP实现生产者将消息发送到Exchange上,通过Exchange从而Binding到Queues上。Exchange有三种具体类型:direct:如果消息中的RoutingKey和Binding中的BindingKey一致就转发fanout:消息被分发到所有队列中topic:将RoutingKey和队列的模式进行匹配应用场景异步可以理解为将遇到非必须的业务时,立即响应客户端,不关系业务何时完成比如在用户注册时,有将信息写入数据库和发送注册成功邮件两项业务。数据库写入完成即标志着用户注册成功,此时如果继续处理发送邮件的业务,会给客户端带来不必要的等待时间。引入消息队列后,在队列中写入完成注册的消息后,即可完成整个注册流程。至于邮件,可以等到邮件业务从消息队列中取出消息再发送。把不紧急的业务从主线中剥离出来,主线不必考虑不紧急的业务何时完成的时候,可以考虑使用消息队列实现异步。解耦考虑两个系统间存在消息传递,一个系统的故障会影响到整个业务的正常运转。可以用消息队列来保证消息可靠传递比如一个订单系统和一个库存系统,完成订单之后,需要进行库存调度。考虑到如果库存系统故障,会引起已完成的订单消息的丢失,而做很多异常处理会使业务变得臃肿。这个时候可考虑引入消息队列,使用消息队列保证可靠传输,从而减少业务逻辑。削峰考虑短时间的大量请求,可能会带来内存溢出、大面积连接超时等情况,使得服务器崩溃。引入消息队列后,可以控制请求到业务处理系统的流量,从而防止崩溃现象的出现。比如秒杀场景。大量请求同时涌入,服务器不能分配足够的资源响应,或者带宽不足,导致宕机。可以引入消息队列来限流,MQ通过限制同一时间的出口消息,使得流量在服务器能够承受的范围之内。等待一部分请求处理完成之后,再向业务处理系统导入新的消息。----------------------------------------------------------------------------------------------------------------------------------------昨天我们用docker在虚拟机上装了RabbitMq,今天我们就开始用它来实际操作一下。不说废话了,我们开始搞,我这里用的是Go语言。首先,我们先封装方法:package rabbitmq import ( "fmt" "github.com/streadway/amqp" ) type RabbitMq struct { Conn *amqp.Connection Ch *amqp.Channel QueueName string // 队列名称 ExchangeName string // 交换机名称 ExchangeType string // 交换机类型 RoutingKey string // routingKey } type QueueAndExchange struct { QueueName string // 队列名称 ExchangeName string // 交换机名称 ExchangeType string // 交换机类型 RoutingKey string // routingKey } func (r *RabbitMq) ConnMq() { conn, err := amqp.Dial("amqp://admin:123456@192.168.11.66:5672/my_vhost") if err != nil { fmt.Printf("连接mq出错,错误信息为:%v\n", err) return } r.Conn = conn } func (r *RabbitMq) CloseMq() { err := r.Conn.Close() if err != nil { fmt.Printf("关闭连接出错,错误信息为:%v\n", err) return } } // 开启channel通道 func (r *RabbitMq) OpenChan() { ch, err := r.Conn.Channel() if err != nil { fmt.Printf("开启channel通道出错,错误信息为:%v\n", err) return } r.Ch = ch } // 关闭channnel通道 func (r *RabbitMq) CloseChan() { err := r.Ch.Close() if err != nil { fmt.Printf("关闭channel通道出错,错误信息为:%v\n", err) } } // 生产者 func (r *RabbitMq) PublishMsg(body string) { ch := r.Ch // 创建队列 ch.QueueDeclare(r.QueueName, true, false, false, false, nil) // 创建交换机 ch.ExchangeDeclare(r.ExchangeName, r.ExchangeType, true, false, false, false, nil) // 队列绑定交换机 ch.QueueBind(r.QueueName, r.RoutingKey, r.ExchangeName, false, nil) // 生产任务 ch.Publish(r.ExchangeName, r.RoutingKey, false, false, amqp.Publishing{ ContentType: "text/plain", Body: []byte(body), DeliveryMode: amqp.Persistent, }) } // 创建实例 func NewRabbitMq(qe QueueAndExchange) RabbitMq { return RabbitMq{ QueueName: qe.QueueName, ExchangeName: qe.ExchangeName, ExchangeType: qe.ExchangeType, RoutingKey: qe.RoutingKey, } } 接下来我们就我们创建的生产者发送消息:package main import ( "test_rabbitmq/rabbitmq" "test_rabbitmq/utils" ) func main() { qe := rabbitmq.QueueAndExchange{ QueueName: "test_queue", ExchangeName: "test_exchange", ExchangeType: "direct", RoutingKey: "test_routingKey", } mq := rabbitmq.NewRabbitMq(qe) mq.ConnMq() mq.OpenChan() defer func() { mq.CloseMq() }() defer func() { mq.CloseChan() }() test_map := map[string]interface{}{ "mail": "9527@qq.com", "msg": "今天大太阳", } //这里我们发送100条消息 for i := 0; i < 100; i++ { mq.PublishMsg(utils.MapToStr(test_map)) } } 我们可以看到,发送的消息已经在队列当中了。然后我们开始消费消息:package main import ( "fmt" "net/http" "github.com/gin-gonic/gin" "github.com/streadway/amqp" ) func main() { router := gin.Default() router.GET("/", func(c *gin.Context) { c.String(http.StatusOK, "Hello World") }) router.Run(":8081") } func init() { conn, err := amqp.Dial("amqp://admin:123456@192.168.11.66:5672/my_vhost") fmt.Println(err) defer conn.Close() ch, err_ch := conn.Channel() fmt.Println(err_ch) defer ch.Close() ch.Qos(1, 0, false) deliveries, err := ch.Consume("test_queue", "consumer", false, false, false, false, nil) if err != nil { fmt.Println(err) } //消费成功delivery.Ack(true) for delivery := range deliveries { delivery.Ack(true) body := string(delivery.Body) fmt.Println(body) fmt.Printf("%T\n", body) } } 然后我们可以看到数据已经取出来了,队列的消息也已经消费了。
查看详情点赞5评论收藏2浏览822023-05-24 10:27:24Linux centos系统Docker安装 RabbitMq
首先要去docker仓库查找镜像,我们需要下载能可视化操作界面的rabbitMq,所以下载的是management版本。接下来,先建目录,主要是为了存放数据:#建目录 mkdir /server/rabbitmq/data接下来下载rabbitMq镜像:#拉镜像 docker pull rabbitmq:management #启动命令: docker run -d --name rabbitmq \ -p 5672:5672 -p 15672:15672 \ -v /server/rabbitmq/data:/var/lib/rabbitmq \ -e RABBITMQ_DEFAULT_VHOST=my_vhost \ -e RABBITMQ_DEFAULT_USER=admin \ -e RABBITMQ_DEFAULT_PASS=123456\ -m 300m \ --memory-swap=600m \ rabbitmq:management问题:go连接RabbitMQ "no access to this vhost"错误docker exit -it container_name /bin/sh rabbitmqctl add_vhost admin rabbitmqctl set_permissions -p 用户名 admin "." "." ".*"连接的时候指定对应的vhostamqp.Dial("amqp://username:password@ip:5672/admin”)
查看详情点赞1评论收藏浏览512023-05-23 17:44:17Linux centos系统设置静态IP、动态IP
我们装了虚拟机很多时候都需要设置静态IP,不然我们的程序会经常因为IP改变造成各种各种的麻烦。一般默认的是动态IP#进入目录: cd /etc/sysconfig/network-scripts #查看网卡 ll #打开网卡,我这边是ifcfg-enp0s3 vi ifcfg-enp0s3 #这是默认的动态IP,网卡设置 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=dhcp DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=enp0s3 UUID=fdeb4637-a424-4d21-82dd-467bd70e3f35 DEVICE=enp0s3 ONBOOT=yes修改为静态IPTYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static IPADDR=192.168.11.66 NETMASK=255.255.255.0 GATEWAY=192.168.11.1 DNS1=114.114.114.114 DNS2=61.139.2.69 DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=enp0s3 UUID=fdeb4637-a424-4d21-82dd-467bd70e3f35 DEVICE=enp0s3 ONBOOT=yes改完保存后,重启网络systemctl restart network主要是加这一段:BOOTPROTO=static IPADDR=192.168.11.66 NETMASK=255.255.255.0 GATEWAY=192.168.11.1 DNS1=114.114.114.114 DNS2=61.139.2.691、BOOTPROTO设置静态static,默认是dhcp2、NETMASK:子网掩码3、GATEWAY:默认网关4、DNS,默认是8.8.8.8下面怎么查找这些数据我虚拟机用的是网络桥接模式:
查看详情点赞1评论收藏浏览512023-05-23 10:13:04CentOS、Ubuntu、Debian 的区别
第一篇Linux 有非常多的发行版本,从性质上划分,大体分为由商业公司维护的商业版本与由开源社群维护的免费发行版本。商业版本以 Redhat 为代表,开源社群版本则以 debian 为代表。这些版本各有不同的特点,在不同的应用领域发挥著不同的作用,不能一概而论。而绝大多数 VPS 上只提供开源社群维护的发行版本。下面就这些不同的 Linux 发行版进行简单的分析。UbuntuUbuntu 近些年的粉丝越来越多,Ubuntu 有著漂亮的使用者介面,完善的包管理系统,强大的站群软件源支援,丰富的技术社群,Ubuntu 还对大多数硬体有著良好的相容性,包括最新的图形显示卡等等。这一切让 Ubuntu 越来越向大众化方向发展。但别忘了:你所需要的只是一个简约、稳定、易用的站群服务器系统而已!Ubuntu 的图形介面固然漂亮,但这也决定了它最佳的应用领域是桌面操作系统而非站群服务器操作系统。如何你希望在学习 Linux 的过程中有个沉浸式的环境,那么 Ubuntu 的确不错:仅仅安装在自己的电脑中而非站群服务器中。从这一点来讲,Ubuntu 并没有在 VPS 安装的操作系统选择之列,相信你也不会为了那数百 M 的驱动与宝贵的内存买单。CentOS你会发现非常多的商业公司部署在生产环境上的站群服务器都是使用的 CentOS 系统,CentOS 是从 RHEL 原始码编译的社群重新发布版。CentOS 简约,命令列下的人性化做得比较好,稳定,有著强大的英文文件与开发社群的支援。与 Redhat 有著相同的渊源。虽然不单独提供商业支援,但往往可以从 Redhat 中找到一丝线索。相对 debian 来说,CentOS 略显体积大一点。是一个非常成熟的 Linux 发行版。Debian一般来说 Debian 作为适合于站群服务器的操作系统,它比 Ubuntu 要稳定得多。可以说稳定得无与伦比了。debian 整个系统,只要应用层面不出现逻辑缺陷,基本上固若金汤,是个常年不需要重启的系统(当然,这是夸张了点,但并没有夸大其稳定性)。debian 整个系统基础核心非常小,不仅稳定,而且占用硬碟空间小,占用内存小。128M 的 VPS 即可以流畅执行 Debian,而 CentOS 则会略显吃力。但是由于 Debian 的发展路线,使它的帮助文件相对于 CentOS 略少,技术资料也少一些。由于其优秀的表现与稳定性,Debian 非常受 VPS 使用者的欢迎。此外还有 Arch Linxu、Gentoo、Slackware 等一系列的 Linux 和 FreeBSD、Unix 等系统,由于其涉及领域更加专业,很少在 VPS 中出现,因此不作介绍。对于初学者,我们建议采用 CentOS 或 Debian,这两种系统都能在配置较低的 VPS 上流畅执行。但是如果 VPS 配置太低(OPENVZ 内存在 128M 以下,或者 XEN 架构内存在 192M 以下),建议采用 Debian;否则建议采用 CentOS,以获取更多的线上帮助与支援,让自己入门更轻松。第二篇CentOS、Ubuntu、Debian 三个 linux 都是非常优秀的系统,开源的系统,也分付费的商业版和 free 免费版本,下面简单比较这三种系统。CentOS 系统很多网站 WP 站长一般都选择 centOS 系统,CentOS 是从 redhat 原始码编译重新发布版。CentOS 去除很多与站群服务器功能无关的应用,系统简单但非常稳定,命令列操作可以方便管理系统和应用,并且有帮助文件和社群的支援。Ubuntu 系统Ubuntu 有亮丽的使用者介面,完善的包管理系统,强大的站群软件源支援,丰富的技术社群,并且 Ubuntu 对计算机硬体的支援好于 centos 和 debian,相容性强,Ubuntu 应用非常多,但对于站群服务器系统来说,个人感觉并不需要太多的各种应用程式,需要的是稳定,操作方便,维护简单的系统。如果你需要在站群服务器端使用图形介面,ubuntu 是一个不错的选择,你需要注意的是,图形介面占用的内存非常大,而内存越大的 vps 价格也越高。Debian 系统Debian 也非常适合做站群服务器操作系统,与 Ubuntu 比较,它没有太多的花哨,稳定压倒一切,对于站群服务器系统来说是一条不变的真理,debian 这个 linux 系统,底层非常稳定,核心和内存的占用都非常小,在小内存的 VPS 就可以流畅执行 Debian,比如 128m 的内存,但 debian 的帮助文件和技术资料比较少。对于小内存,首选 debian,对于非常熟悉 linux 系统的 vps 高手,首选 debian。在系统的选择上,属于新手,首选 CentOS,并不是 centos 比 Debian 和 ubuntu 好,而是 centos 是初学者安装 vps 的首选,它既稳定,占用资源又少,在互联网上能方便搜寻到安装配置的文件,自身的帮助文件也非常强大;如果你是 linux 高手,高手的境界一般都选择 debian,因为高手能在低配的 vps 上稳定执行系统;而 ubuntu,系统虽然免费,但它适合有钱人玩,它占用的资源是比前面两种系统更高,而 vps 基本就是卖内存,内存越高,价格越贵。我们执行著一些全球最大的网际互联网的营运,因此我们对可靠性和稳定性非常重视,是我们的第一要务。为此,我们只使用 Linux 来支撑顾客的系统。但是,我们应该使用哪一个 Linux 的发行版?答案是,CentOS。 为什么呢?作为一个庞大的系统运营商,在很长的一段时间里,我们需要在多种大型系统中找到一个可靠的,可预测的系统,我们需要从世界上最强大的站群软件供应商和开源专案中获得强有力的支援。对于那些最常用的系统,我们需要文件,工具和全球性资源。正因如此,RedHat / CentOS 系列发行版正是我们的选择。他们能够满足以上所有需求,而且问题相对较少、长期稳定,这使得我们能够为成千上万的执行了不同配置、服务和应用的系统提供世界级的维护。RedHat Enterprise Linux (RHEL) 是黄金标准的企业发行版。它每五年左右更新一次,在系统的稳定性,前瞻性和安全性上有著极大的优势。每当新的主版本发行后,比如 5.x 亦或最近的 6.x,所有版本和程式码都将保留不变,只有安全问题或是主要的 bug,例如后门,埠之类的问题,会通过释出新的子版本来修复。CentOS 是 RHEL 发行版对应的开源版本,通常在 RedHat 的释出后就会很快发行。我们使用 CentOS 的原因在于 RHEL 发行版的标准支援服务费用非常高,大约每台站群服务器 800 美元左右,对于我们很多拥有数十台甚至上百台站群服务器的使用者来说,这是必须要控制的成本。RHEL/CentOS 系统有两个潜在的问题:首先,一旦确定了主版本,, 除了安全问题和严重故障会被修复以外,其他内容将不会做任何改变。这虽然对稳定性有好处,但是对许多服务不利。比如 MySQL 和 PHP 服务,它们在这五年的 CentOS/RHEL 主版本释出周期中会进行繁重的开发和大量的修改。例如,MySQL5.0 是当前 RHEL/CentOS 主版本所预设使用的版本,但是当前 MySQL 已经更新到 5.1 和 5.5 版本了。幸运的是,这个问题被 Yum 站群软件包管理器轻易地解决了。如此以来,那些主要的站群软件,例如当前 RHEL/CentOS 中实际的元件,包括核心和所有工具等仍然来自发行版, 但是那些附加的站群软件,例如 Nginx,Apache,PHP,Java 和 MySQL 等等来自更新的站群软件源例如 Fedora; 或者直接从开发商获取更新的版本例如 MySQL。 在我们这里,我们有自己专用的安装镜像站群来全自动的处理所有这些事情。其次,CentOS 的发行会滞后于 RedHat 的发行,包括关键的补丁和修复。这在 RHEL 6.x 的发行周期中尤为显著。但是根据我们的经验,这没什么好担心的,对我们来说永远不会成为问题。很多人询问我们为什么不用基于 Debian 的系统,例如 Debian 或者 Ubuntu 站群服务器。如果在别无选择的情况下,我们的确会支援这个建议,但是根据我们的经验来看,这些系统并不如 RHEL/CentOS 来的稳定和可靠。我们认为,这在某种程度上是由于他们过快的发展和各个版本、组合之间较少的测试且不成熟所导致的。然而尽管他们非常流行,但是主要的服务商和专案都仍然首选 RHEL/CentOS 系统,因为这样他们就可以为企业顾客提供服务,(对 Oracle 和 MySQL 更是如此)。除此之外,基于 Debian 的系统有许多核心和稳定性问题,尤其是在我们的云端计算服务中。对我们而言,唯一使用 Debian/Ubuntu 的原因是:“它们能够为一个系统提供必要的特殊服务时,尤其是当一些驱动程式或者一些 IO 子系统需要一种新的核心的时候”。例如,ext4 档案系统或在最近的核心中日志的改变等;现在,所有这一切都包含在了 RHEL/CentOS6.x 中。当然,多数 Linux 开发者都使用的是 Ubuntu 的桌面版,而且可以理解的是,他们更倾向在开发生产时使用相同的系统,并且还能使用很多有趣的工具。但总体上来说,我们依然认为 RHEL/CentOS 是一个更优越的部署平台,并且已经有十多个客户成功地转向使用 CentOS 作为生产环境并且没有任何问题,但这仍然是艰巨的任务。总的来说,你将更乐于看到一个良好管理的 CentOS 系统。我们有成千上万台站群服务器使用 CentOS 平台,而每年平均只有一台站群服务器崩溃。我们也很难想象它竟如此罕见,所以,挑一个优秀、迅捷、可靠的平台吧!
查看详情点赞评论收藏浏览432023-05-22 15:13:00JS 获取当前IP,城市定位
突然奇想,想做一个获取当前的IP,然后可以做一些客户端的埋点之类的。网上查了很多资料,确实有很多办法可以实现。首先,用百度地图,高德地图的api是肯定可以取得你当前的IP,定位,城市的。我也试了一下可以实现,但是要注册账号之类一堆还是算是麻烦的。然后我也测试了几个记录了下来。1、获取当前IP$.ajax({ url:'https://api.ipify.org?format=jsonp', type:'GET', dataType:'jsonp', success:function(data){ console.log(data); } })这个可以获取到当前的IP,这里是外网IP{ip: '188.25.0.66'}2、获取当前IP,城市因为之前百度可以直接输入IP查找,我也测试了一下。确实也比较方便,暂时也没有太多次数限制。 $.ajax({ url:'https://qifu-api.baidubce.com/ip/local/geo/v1/district', type:'GET', dataType:'application/json', success:function(data){ console.log(data); } })返回结果{ "code": "Success", "data": { "continent": "亚洲", "country": "中国", "zipcode": "610015", "timezone": "UTC+8", "accuracy": "城市", "owner": "中国电信", "isp": "中国电信", "source": "数据挖掘", "areacode": "CN", "prov": "四川省", "city": "成都市", "district": "" }, "charge": false, "msg": "查询成功", "ip": "188.25.0.66", "coordsys": "WGS84" }
查看详情点赞2评论1收藏浏览972023-05-21 20:39:11Docker-compose 一键部署 Nginx+PHP+MySql+Redis 环境
经过上面docker分别单独部署,nginx,PHP,mysql,redis服务。今天经过半天终于用docker-compose集成了Nginx+PHP+MySql+Redis环境,一键部署,确实方便太多了。好了,回归正题,下面我部署环境的流程。准备工作:安装 Docker(参考之前文章)安装 Docker-compose (参考之前文章)大家可以用我集成好的docker-compose文件,部署分为三步。1、下载文件 docker-compose 部署包下载地址:https://www.aliyundrive.com/s/AwX2ff4ZLyu 提取码: 2f8xGitee仓库地址 :https://gitee.com/lingfeng9527/docker-compose.git2、解压上传到服务器任务一个位置3、执行命令:docker-compose up -d好了,已经部署好了。访问地址就可以看到结果。HTML:PHP文件访问测试MySQL连接:测试Redis:可以看到redis也是没什么问题了。上面已经验证了结果,接下来我们分别说明集成过程,嫌麻烦的朋友或者熟手可以不用看下面的内容!首先准备工作,准备Nginx+PHP+MySql+Redis环境所需要的文件夹和文件:docker-compose 文件:version: '3' #docker-compose语法的版本 services: php: #创建 php的容器 container_name: php74 image: php:7.4.3-fpm ports: - "9000:9000" restart: always privileged: true links: - "mysql" environment: - TZ=Asia/Shanghai build: ./php #直接到 ./php文件下找Dockerfile volumes: - ./www:/www #把容器的/var/www 映射到./www nginx: #创建 nginx容器 container_name: nginx image: nginx:latest ports: #映射 80和443端口到本机 - 80:80 - 8001:8001 - 4433:443 restart: always depends_on: - "php" links: - "php:php74" environment: - TZ=Asia/Shanghai privileged: true volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf #把容器的nginx.conf映射到 ./nginx/nginx.conf - ./nginx/conf.d:/etc/nginx/conf.d #把容器的conf.d映射到 ./nginx/conf.d - ./www:/usr/share/nginx/html #把容器的/usr/share/nginx/html 映射到./www - ./nginx/logs:/var/log/nginx #把容器的/var/log/nginx 映射到./nginx/logs mysql: container_name: mysql image: mysql:latest volumes: - ./mysql/data:/var/lib/mysql #把容器的数据文件夹映射到 ./mysql/data - ./mysql/logs:/var/log/mysql #把容器的日志文件夹映射到 ./mysql/log - ./mysql/conf:/etc/mysql/conf.d #把容器的my.conf文件映射到 ./mysql/my.conf 暂时去掉 ports: - 3306:3306 #把容器的3306端口映射到本机的3306 restart: always privileged: true environment: - TZ=Asia/Shanghai - MYSQL_ROOT_PASSWORD=469ge9g449646he #root密码(我这里乱输的,自己可改) - MYSQL_USER=test #另一个帐号 - MYSQL_PASS=123456 #另一个帐号的密码 redis: #创建 reids的容器 container_name: redis image: redis:latest restart: always ports: - "6379:6379" environment: - TZ=Asia/Shanghai volumes: - ./redis/conf/redis.conf:/etc/redis/redis.conf #把容器的配置文件夹映射到 ./redis/config/redis.conf - ./redis/data:/data command: /bin/sh -c "echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf && redis-server /etc/redis/redis.conf --appendonly yes" # 指定配置文件并开启持久化 privileged: true # 使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限docker-compose 文件就是用来管理各个docker容器服务。www:这个主要是放所有的网站项目,html文件或者PHP文件,如果需要放其他语言的文件,可以参考我的方法集成其他环境。Nginx:Nginx所有相关的配置文件、日志文件MySQL:相关的配置文件,数据文件,日志文件PHP:Dockerfile文件,主要是安装PHP的相关东西,包括PHP扩展。Redis:redis配置和数据文件mkdir /docker-compose/mysql mkdir /docker-compose/mysql/conf touch /docker-compose/mysql/conf/my.conf mkdir /docker-compose/mysql/data mkdir /docker-compose/mysql/logs mkdir /docker-compose/nginx mkdir /docker-compose/nginx/conf.d mkdir /docker-compose/nginx/conf.d/www.test.com.conf mkdir /docker-compose/nginx/conf.d/www.testphp.com.conf mkdir /docker-compose/nginx/logs touch /docker-compose/nginx/nginx.conf mkdir /docker-compose/php touch /docker-compose/php/Dockerfile mkdir /docker-compose/redis mkdir /docker-compose/redis/conf touch /docker-compose/redis/conf/redis.conf mkdir /docker-compose/redis/data mkdir /docker-compose/www touch /docker-compose/www/index.html #可以放入一些html文件 touch /docker-compose/www/php_dome/index.php #可以放入一些php文件 touch docker-compose.ymlmy.conf 文件内容:[mysqld] max_allowed_packet = 20M innodb_buffer_pool_size=128M query_cache_size=56M key_buffer_size = 16M table_open_cache = 64 sort_buffer_size = 512K net_buffer_length = 8K read_buffer_size = 256K read_rnd_buffer_size = 512K myisam_sort_buffer_size = 8M log-bin=/var/lib/mysql/binlog server-id=344 binlog_format=ROWwww.test.com.conf 文件内容:server { listen 80; server_name 192.168.11.146; location / { #注意这里的root目录是容器的网站目录 root /usr/share/nginx/html/; index index.html index.htm index.php; } }www.testphp.com.conf 文件内容:server { listen 8001; server_name 192.168.11.146; location / { root /usr/share/nginx/html/php_demo; index index.html index.htm index.php; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name; include fastcgi_params; } }nginx nginx.conf 文件内容:user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; 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; client_max_body_size 66M; gzip on; include /etc/nginx/conf.d/*.conf; }PHP Dockerfile 文件内容:FROM php:7.4.3-fpm # packages RUN apk --update add \ autoconf \ build-base \ linux-headers \ libaio-dev \ zlib-dev \ curl \ git \ subversion \ freetype-dev \ libjpeg-turbo-dev \ libmcrypt-dev \ libpng-dev \ libtool \ libbz2 \ bzip2 \ bzip2-dev \ libstdc++ \ libxslt-dev \ openldap-dev \ imagemagick-dev \ make \ unzip \ wget && \ docker-php-ext-install bcmath mcrypt zip bz2 pdo_mysql mysqli simplexml opcache sockets mbstring pcntl xsl && \ docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ && \ pecl install imagick && \ docker-php-ext-enable imagick && \ pecl install swoole && \ docker-php-ext-enable swoole && \ docker-php-ext-install gd && \ docker-php-ext-enable opcache && \ apk del build-base \ linux-headers \ libaio-dev \ && rm -rf /var/cache/apk/* ENV COMPOSER_ALLOW_SUPERUSER 1 ENV COMPOSER_HOME /tmp ENV COMPOSER_VERSION 1.5.1 RUN curl -s -f -L -o /tmp/installer.php https://raw.githubusercontent.com/composer/getcomposer.org/da290238de6d63faace0343efbdd5aa9354332c5/web/installer \ && php -r " \ \$signature = '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410'; \ \$hash = hash('SHA384', file_get_contents('/tmp/installer.php')); \ if (!hash_equals(\$signature, \$hash)) { \ unlink('/tmp/installer.php'); \ echo 'Integrity check failed, installer is either corrupt or worse.' . PHP_EOL; \ exit(1); \ }" \ && php /tmp/installer.php --no-ansi --install-dir=/usr/bin --filename=composer --version=${COMPOSER_VERSION} \ && rm /tmp/installer.php \ && composer --ansi --version --no-interaction VOLUME /var/www WORKDIR /var/www CMD php-fpm好了,到这里基本上都介绍完了。
查看详情点赞21评论收藏1浏览5882023-05-19 15:35:40Go 强大的时间处理库之一,go-carbon
Carboncarbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,支持链式调用和 gorm、xorm、zorm 等主流 orm。安装使用// 1、使用 github 库 go get -u github.com/golang-module/carbon import ( "github.com/golang-module/carbon" ) ///2、使用 gitee 库 go get -u gitee.com/go-package/carbon import ( "gitee.com/go-package/carbon" )默认时区为 Local,即服务器所在时区,假设当前时间为 2020-08-05 13:14:15//昨天、今天、明天 // 今天此刻 carbon.Now().ToDateTimeString() // 2020-08-05 13:14:15 // 今天日期 carbon.Now().ToDateString() // 2020-08-05 // 今天时间 carbon.Now().ToTimeString() // 13:14:15 // 今天秒级时间戳 carbon.Now().ToTimestamp() // 1596604455 carbon.Now().ToTimestampWithSecond() // 1596604455 // 今天毫秒级时间戳 carbon.Now().ToTimestampWithMillisecond() // 1596604455000 // 今天微秒级时间戳 carbon.Now().ToTimestampWithMicrosecond() // 1596604455000000 // 今天纳秒级时间戳 carbon.Now().ToTimestampWithNanosecond() // 1596604455000000000 // 指定时区的今天此刻 carbon.SetTimezone(Carbon.NewYork).Now().ToDateTimeString() // 2020-08-05 01:14:15 // 昨天此刻 carbon.Yesterday().ToDateTimeString() // 2020-08-04 13:14:15 // 昨天日期 carbon.Yesterday().ToDateString() // 2020-08-04 // 昨天时间 carbon.Yesterday().ToTimeString() // 13:14:15 // 昨天秒级时间戳 carbon.Yesterday().ToTimestamp() // 1596518055 carbon.Yesterday().ToTimestampWithSecond() // 1596518055 // 明天毫秒级时间戳 carbon.Yesterday().ToTimestampWithMillisecond() // 1596518055000 // 明天微秒级时间戳 carbon.Yesterday().ToTimestampWithMicrosecond() // 1596518055000000 // 明天纳秒级时间戳 carbon.Yesterday().ToTimestampWithNanosecond() // 1596518055000000000 // 指定时区的昨天此刻 carbon.SetTimezone(Carbon.NewYork).Yesterday().ToDateTimeString() // 2020-08-04 01:14:15 // 指定日期的昨天此刻 carbon.Parse("2021-01-28 13:14:15").Yesterday().ToDateTimeString() // 2021-01-27 13:14:15 // 明天此刻 carbon.Tomorrow().ToDateTimeString() // 2020-08-06 13:14:15 // 明天日期 carbon.Tomorrow().ToDateString() // 2020-08-06 // 明天时间 carbon.Tomorrow().ToTimeString() // 13:14:15 // 明天秒级时间戳 carbon.Tomorrow().ToTimestamp() // 1596690855 carbon.Tomorrow().ToTimestampWithSecond() // 1596690855 // 明天毫秒级时间戳 carbon.Tomorrow().ToTimestampWithMillisecond() // 1596690855000 // 明天微秒级时间戳 carbon.Tomorrow().ToTimestampWithMicrosecond() // 1596690855000000 // 明天纳秒级时间戳 carbon.Tomorrow().ToTimestampWithNanosecond() // 1596690855000000000 // 指定时区的明天此刻 carbon.SetTimezone(Carbon.NewYork).Tomorrow().ToDateTimeString() // 2020-08-06 01:14:15 // 指定日期的明天此刻 carbon.Parse("2021-01-28 13:14:15").Tomorrow().ToDateTimeString() // 2021-01-29 13:14:15 //创建 Carbon 实例 // 从秒级时间戳创建 Carbon 实例 carbon.CreateFromTimestamp(1596604455).ToDateTimeString() // 2020-08-05 13:14:15 // 从毫秒级时间戳创建 Carbon 实例 carbon.CreateFromTimestamp(1596604455000).ToDateTimeString() // 2020-08-05 13:14:15 // 从微秒级时间戳创建 Carbon 实例 carbon.CreateFromTimestamp(1596604455000000).ToDateTimeString() // 2020-08-05 13:14:15 // 从纳级时间戳创建 Carbon 实例 carbon.CreateFromTimestamp(1596604455000000000).ToDateTimeString() // 2020-08-05 13:14:15 // 从年月日时分秒创建 Carbon 实例 carbon.CreateFromDateTime(2020, 8, 5, 13, 14, 15).ToDateTimeString() // 2020-08-05 13:14:15 // 从年月日创建 Carbon 实例(时分秒默认为当前时分秒) carbon.CreateFromDate(2020, 8, 5).ToDateTimeString() // 2020-08-05 13:14:15 // 从时分秒创建 Carbon 实例(年月日默认为当前年月日) carbon.CreateFromTime(13, 14, 15).ToDateTimeString() // 2020-08-05 13:14:15 //将标准格式时间字符串解析成 Carbon 实例 carbon.Parse("").ToDateTimeString() // 空字符串 carbon.Parse("0000-00-00 00:00:00").ToDateTimeString() // 空字符串 carbon.Parse("0000-00-00").ToDateTimeString() // 空字符串 carbon.Parse("2020-08-05 13:14:15").ToDateTimeString() // 2020-08-05 13:14:15 carbon.Parse("2020-08-05").ToDateTimeString() // 2020-08-05 00:00:00 carbon.Parse("20200805131415").ToDateTimeString() // 2020-08-05 13:14:15 carbon.Parse("20200805").ToDateTimeString() // 2020-08-05 00:00:00 carbon.Parse("2020-08-05T13:14:15+08:00").ToDateTimeString() // 2020-08-05 00:00:00 //将特殊格式时间字符串解析成 Carbon 实例 carbon.ParseByFormat("2020|08|05 13|14|15", "Y|m|d H|i|s").ToDateTimeString // 2020-08-05 13:14:15 carbon.ParseByFormat("It is 2020-08-05 13:14:15", "It is Y-m-d H:i:s").ToDateTimeString // 2020-08-05 13:14:15 carbon.ParseByFormat("今天是 2020年08月05日13时14分15秒", "今天是 Y年m月d日H时i分s秒").ToDateTimeString // 2020-08-05 13:14:15 //将布局时间字符串解析成 Carbon 实例 carbon.ParseByLayout("2020|08|05 13|14|15", "2006|01|02 15:04:05").ToDateTimeString // 2020-08-05 13:14:15 carbon.ParseByLayout("It is 2020-08-05 13:14:15", "It is 2006-01-02 15:04:05").ToDateTimeString // 2020-08-05 13:14:15 carbon.ParseByLayout("今天是 2020年08月05日13时14分15秒", "今天是 2006年01月02日15时04分05秒").ToDateTimeString() // 2020-08-05 13:14:15 //carbon和time.Time互转 // 将 time.Time 转换成 Carbon carbon.Time2Carbon(time.Now()) // 将 Carbon 转换成 time.Time carbon.Now().Carbon2Time() 或 carbon.Now().Time //时间设置 // 设置时区 carbon.SetTimezone(carbon.PRC).Now().ToDateTimeString() // 2020-08-05 13:14:15 carbon.SetTimezone(carbon.Tokyo).Now().ToDateTimeString() // 2020-08-05 14:14:15 carbon.SetTimezone(carbon.Tokyo).SetTimezone(carbon.PRC).Now().ToDateTimeString() // 2020-08-05 13:14:15 // 设置年 carbon.Parse("2019-08-05").SetYear(2020).ToDateString() // 2020-08-05 carbon.Parse("2020-02-29").SetYear(2019).ToDateString() // 2019-03-01 // 设置月 carbon.Parse("2020-01-31").SetMonth(2).ToDateString() // 2020-03-02 carbon.Parse("2020-08-05").SetMonth(2).ToDateString() // 2020-02-05 // 设置日 carbon.Parse("2019-08-05").SetDay(31).ToDateString() // 2020-08-31 carbon.Parse("2020-02-01").SetDay(31).ToDateString() // 2020-03-02 // 设置时 carbon.Parse("2020-08-05 13:14:15").SetHour(10).ToDateTimeString() // 2020-08-05 10:14:15 carbon.Parse("2020-08-05 13:14:15").SetHour(24).ToDateTimeString() // 2020-08-06 00:14:15 // 设置分 carbon.Parse("2020-08-05 13:14:15").SetMinute(10).ToDateTimeString() // 2020-08-05 13:10:15 carbon.Parse("2020-08-05 13:14:15").SetMinute(60).ToDateTimeString() // 2020-08-05 14:00:15 // 设置秒 carbon.Parse("2020-08-05 13:14:15").SetSecond(10).ToDateTimeString() // 2020-08-05 13:14:10 carbon.Parse("2020-08-05 13:14:15").SetSecond(60).ToDateTimeString() // 2020-08-05 13:15:00 //开始时间、结束时间 // 本年开始时间 carbon.Parse("2020-08-05 13:14:15").StartOfYear().ToDateTimeString() // 2020-01-01 00:00:00 // 本年结束时间 carbon.Parse("2020-08-05 13:14:15").EndOfYear().ToDateTimeString() // 2020-12-31 23:59:59 // 本月开始时间 carbon.Parse("2020-08-05 13:14:15").StartOfMonth().ToDateTimeString() // 2020-08-01 00:00:00 // 本月结束时间 carbon.Parse("2020-08-05 13:14:15").EndOfMonth().ToDateTimeString() // 2020-08-31 23:59:59 // 本周开始时间 carbon.Parse("2020-08-05 13:14:15").StartOfWeek().ToDateTimeString() // 2020-08-03 00:00:00 // 本周结束时间 carbon.Parse("2020-08-05 13:14:15").EndOfWeek().ToDateTimeString() // 2020-08-09 23:59:59 // 本日开始时间 carbon.Parse("2020-08-05 13:14:15").StartOfDay().ToDateTimeString() // 2020-08-05 00:00:00 // 本日结束时间 carbon.Parse("2020-08-05 13:14:15").EndOfDay().ToDateTimeString() // 2020-08-05 23:59:59 // 本小时开始时间 carbon.Parse("2020-08-05 13:14:15").StartOfHour().ToDateTimeString() // 2020-08-05 13:00:00 // 本小时结束时间 carbon.Parse("2020-08-05 13:14:15").EndOfHour().ToDateTimeString() // 2020-08-05 13:59:59 // 本分钟开始时间 carbon.Parse("2020-08-05 13:14:15").StartOfMinute().ToDateTimeString() // 2020-08-05 13:14:00 // 本分钟结束时间 carbon.Parse("2020-08-05 13:14:15").EndOfMinute().ToDateTimeString() // 2020-08-05 13:14:59 //时间旅行 // 三世纪后 carbon.Parse("2020-02-29 13:14:15").AddCenturies(3).ToDateTimeString() // 2320-02-29 13:14:15 // 三世纪后(月份不溢出) carbon.Parse("2020-02-29 13:14:15").AddCenturiesNoOverflow(3).ToDateTimeString() // 2320-02-29 13:14:15 // 一世纪后 carbon.Parse("2020-02-29 13:14:15").AddCentury().ToDateTimeString() // 2120-02-29 13:14:15 // 一世纪后(月份不溢出) carbon.Parse("2020-02-29 13:14:15").AddCenturyNoOverflow().ToDateTimeString() // 2120-02-29 13:14:15 // 三世纪前 carbon.Parse("2020-02-29 13:14:15").SubCenturies(3).ToDateTimeString() // 1720-02-29 13:14:15 // 三世纪前(月份不溢出) carbon.Parse("2020-02-29 13:14:15").SubCenturiesNoOverflow(3).ToDateTimeString() // 1720-02-29 13:14:15 // 一世纪前 carbon.Parse("2020-02-29 13:14:15").SubCentury().ToDateTimeString() // 1920-02-29 13:14:15 // 一世纪前(月份不溢出) carbon.Parse("2020-02-29 13:14:15").SubCenturyNoOverflow().ToDateTimeString() // 1920-02-29 13:14:15 // 三年后 carbon.Parse("2020-02-29 13:14:15").AddYears(3).ToDateTimeString() // 2023-03-01 13:14:15 // 三年后(月份不溢出) carbon.Parse("2020-02-29 13:14:15").AddYearsNoOverflow(3).ToDateTimeString() // 2023-02-28 13:14:15 // 一年后 carbon.Parse("2020-02-29 13:14:15").AddYear().ToDateTimeString() // 2021-03-01 13:14:15 // 一年后(月份不溢出) carbon.Parse("2020-02-29 13:14:15").AddYearNoOverflow().ToDateTimeString() // 2021-02-28 13:14:15 // 三年前 carbon.Parse("2020-02-29 13:14:15").SubYears(3).ToDateTimeString() // 2017-03-01 13:14:15 // 三年前(月份不溢出) carbon.Parse("2020-02-29 13:14:15").SubYearsNoOverflow(3).ToDateTimeString() // 2017-02-28 13:14:15 // 一年前 carbon.Parse("2020-02-29 13:14:15").SubYear().ToDateTimeString() // 2019-03-01 13:14:15 // 一年前(月份不溢出) carbon.Parse("2020-02-29 13:14:15").SubYearNoOverflow().ToDateTimeString() // 2019-02-28 13:14:15 // 三季度后 carbon.Parse("2019-08-31 13:14:15").AddQuarters(3).ToDateTimeString() // 2019-03-02 13:14:15 // 三季度后(月份不溢出) carbon.Parse("2019-08-31 13:14:15").AddQuartersNoOverflow(3).ToDateTimeString() // 2019-02-29 13:14:15 // 一季度后 carbon.Parse("2019-11-30 13:14:15").AddQuarter().ToDateTimeString() // 2020-03-01 13:14:15 // 一季度后(月份不溢出) carbon.Parse("2019-11-30 13:14:15").AddQuarterNoOverflow().ToDateTimeString() // 2020-02-29 13:14:15 // 三季度前 carbon.Parse("2019-08-31 13:14:15").SubQuarters(3).ToDateTimeString() // 2019-03-03 13:14:15 // 三季度前(月份不溢出) carbon.Parse("2019-08-31 13:14:15").SubQuartersNoOverflow(3).ToDateTimeString() // 2019-02-28 13:14:15 // 一季度前 carbon.Parse("2020-05-31 13:14:15").SubQuarter().ToDateTimeString() // 2020-03-02 13:14:15 // 一季度前(月份不溢出) carbon.Parse("2020-05-31 13:14:15").SubQuarterNoOverflow().ToDateTimeString() // 2020-02-29 13:14:15 // 三月后 carbon.Parse("2020-02-29 13:14:15").AddMonths(3).ToDateTimeString() // 2020-05-29 13:14:15 // 三月后(月份不溢出) carbon.Parse("2020-02-29 13:14:15").AddMonthsNoOverflow(3).ToDateTimeString() // 2020-05-29 13:14:15 // 一月后 carbon.Parse("2020-01-31 13:14:15").AddMonth().ToDateTimeString() // 2020-03-02 13:14:15 // 一月后(月份不溢出) carbon.Parse("2020-01-31 13:14:15").AddMonthNoOverflow().ToDateTimeString() // 2020-02-29 13:14:15 // 三月前 carbon.Parse("2020-02-29 13:14:15").SubMonths(3).ToDateTimeString() // 2019-11-29 13:14:15 // 三月前(月份不溢出) carbon.Parse("2020-02-29 13:14:15").SubMonthsNoOverflow(3).ToDateTimeString() // 2019-11-29 13:14:15 // 一月前 carbon.Parse("2020-03-31 13:14:15").SubMonth().ToDateTimeString() // 2020-03-02 13:14:15 // 一月前(月份不溢出) carbon.Parse("2020-03-31 13:14:15").SubMonthNoOverflow().ToDateTimeString() // 2020-02-29 13:14:15 // 三周后 carbon.Parse("2020-02-29 13:14:15").AddWeeks(3).ToDateTimeString() // 2020-03-21 13:14:15 // 一周后 carbon.Parse("2020-02-29 13:14:15").AddWeek().ToDateTimeString() // 2020-03-07 13:14:15 // 三周前 carbon.Parse("2020-02-29 13:14:15").SubWeeks(3).ToDateTimeString() // 2020-02-08 13:14:15 // 一周前 carbon.Parse("2020-02-29 13:14:15").SubWeek().ToDateTimeString() // 2020-02-22 13:14:15 // 三天后 carbon.Parse("2020-08-05 13:14:15").AddDays(3).ToDateTimeString() // 2020-08-08 13:14:15 // 一天后 carbon.Parse("2020-08-05 13:14:15").AddDay().ToDateTimeString() // 2020-08-05 13:14:15 // 三天前 carbon.Parse("2020-08-05 13:14:15").SubDays(3).ToDateTimeString() // 2020-08-02 13:14:15 // 一天前 carbon.Parse("2020-08-05 13:14:15").SubDay().ToDateTimeString() // 2020-08-04 13:14:15 // 三小时后 carbon.Parse("2020-08-05 13:14:15").AddHours(3).ToDateTimeString() // 2020-08-05 16:14:15 // 二小时半后 carbon.Parse("2020-08-05 13:14:15").AddDuration("2.5h").ToDateTimeString() // 2020-08-05 15:44:15 carbon.Parse("2020-08-05 13:14:15").AddDuration("2h30m").ToDateTimeString() // 2020-08-05 15:44:15 // 一小时后 carbon.Parse("2020-08-05 13:14:15").AddHour().ToDateTimeString() // 2020-08-05 14:14:15 // 三小时前 carbon.Parse("2020-08-05 13:14:15").SubHours(3).ToDateTimeString() // 2020-08-05 10:14:15 // 二小时半前 carbon.Parse("2020-08-05 13:14:15").SubDuration("2.5h").ToDateTimeString() // 2020-08-05 10:44:15 carbon.Parse("2020-08-05 13:14:15").SubDuration("2h30m").ToDateTimeString() // 2020-08-05 10:44:15 // 一小时前 carbon.Parse("2020-08-05 13:14:15").SubHour().ToDateTimeString() // 2020-08-05 12:14:15 // 三分钟后 carbon.Parse("2020-08-05 13:14:15").AddMinutes(3).ToDateTimeString() // 2020-08-05 13:17:15 // 二分钟半后 carbon.Parse("2020-08-05 13:14:15").AddDuration("2.5m").ToDateTimeString() // 2020-08-05 13:16:45 carbon.Parse("2020-08-05 13:14:15").AddDuration("2m30s").ToDateTimeString() // 2020-08-05 13:16:45 // 一分钟后 carbon.Parse("2020-08-05 13:14:15").AddMinute().ToDateTimeString() // 2020-08-05 13:15:15 // 三分钟前 carbon.Parse("2020-08-05 13:14:15").SubMinutes(3).ToDateTimeString() // 2020-08-05 13:11:15 // 二分钟半前 carbon.Parse("2020-08-05 13:14:15").SubDuration("2.5m").ToDateTimeString() // 2020-08-05 13:11:45 carbon.Parse("2020-08-05 13:14:15").SubDuration("2m30s").ToDateTimeString() // 2020-08-05 13:11:45 // 一分钟前 carbon.Parse("2020-08-05 13:14:15").SubMinute().ToDateTimeString() // 2020-08-05 13:13:15 // 三秒钟后 carbon.Parse("2020-08-05 13:14:15").AddSeconds(3).ToDateTimeString() // 2020-08-05 13:14:18 // 二秒钟半后 carbon.Parse("2020-08-05 13:14:15").AddDuration("2.5s").ToDateTimeString() // 2020-08-05 13:14:17 // 一秒钟后 carbon.Parse("2020-08-05 13:14:15").AddSecond().ToDateTimeString() // 2020-08-05 13:14:16 // 三秒钟前 carbon.Parse("2020-08-05 13:14:15").SubSeconds(3).ToDateTimeString() // 2020-08-05 13:14:12 // 二秒钟半前 carbon.Parse("2020-08-05 13:14:15").SubDuration("2.5s").ToDateTimeString() // 2020-08-05 13:14:12 // 一秒钟前 carbon.Parse("2020-08-05 13:14:15").SubSecond().ToDateTimeString() // 2020-08-05 13:14:14 //时间差 // 相差多少周 carbon.Parse("2020-08-05 13:14:15").DiffInWeeks(carbon.Parse("2020-07-28 13:14:15")) // -1 // 相差多少周(绝对值) carbon.Parse("2020-08-05 13:14:15").DiffInWeeksWithAbs(carbon.Parse("2020-07-28 13:14:15")) // 1 // 相差多少天 carbon.Parse("2020-08-05 13:14:15").DiffInDays(carbon.Parse("2020-08-04 13:14:15")) // -1 // 相差多少天(绝对值) carbon.Parse("2020-08-05 13:14:15").DiffInDaysWithAbs(carbon.Parse("2020-08-04 13:14:15")) // 1 // 相差多少小时 carbon.Parse("2020-08-05 13:14:15").DiffInHours(carbon.Parse("2020-08-05 12:14:15")) // -1 // 相差多少小时(绝对值) carbon.Parse("2020-08-05 13:14:15").DiffInHoursWithAbs(carbon.Parse("2020-08-05 12:14:15")) // 1 // 相差多少分 carbon.Parse("2020-08-05 13:14:15").DiffInMinutes(carbon.Parse("2020-08-05 13:13:15")) // -1 // 相差多少分(绝对值) carbon.Parse("2020-08-05 13:14:15").DiffInMinutesWithAbs(carbon.Parse("2020-08-05 13:13:15")) // 1 // 相差多少秒 carbon.Parse("2020-08-05 13:14:15").DiffInSeconds(carbon.Parse("2020-08-05 13:14:14")) // -1 // 相差多少秒(绝对值) carbon.Parse("2020-08-05 13:14:15").DiffInSecondsWithAbs(carbon.Parse("2020-08-05 13:14:14")) // 1 //时间比较 // 是否大于 carbon.Parse("2020-08-05 13:14:15").Gt(carbon.Parse("2020-08-04 13:14:15")) // true carbon.Parse("2020-08-05 13:14:15").Gt(carbon.Parse("2020-08-05 13:14:15")) // false carbon.Parse("2020-08-05 13:14:15").Compare(">", carbon.Parse("2020-08-04 13:14:15")) // true carbon.Parse("2020-08-05 13:14:15").Compare(">", carbon.Parse("2020-08-05 13:14:15")) // false // 是否小于 carbon.Parse("2020-08-05 13:14:15").Lt(carbon.Parse("2020-08-06 13:14:15")) // true carbon.Parse("2020-08-05 13:14:15").Lt(carbon.Parse("2020-08-05 13:14:15")) // false carbon.Parse("2020-08-05 13:14:15").Compare("<", carbon.Parse("2020-08-06 13:14:15")) // true carbon.Parse("2020-08-05 13:14:15").Compare("<", carbon.Parse("2020-08-05 13:14:15")) // false // 是否等于 carbon.Parse("2020-08-05 13:14:15").Eq(carbon.Parse("2020-08-05 13:14:15")) // true carbon.Parse("2020-08-05 13:14:15").Eq(carbon.Parse("2020-08-05 13:14:00")) // false carbon.Parse("2020-08-05 13:14:15").Compare("=", carbon.Parse("2020-08-05 13:14:15")) // true carbon.Parse("2020-08-05 13:14:15").Compare("=", carbon.Parse("2020-08-05 13:14:00")) // false // 是否不等于 carbon.Parse("2020-08-05 13:14:15").Ne(carbon.Parse("2020-08-06 13:14:15")) // true carbon.Parse("2020-08-05 13:14:15").Ne(carbon.Parse("2020-08-05 13:14:15")) // false carbon.Parse("2020-08-05 13:14:15").Compare("!=", carbon.Parse("2020-08-06 13:14:15")) // true carbon.Parse("2020-08-05 13:14:15").Compare("<>", carbon.Parse("2020-08-05 13:14:15")) // false // 是否大于等于 carbon.Parse("2020-08-05 13:14:15").Gte(carbon.Parse("2020-08-04 13:14:15")) // true carbon.Parse("2020-08-05 13:14:15").Gte(carbon.Parse("2020-08-05 13:14:15")) // true carbon.Parse("2020-08-05 13:14:15").Compare(">=", carbon.Parse("2020-08-04 13:14:15")) // true carbon.Parse("2020-08-05 13:14:15").Compare(">=", carbon.Parse("2020-08-05 13:14:15")) // true // 是否小于等于 carbon.Parse("2020-08-05 13:14:15").Lte(carbon.Parse("2020-08-06 13:14:15")) // true carbon.Parse("2020-08-05 13:14:15").Lte(carbon.Parse("2020-08-05 13:14:15")) // true carbon.Parse("2020-08-05 13:14:15").Compare("<=", carbon.Parse("2020-08-06 13:14:15")) // true carbon.Parse("2020-08-05 13:14:15").Compare("<=", carbon.Parse("2020-08-05 13:14:15")) // true // 是否在两个时间之间(不包括这两个时间) carbon.Parse("2020-08-05 13:14:15").Between(carbon.Parse("2020-08-05 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // false carbon.Parse("2020-08-05 13:14:15").Between(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true // 是否在两个时间之间(包括开始时间) carbon.Parse("2020-08-05 13:14:15").BetweenIncludedStartTime(carbon.Parse("2020-08-05 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true carbon.Parse("2020-08-05 13:14:15").BetweenIncludedStartTime(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true // 是否在两个时间之间(包括结束时间) carbon.Parse("2020-08-05 13:14:15").BetweenIncludedEndTime(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-05 13:14:15")) // true carbon.Parse("2020-08-05 13:14:15").BetweenIncludedEndTime(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true // 是否在两个时间之间(包括这两个时间) carbon.Parse("2020-08-05 13:14:15").BetweenIncludedBoth(carbon.Parse("2020-08-05 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true carbon.Parse("2020-08-05 13:14:15").BetweenIncludedBoth(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-05 13:14:15")) // true //时间判断 // 是否是零值时间 carbon.Parse("").IsZero() // true carbon.Parse("0").IsZero() // true carbon.Parse("0000-00-00 00:00:00").IsZero() // true carbon.Parse("0000-00-00").IsZero() // true carbon.Parse("00:00:00").IsZero() // true carbon.Parse("2020-08-05 00:00:00").IsZero() // false carbon.Parse("2020-08-05").IsZero() // false // 是否是当前时间 carbon.Now().IsNow() // true // 是否是未来时间 carbon.Tomorrow().IsFuture() // true // 是否是过去时间 carbon.Yesterday().IsPast() // true // 是否是闰年 carbon.Parse("2020-08-05 13:14:15").IsLeapYear() // true // 是否是长年 carbon.Parse("2020-08-05 13:14:15").IsLongYear() // true // 是否是一月 carbon.Parse("2020-08-05 13:14:15").IsJanuary() // false // 是否是二月 carbon.Parse("2020-08-05 13:14:15").IsFebruary() // false // 是否是三月 carbon.Parse("2020-08-05 13:14:15").IsMarch() // false // 是否是四月 carbon.Parse("2020-08-05 13:14:15").IsApril() // false // 是否是五月 carbon.Parse("2020-08-05 13:14:15").IsMay() // false // 是否是六月 carbon.Parse("2020-08-05 13:14:15").IsJune() // false // 是否是七月 carbon.Parse("2020-08-05 13:14:15").IsJuly() // false // 是否是八月 carbon.Parse("2020-08-05 13:14:15").IsAugust() // false // 是否是九月 carbon.Parse("2020-08-05 13:14:15").IsSeptember() // true // 是否是十月 carbon.Parse("2020-08-05 13:14:15").IsOctober() // false // 是否是十一月 carbon.Parse("2020-08-05 13:14:15").IsNovember() // false // 是否是十二月 carbon.Parse("2020-08-05 13:14:15").IsDecember() // false // 是否是周一 carbon.Parse("2020-08-05 13:14:15").IsMonday() // false // 是否是周二 carbon.Parse("2020-08-05 13:14:15").IsTuesday() // true // 是否是周三 carbon.Parse("2020-08-05 13:14:15").IsWednesday() // false // 是否是周四 carbon.Parse("2020-08-05 13:14:15").IsThursday() // false // 是否是周五 carbon.Parse("2020-08-05 13:14:15").IsFriday() // false // 是否是周六 carbon.Parse("2020-08-05 13:14:15").IsSaturday() // false // 是否是周日 carbon.Parse("2020-08-05 13:14:15").IsSunday() // false // 是否是工作日 carbon.Parse("2020-08-05 13:14:15").IsWeekday() // false // 是否是周末 carbon.Parse("2020-08-05 13:14:15").IsWeekend() // true // 是否是昨天 carbon.Parse("2020-08-04 13:14:15").IsYesterday() // true carbon.Parse("2020-08-04 00:00:00").IsYesterday() // true carbon.Parse("2020-08-04").IsYesterday() // true // 是否是今天 carbon.Parse("2020-08-05 13:14:15").IsToday() // true carbon.Parse("2020-08-05 00:00:00").IsToday() // true carbon.Parse("2020-08-05").IsToday() // true // 是否是明天 carbon.Parse("2020-08-06 13:14:15").IsTomorrow() // true carbon.Parse("2020-08-06 00:00:00").IsTomorrow() // true carbon.Parse("2020-08-06").IsTomorrow() // true //时间输出 // 输出秒级时间戳 carbon.Parse("2020-08-05 13:14:15").ToTimestamp() // 1596604455 carbon.Parse("2020-08-05 13:14:15").ToTimestampWithSecond() // 1596604455 // 输出毫秒级时间戳 carbon.Parse("2020-08-05 13:14:15").ToTimestampWithMillisecond() // 1596604455000 // 输出微秒级时间戳 carbon.Parse("2020-08-05 13:14:15").ToTimestampWithMicrosecond() // 1596604455000000 // 输出纳秒级时间戳 carbon.Parse("2020-08-05 13:14:15").ToTimestampWithNanosecond() // 1596604455000000000 // 输出日期时间字符串 carbon.Parse("2020-08-05 13:14:15").ToDateTimeString() // 2020-08-05 13:14:15 // 输出日期字符串 carbon.Parse("2020-08-05 13:14:15").ToDateString() // 2020-08-05 // 输出时间字符串 carbon.Parse("2020-08-05 13:14:15").ToTimeString() // 13:14:15 // 输出Ansic格式字符串 carbon.Parse("2020-08-05 13:14:15").ToAnsicString() // Wed Aug 5 13:14:15 2020 // 输出Atom字符串 carbon.Parse("2020-08-05 13:14:15").ToAtomString() // Wed Aug 5 13:14:15 2020 // 输出UnixDate格式字符串 carbon.Parse("2020-08-05 13:14:15").ToUnixDateString() // Wed Aug 5 13:14:15 CST 2020 // 输出RubyDate格式字符串 carbon.Parse("2020-08-05 13:14:15").ToRubyDateString() // Wed Aug 05 13:14:15 +0800 2020 // 输出Kitchen格式字符串 carbon.Parse("2020-08-05 13:14:15").ToKitchenString() // 1:14PM // 输出Cookie格式字符串 carbon.Parse("2020-08-05 13:14:15").ToCookieString() // Wednesday, 05-Aug-2020 13:14:15 CST // 输出DayDateTime格式字符串 carbon.Parse("2020-08-05 13:14:15").ToDayDateTimeString() // Wed, Aug 5, 2020 1:14 PM // 输出RSS格式字符串 carbon.Parse("2020-08-05 13:14:15").ToRssString() // Wed, 05 Aug 2020 13:14:15 +0800 // 输出W3C格式字符串 carbon.Parse("2020-08-05 13:14:15").ToW3cString() // 2020-08-05T13:14:15+08:00 // 输出RFC822格式字符串 carbon.Parse("2020-08-05 13:14:15").ToRfc822String() // 05 Aug 20 13:14 CST // 输出RFC822Z格式字符串 carbon.Parse("2020-08-05 13:14:15").ToRfc822zString() // 05 Aug 20 13:14 +0800 // 输出RFC850格式字符串 carbon.Parse("2020-08-05 13:14:15").ToRfc850String() // Wednesday, 05-Aug-20 13:14:15 CST // 输出RFC1036格式字符串 carbon.Parse("2020-08-05 13:14:15").ToRfc1036String() // Wed, 05 Aug 20 13:14:15 +0800 // 输出RFC1123格式字符串 carbon.Parse("2020-08-05 13:14:15").ToRfc1123String() // Wed, 05 Aug 2020 13:14:15 CST // 输出RFC2822格式字符串 carbon.Parse("2020-08-05 13:14:15").ToRfc2822String() // Wed, 05 Aug 2020 13:14:15 +0800 // 输出RFC3339格式字符串 carbon.Parse("2020-08-05 13:14:15").ToRfc3339String() // 2020-08-05T13:14:15+08:00 // 输出RFC7231格式字符串 carbon.Parse("2020-08-05 13:14:15").ToRfc7231String() // Wed, 05 Aug 2020 05:14:15 GMT // 输出字符串 carbon.Parse("2020-08-05 13:14:15").ToString() // 2020-08-05 13:14:15 +0800 CST // 输出格式化字符串,Format()是ToFormatString()的简写 carbon.Parse("2020-08-05 13:14:15").ToFormatString("YmdHis") // 20200805131415 carbon.Parse("2020-08-05 13:14:15").ToFormatString("Y年m月d H时i分s秒") // 2020年08月05日 13时14分15秒 carbon.Parse("2020-08-05 13:14:15").Format("YmdHis") // 20200805131415 carbon.Parse("2020-08-05 13:14:15").Format("l jS of F Y h:i:s A") // Wednesday 5th of August 2020 01:14:15 PM //时间获取 // 获取本年总天数 carbon.Parse("2019-08-05 13:14:15").DaysInYear() // 365 carbon.Parse("2020-08-05 13:14:15").DaysInYear() // 366 // 获取本月总天数 carbon.Parse("2020-02-01 13:14:15").DaysInMonth() // 29 carbon.Parse("2020-04-01 13:14:15").DaysInMonth() // 30 carbon.Parse("2020-08-01 13:14:15").DaysInMonth() // 31 // 获取本年第几天 carbon.Parse("2020-08-05 13:14:15").DayOfYear() // 218 // 获取本年第几周 carbon.Parse("2019-12-31 13:14:15").WeekOfYear() // 1 carbon.Parse("2020-08-05 13:14:15").WeekOfYear() // 32 // 获取本月第几天 carbon.Parse("2020-08-05 13:14:15").DayOfMonth() // 5 // 获取本月第几周 carbon.Parse("2020-08-05 13:14:15").WeekOfMonth() // 1 // 获取本周第几天 carbon.Parse("2020-08-05 13:14:15").DayOfWeek() // 3 // 获取当前年 carbon.Parse("2020-08-05 13:14:15").Year() // 2020 // 获取当前季度 carbon.Parse("2020-08-05 13:14:15").Quarter() // 3 // 获取当前月 carbon.Parse("2020-08-05 13:14:15").Month() // 8 // 获取当前日 carbon.Parse("2020-08-05 13:14:15").Day() // 5 // 获取当前时 carbon.Parse("2020-08-05 13:14:15").Hour() // 13 // 获取当前分 carbon.Parse("2020-08-05 13:14:15").Minute() // 14 // 获取当前秒 carbon.Parse("2020-08-05 13:14:15").Second() // 15 // 获取当前毫秒 carbon.Parse("2020-08-05 13:14:15").Millisecond() // 1596604455000 // 获取当前微秒 carbon.Parse("2020-08-05 13:14:15").Microsecond() // 1596604455000000 // 获取当前纳秒 carbon.Parse("2020-08-05 13:14:15").Nanosecond() // 1596604455000000000 // 获取时区 carbon.SetTimezone(carbon.PRC).Timezone() // PRC carbon.SetTimezone(carbon.Tokyo).Timezone() // Asia/Tokyo // 获取年龄 carbon.Parse("2002-01-01 13:14:15").Age() // 17 carbon.Parse("2002-12-31 13:14:15").Age() // 18 //农历支持 // 获取生肖年 carbon.Parse("2020-08-05 13:14:15").ToAnimalYear() // 鼠 // 获取农历年 carbon.Parse("2020-08-05 13:14:15").ToLunarYear() // 庚子 // 是否是鼠年 carbon.Parse("2020-08-05 13:14:15").IsYearOfRat() // true // 是否是牛年 carbon.Parse("2020-08-05 13:14:15").IsYearOfOx() // false // 是否是虎年 carbon.Parse("2020-08-05 13:14:15").IsYearOfTiger() // false // 是否是兔年 carbon.Parse("2020-08-05 13:14:15").IsYearOfRabbit() // false // 是否是龙年 carbon.Parse("2020-08-05 13:14:15").IsYearOfDragon() // false // 是否是蛇年 carbon.Parse("2020-08-05 13:14:15").IsYearOfSnake() // false // 是否是马年 carbon.Parse("2020-08-05 13:14:15").IsYearOfHorse() // false // 是否是羊年 carbon.Parse("2020-08-05 13:14:15").IsYearOfGoat() // false // 是否是猴年 carbon.Parse("2020-08-05 13:14:15").IsYearOfMonkey() // false // 是否是鸡年 carbon.Parse("2020-08-05 13:14:15").IsYearOfRooster() // false // 是否是狗年 carbon.Parse("2020-08-05 13:14:15").IsYearOfDog() // false // 是否是猪年 carbon.Parse("2020-08-05 13:14:15").IsYearOfPig() // false 参考:链接参考:https://blog.csdn.net/angelstreet23/article/details/113616889
查看详情点赞1评论收藏浏览862023-05-18 13:57:46PHP 页面静态化处理,生成静态页面!
做SEO的都知道,最好是把我们的网站页面生成静态页面,好处就太多了。下面我们直接搞!首先我们在一个公共的服务层,封装一个生成静态页面的方法/** * 生成静态页面 * @param string $filePath * @param string $htmlStr */ public static function generateStaticPage(string $filePath, string $htmlStr) { switch ($filePath) { case "index" || "/": return file_put_contents('index.html',$htmlStr); default: //自定义页面 $dir = iconv("UTF-8", "GBK", $filePath); $path = str_replace("/","\\",public_path($dir)); if (!file_exists($path)) mkdir($dir,0777,true); return file_put_contents('./'.$filePath.'/index.html',$htmlStr); } }然后调用://生成静态页 $res = CommonService::generateStaticPage($routeMaps->route,$indexHtmlStr); if (!empty($res) || $res != 0){ dump("页面生成成功"); } return view("index");这样就可以生成我们的网页了,但是有个问题,这种只是针对那种单页面,对于有数据渲染和功能交互的页面就不行了,所以我们要在进行View页面交互后生成静态页然后放入html中,如下:下面以Laravel为例:$news= News::get(); $string = view('news.news',compact("news"))->__toString(); file_put_contents("index.html", $string);现在基本上就差不多了。
查看详情点赞1评论收藏1浏览592023-05-18 11:45:03Laravel 拖拽式建站中如何给字符串模板中传入数据并在视图中展示
问题:在我们网站开发中,会遇到这样的问题,我们渲染模板、生成静态页过程或者拖拽式建站中,如何给字符串模板中传入数据并在视图中展示问题?下面我测试了2中方法,一种是通过JS插入数据,另外一种是在后台程序中就把数据和模板处理好,统一给view渲染。目前用的后台框架是laravel,其实只要了解了思路,什么语言,什么框架都一样处理。1、后台程序处理Controller:public function index(Request $request){ $data = ["你好!","早晨","很高兴和你","相遇!"]; $html = '<ul class="ulSection">temple</ul>'; $li = ""; foreach ($data as $v){ $li .= '<li>'.$v.'</li>'; } $newHtml = str_replace("temple",$li,$html,$i); return view("index",compact("newHtml")); }View:<div>{!! $newHtml !!} </div>结果:网页源代码中:2、JS处理Controllerpublic function index(Request $request){ $data = [1,2,3,4]; $json_data = json_encode($data); $html = '<ul class="ulSection"></ul>'; return view("index",compact("json_data","html")); }View<head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>全球搜C端</title> <script src="http://www.alingfeng.cn/js/jquery.min.js"></script> </head> <body> <div>欢迎访问-全球搜C端-首页</div> <div>{!! $html !!} </div> </body>JS<script> const data = {{ $json_data }}; console.log(data); var ulSection = $(".ulSection"); var html = ''; for (var i= 0; i < data.length ; i++){ html += '<li>'+data[i]+'</li>'; } ulSection.html(html); </script>结果:网页源代码中:总结:由此可以看出,两种方法都能页面效果上达到效果。数据都成功放到html结构中。但是,做网站开发的都知道。我们开发网站不一定全是用来做SEM的,我们很多网站都会用来做SEO,特别是官网和移动端网站,所以我们要考虑到我们的网站是能够被搜索引擎爬取收录的。所以,我们最好用后台模板渲染,然后再把html输出到我们的页面中。
查看详情点赞1评论收藏浏览402023-05-18 11:26:56