热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【笔记与博客收集】服务端相关知识点

服务端技术介绍(系统架构纬度):(1)服务端开发的技术栈(2)基础设施ÿ
  1. 服务端技术介绍(系统架构纬度):
    (1) 服务端开发的技术栈
    在这里插入图片描述

(2) 基础设施:

  • 操作系统
  • 网络设施
  • 机房机架

(3)支撑系统:

  • 日志系统
  • 监控报警
  • 运维系统

(4) 接入层:

  • 反向代理请求
  • Nginx
  • 负载均衡
  • 轮询/随机/权重
  • hash/一致性 hash
    在这里插入图片描述

(5) 逻辑层:

  • 根据业务逻辑,处理用户请求,得到返回结果
  • 单体式服务:所有业务逻辑集中在一个代码仓库,一个进程里
  • 简单,适合协作人数少,功能少
  • 维护/更新方便
  • 难以支持高复杂度系统
  • 微服务
  • 多人团队协作成本更低
  • 功能复用、系统解耦、故障隔离
  • 影响性能,系统复杂度指数性上升,对业务设计流程要求更高
    在这里插入图片描述

(6) 存储层:

  • 数据的 存储/转发/查询
  • SQL类关系型存储
  • NoSQL类Key-Value存储
  • 分布式文件系统
  • 队列存储

  1. 网络协议:HTTP/ HTTPS (以下内容来自HTTP与HTTPS的区别)
    (1) HTTP和HTTPS的基本概念
    HTTP(HyperText Transfer Protocol:超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。 简单来说就是一种发布和接收 HTML 页面的方法,被用于在 Web 浏览器和网站服务器之间传递信息。
    HTTP 默认工作在 TCP 协议 80 端口,用户访问网站 http:// 打头的都是标准 HTTP 服务。
    HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
    HTTPS(Hypertext Transfer Protocol Secure:超文本传输安全协议)是一种透过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
    HTTPS 默认工作在 TCP 协议443端口,它的工作流程一般如以下方式:

    1. TCP 三次同步握手
    2. 客户端验证服务器数字证书
    3. DH 算法协商对称加密算法的密钥、hash 算法的密钥
    4. SSL 安全加密隧道协商完成
    5. 网页以加密的方式传输,用协商的对称加密算法和密钥加密,保证数据机密性;用协商的hash算法进行数据完整性保护,保证数据不被篡改。

    (2) HTTP 与 HTTPS 区别

    • HTTP 明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好。
    • 使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。
    • HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包。
    • http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
    • HTTPS 其实就是建构在 SSL/TLS 之上的 HTTP 协议,所以,要比较 HTTPS 比 HTTP 要更耗费服务器资源。

    (3) HTTPS的工作原理
    在这里插入图片描述

    • 客户端发起 HTTPS 请求
      这个没什么好说的,就是用户在浏览器里输入一个 https 网址,然后连接到 server 的 443 端口。

    • 服务端的配置
      采用 HTTPS 协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl 就是个不错的选择,有 1 年的免费服务)。
      这套证书其实就是一对公钥和私钥,如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。

    • 这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。

    • 客户端解析证书
      部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。
      如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密,就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。

    • 传送加密信息
      这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。

    • 服务段解密信息
      服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。

    • 传输加密后的信息
      这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。

    • 客户端解密信息
      客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也束手无策。

  2. 数据的封装和交换:JSON/ XML/ Protocol buffers
    (1) JSON
    JSON (Javascript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于Javascript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, Javascript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
    JSON建构于两种结构:
    o “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组(associative array)。
    o 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
    其中,值的基础类型一般为字符串(String),数值(Number),布尔值(Boolean)等。

    JSON规则相对简单:

    • 单一映射用”:”分隔,即”名称/值”对
    • 并列的映射/数据用”,”分隔
    • 有序列表用”[]”表示
    • 映射集合用”{}”表示

    理论上,所有的数据结构均可以使用该规则进行定义。

    实例:
    在这里插入图片描述
    (2) XML
    XML:可扩展标记语言(eXtensible Markup Language),被设计用来传输和存储数据。在大多数Web应用程序中,XML用于传输数据,而HTML用于格式化并显示数据。但XML不仅仅用于Web应用,由于XML能有效地表示结构化数据,使得XML已经成为计算机软件领域数据交换的标准技术模式之一。通过XML实现数据的标准化、结构化,解决了在不同平台、不同系统之间的数据结构/模式的差异,使得数据层在XML技术的支持下统一起来。

    实例:
    在这里插入图片描述

    (3) Protocol buffers
    Protocol buffers 为 Google 提出的一种跨平台、多语言支持且开源的序列化数据格式。相对于类似的 XML 和 JSON,Protocol buffers 更为小巧、快速和简单。其语法目前分为proto2和proto3两种格式,是目前冗余信息最少的一种格式,需要专门工具进行生成和解析,生成的内容不具备可读性,但其高性能的优势,使得该数据格式成为了一些特定领域的理想选择。。
    相对于传统的 XML 和 JSON, Protocol buffers 的优势主要在于:更加小、更加快。对于自定义的数据结构,Protobuf 可以通过生成器生成不同语言的源代码文件,读写操作都非常方便。
    假设现在有下面 JSON 格式的数据:
    在这里插入图片描述
    使用 JSON 进行编码,得出byte长度为43的的二进制数据:
    在这里插入图片描述
    如果使用 Protobuf 进行编码,得到的二进制数据仅有20个字节
    在这里插入图片描述
    (4) 其他
    HTML:是一种基于标签(TAG)的数据格式,但领域特定,是Web服务器和客户端浏览器之间的一种交互手段,很难用在其他应用中。
    YAML:与JSON类似,采用缩进格式,它进一步减少了冗余信息。不过,由于兼容性问题,目前使用领域还比较有限

  3. 远程过程调用:RPC
    在这里插入图片描述
    (1) 介绍
    远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用,例:Java RMI。
    (2) 基本原理
    从发起远程调用到接收到数据返回结果,大致过程是:
    1)服务消费方(client)调用以本地调用方式调用服务;
    2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
    3)client stub找到服务地址,并将消息发送到服务端;
    4)server stub收到消息后进行解码;
    5)server stub根据解码结果调用本地的服务;
    6)本地服务执行并将结果返回给server stub;
    7)server stub将返回结果打包成消息并发送至消费方;
    8)client stub接收到消息,并进行解码;
    9)服务消费方得到最终结果。

    那么rpc就相当于将step2-step8的步骤进行了封装。
    在这里插入图片描述
    (3) 实现一个简单的RPC

  4. 非关系型数据库:Redis/ Memcached/ MongoDB
    Nosql的全称是Not Only Sql,这个概念早起就有人提出,在09年的时候比较火。Nosql指的是非关系型数据库,而我们常用的都是关系型数据库。就像我们常用的mysql,oralce、sqlserver等一样,这些数据库一般用来存储重要信息,应对普通的业务是没有问题的。但是,随着互联网的高速发展,传统的关系型数据库在应付超大规模,超大流量以及高并发的时候力不从心。而就在这个时候,Nosql应运而生。
    关系型数据库通常有SQL Server,Mysql,Oracle等。主流的Nosql数据库有Redis,Memcache,MongoDb。大多数的关系型数据库都是付费的并且价格昂贵,成本较大,而Nosql数据库通常都是开源的。
    (1) Redis
    支持多种数据结构,如 string(字符串)、 list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基数估算)
    支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。
    支持通过Replication进行数据复制,通过master-slave机制,可以实时进行数据的同步复制,支持多级复制和增量复制,master-slave机制是Redis进行HA的重要手段。
    单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。
    支持简单的事务需求,但业界使用场景很少,并不成熟,既是优点也是缺点。
    Redis在string类型上会消耗较多内存,可以使用dict(hash表)压缩存储以降低内存耗用。
    (2) Memcached
    Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key、value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右)。适用于最大程度扛量。支持直接配置为session handle。
    只支持简单的key/value数据结构,不像Redis可以支持丰富的数据类型。
    无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失。
    无法进行数据同步,不能将MC中的数据迁移到其他MC实例中。
    Memcached内存分配采用Slab Allocation机制管理内存,value大小分布差异较大时会造成内存利用率降低,并引发低利用率时依然出现踢出等问题。需要用户注重value设计。
    (3) MongoDB
    更高的写负载,MongoDB拥有更高的插入速度。
    处理很大的规模的单表,当数据表太大的时候可以很容易的分割表。
    高可用性,设置M-S不仅方便而且很快,MongoDB还可以快速、安全及自动化的实现节点(数据中心)故障转移。
    快速的查询,MongoDB支持二维空间索引,比如管道,因此可以快速及精确的从指定位置获取数据。MongoDB在启动后会将数据库中的数据以文件映射的方式加载到内存中。如果内存资源相当丰富的话,这将极大地提高数据库的查询速度。
    非结构化数据的爆发增长,增加列在有些情况下可能锁定整个数据库,或者增加负载从而导致性能下降,由于MongoDB的弱数据结构模式,添加1个新字段不会对旧表格有任何影响,整个过程会非常快速。
    不支持事务。MongoDB占用空间过大 。
    MongoDB没有成熟的维护工具。
    (4) 比较
    三者的性能都比较高,总的来讲:Memcache和Redis差不多,要高于MongoDB。
    memcache数据结构单一。redis丰富一些,数据操作方面,redis更好一些,较少的网络IO次数。mongodb支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。
    redis:数据量较小的更性能操作和运算上。
    memcache:用于在动态系统中减少数据库负载,提升性能;做缓存,提高性能(适合读多写少,对于数据量比较大,可以采用sharding)。
    MongoDB:主要解决海量数据的访问效率问题。

  5. 关系型数据库:Mysql
    MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
    (由于专业课程数据库原理中已经学习过,这里不做进一步描述)

  6. 消息队列: Kafka/ RabbitMQ/ ZeroMQ
    消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为:

    当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候。

    消息队列主要解决了应用耦合、异步处理、流量削锋等问题。
    当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,而部分数据库如Redis、Mysql以及phxsql也可实现消息队列的功能。
    (1) Kafka
    Apache Kafka是一个分布式消息发布订阅系统。它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log),,之后成为Apache项目的一部分。Kafka系统快速、可扩展并且可持久化。它的分区特性,可复制和可容错都是其不错的特性。

    主要特性:

    1. 快速持久化,可以在O(1)的系统开销下进行消息持久化;
    2. 高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;
    3. .完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现负载均衡;
    4. 支持同步和异步复制两种HA;
    5. 支持数据批量发送和拉取;
    6. zero-copy:减少IO操作步骤;
    7. 数据迁移、扩容对用户透明;
    8. 无需停机即可扩展机器;
    9. 其他特性:严格的消息顺序、丰富的消息拉取模型、高效订阅者水平扩展、实时的消息订阅、亿级的消息堆积能力、定期删除机制;

    (2) RabbitMQ
    RabbitMQ 2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。

    主要特性:

    1. 可靠性: 提供了多种技术可以让你在性能和可靠性之间进行权衡。这些技术包括持久性机制、投递确认、发布者证实和高可用性机制;
    2. 灵活的路由: 消息在到达队列前是通过交换机进行路由的。RabbitMQ为典型的路由逻辑提供了多种内置交换机类型。如果你有更复杂的路由需求,可以将这些交换机组合起来使用,你甚至可以实现自己的交换机类型,并且当做RabbitMQ的插件来使用;
    3. 消息集群:在相同局域网中的多个RabbitMQ服务器可以聚合在一起,作为一个独立的逻辑代理来使用;
    4. 队列高可用:队列可以在集群中的机器上进行镜像,以确保在硬件问题下还保证消息安全;
    5. 多种协议的支持:支持多种消息队列协议;
    6. 服务器端用Erlang语言编写,支持只要是你能想到的所有编程语言;
    7. 管理界面: RabbitMQ有一个易用的用户界面,使得用户可以监控和管理消息Broker的许多方面;
    8. 跟踪机制:如果消息异常,RabbitMQ提供消息跟踪机制,使用者可以找出发生了什么;
    9. 插件机制:提供了许多插件,来从多方面进行扩展,也可以编写自己的插件;

    (3) ZeroMQ
    ZeroMQ(也称为 ØMQ,0MQ 或 zmq)是一个可嵌入的网络通讯库(对 Socket 进行了封装)。 它提供了携带跨越多种传输协议(如:进程内,进程间,TCP 和多播)的原子消息的 sockets 。 有了ZeroMQ,我们可以通过发布-订阅、任务分发、和请求-回复等模式来建立 N-N 的 socket 连接。 ZeroMQ 的异步 I / O 模型为我们提供可扩展的基于异步消息处理任务的多核应用程序。 它有一系列语言API(几乎囊括所有编程语言),并能够在大多数操作系统上运行。

    传统的 TCP Socket 的连接是1对1的,可以认为“1个 socket = 1个连接”,每一个线程独立维护一个 socket 。但是 ZMQ 摒弃了这种1对1的模式,ZMQ的 Socket 可以很轻松地实现1对N和N对N的连接模式,一个 ZMQ 的 socket 可以自动地维护一组连接,用户无法操作这些连接,用户只能操作套接字而不是连接本身。所以说在 ZMQ 的世界里,连接是私有的。

    主要特性:

    1. 支持高并发的异步 Socket 框架
    2. 协议比 TCP 更快、适用于大型集群和分布式计算
    3. 提供多种消息传递机制,如 inproc/IPC/TCP/multicast 等
    4. 内置丰富的组合模式,可用于简化大型分步式计算架构
    5. 提供异步 I/O 模式,适用于可扩展的多核应用开发
    6. 拥有活跃的开发者社区提供技术支持,发展相当迅速
    7. 支持超过 30 种的编程语言,如 C/C++/Java/.NET/Python/PHP 等
    8. 良好的跨平台性,支持多种 OS,如 Linux/Windows/OS X 等
    9. 拥有 iMatix 公司的商业级别支持,却是完全免费的

推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • Java工程师书单(初级,中级,高级)
    简介怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作一两年之后开始迷茫的程序 ... [详细]
  • 【转】腾讯分析系统架构解析
    TA(TencentAnalytics,腾讯分析)是一款面向第三方站长的免费网站分析系统,在数据稳定性、及时性方面广受站长好评,其秒级的实时数据更新频率也获得业界的认可。本文将从实 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 集成电路企业在进行跨隔离网数据交换时面临着安全性问题,传统的数据交换方式存在安全性堪忧、效率低下等问题。本文以《Ftrans跨网文件安全交换系统》为例,介绍了如何通过丰富的审批流程来满足企业的合规要求,保障数据交换的安全性。 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • MySQL笔记_MySQL笔记1|数据库17问17答
    本文由编程笔记#小编为大家整理,主要介绍了MySQL笔记1|数据库17问17答相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了自动化测试专家Elfriede Dustin在2008年的文章中讨论了自动化测试项目失败的原因。同时,引用了IDT在2007年进行的一次软件自动化测试的研究调查结果,调查显示很多公司认为自动化测试很有用,但很少有公司成功实施。调查结果表明,缺乏资源是导致自动化测试失败的主要原因,其中37%的人认为缺乏时间。 ... [详细]
author-avatar
手机用户2502875333
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有