REC
首页
文章分类
源码资源
技术教程
程序软件
文创娱乐
玄学修炼
关于我们
其他页面
网站统计
友情链接
用户留言
高清壁纸
关于易航
热门文章
Joe再续前缘主题 - 搭建本站同款网站
易航网址导航系统 – 功能强大,轻量易用
JsonDb-PHP轻量级文件数据库系统
Typecho一键调整网站为冬天情景插件
V免签全开源免签约码支付系统(支持:支付宝 微信 QQ)
标签搜索
PHP
Web前端
网站源码
PHP源码
Typecho
Typecho插件
课程资料
Windows程序
Android软件
武术内功
HTML源码
Web
Joe主题
Python
Windows
国漫
网络协议
MySQL
NodeJs
小说
发布
登录
注册
找到
245
篇与
易航
相关的结果
- 第 20 页
2022-08-19
被“嫌弃”的PHP:未来仍光明
即使面临各种新技术的挑战,PHP 的未来仍然光明。多年来,在 Web 开发社区内部形成了一种厌恶 PHP 的气氛。现如今,厌恶 PHP 和赞美新技术(如 Node)几乎成了一种奇想。特别是在年轻的社区,PHP 被认为是一只“恐龙”。 PHP 是一门伟大的编程语言。 它并不完美,有利有弊,但总的来说,如果你从事 Web 开发工作,你最好试着去理解它,而不是跟风去厌恶它…… 你甚至可以从中学到一些东西! 图片 我们来看看 PHP 和 Node 之间的区别,这些区别让很多人留在了 PHP 平台,也让其他人转向了不同的编程语言! 社区 PHP 社区比 Node 社区大。 NPM/Node 社区也很大,但缺乏能够真正维护好和做好 Node 包的人。 很多模块被弃用或不再更新。最糟糕的是,大多数模块依赖了其他大量的模块,这意味着如果你使用的模块依赖了一个包含漏洞的旧模块,你可能不知情,或者需要花很多时间自己去更新所有的东西。 这很重要,因为不管一门编程语言或一个框架有多好,如果没有人维护,或者如果没有关于它的讨论、PR或者开源项目,它最终就会消亡。 PHP 生态系统为你提供了大量的库:JWT 身份验证、生成 Excel 电子表格和 PDF、缓存管理、ORM 框架……这些库被广泛使用,具有很好的安全性,且提供了良好的文档。 Symfony 框架也提供了一些官方文档,比如 LexikJWTAuthentication! 事实上,大约 80% 的 Web 应用使用 PHP 开发。 框架 Symfony 和 Laravel 这两个主要的 PHP 框架现在是 Web 的一个巨大组成部分。Laravel 在美国很受欢迎,Symfony 在欧洲很受欢迎,如果我们把 WordPress 去掉,这两个框架占了 PHP 生态系统的 90% 以上。 这些框架比大多数 Node 的框架都要老,并且比现在的 Node 框架拥有更广泛的包和文档生态系统。 在使用 Symfony 过程中遇到了问题?版本 3?版本 4?这都不是事!大量的 StackOverflow 帖子、Medium 文章、官方文档可供你参考。 Symfony 和 Laravel 也提供了一些“基本的项目结构”,你当然可以不用它,你可以按照你想要的方式构建你的项目,但这些基本模式通常适用于多种类型的应用。 在大多数情况下,我们可以通过配置对它们进行调整,以满足我们的各种需求。由于这些框架已经推出了好几年,你可能想到的大多数有用的特性都已经有了,因为在你之前的那些开发人员也有与你同样的需求。 我们以 Express 为例,它是 Node 最著名的框架,主要用于编写 API,它并没有提供强制的结构。这意味着一个没有经验的开发人员更有可能构建出一些不符合标准的东西,而 PHP 框架在这方面的风险要小得多。 性能 Node 的速度很快,在某些情况下比 PHP 更快,但 PHP 也不是太糟糕。 PHP 8.1 借助 OPCache 和 JIT 编译获得更快的执行速度。 Node 在速度方面利用了它的异步特性,但它是单线程的。PHP 利用了在多个线程上运行的优势,而且是同步的。 事实上,现在服务器的价格一般都不会很高,伸缩一个 Web 应用从未像今天这样容易。对于小型 Web 应用来说,鉴于如今的计算能力,性能不再是一个值得花太多时间去争论的点。 然而,对于大规模的应用程序,价格可能是一个关注点。 这就是为什么把常用的 PHP-FPM/Nginx 栈换成 Swoole 会是一个不错的选择。 我曾经看到过一些 PHP 应用程序将 Swoole 作为底层的 HTTP 服务器,在性能上击败了 Node! 此外,使用消息队列是平衡应用程序工作负载的一个很好的方法,这可以很容易地使用 PHP 和 Node 来实现。 易用性 虽然 Node/Express 经常被用来编写 API,并与使用 React/Angular/Vue 等框架构建的前端通信,但大多数 PHP 框架都采用了 MVC 模式。 MVC 即模型视图控制器。一张图片胜过长篇大论:如果你不了解 MVC,这里有一张图可以帮你快速理解 MVC 模式。 图片 构建一个前后端分离的应用程序通常比使用支持前后端技术栈的框架要慢。事实上,许多后端开发人员知道如何编写出色的 HTML/CSS,但不熟悉 React 或其他框架的概念或语法。 结论 PHP 和 Node 各有优点和缺点。 如果你需要稳定性、可靠性和长期支持,我建议使用 PHP。 这些框架成熟且安全,在我看来是首选。 不过,对于需要高吞吐量和实时数据处理的 API 来说,Node 是一个不错的选择。另外,有一些项目不能用 PHP 来完成,比如 Discord 机器人(尽管可能可以用 PHP 来实现,但已经有一个官方的 JavaScript 库……) 有时候,用另一种编程语言来开发应用程序也是不错的,我们可以从中发现一些新的概念或做事的方式,然后将它们应用到其他编程语言中。
技术教程
# PHP
易航
3年前
1
158
6
2022-08-19
PHP 8.2将在今年内发布,一起来看看都有什么新特征
PHP 8.2预计将于今年11月发布,最新的稳定版本是PHP 8.1.5。虽然现在还为时过早,但对更新的接受程度参差不齐。 但是,知道会发生什么可以帮助您为最新的PHP版本做好准备。通过了解新功能和不推荐使用的功能,您可以了解更新可能如何影响开发。这些知识还可以帮助您为最终发布做好准备。 在这篇文章中,我们将回顾最新的PHP版本。然后我们将介绍PHP 8.2中的新功能并讨论发布时间表。 PHP版本概述 PHP 7.4引入了类型化属性、下划线数字分隔符和各种改进。从那时起,已经发布了更多的PHP迭代。 2020年11月发布的PHP 8.0带来了一些基本功能。除了语法和性能增强之外,该版本还包括: 命名参数 匹配语法 Union类型 Constructor Property Promotion JIT(影响PHP执行源代码的方式) 一年后出现了PHP 8.1,这是最新的主要PHP版本。此更新包括重要功能,例如: Intersection类型 只读属性 Enums Fibers 从不返回类型 掌握最新版本的PHP有助于提高网站的性能和安全性。但是,重要的是要知道在升级之前会发生哪些变化。如果您有兴趣测试PHP 8.2的当前状态,可以通过GitHub进行。 PHP 8.2中的新功能 PHP 8.2预计将于2022年底发布。这是当前的发布时间表,计划于2022年11月24日发布通用版本 (GA): 19be6b 19be6b 19be6b 19be6b 19be6b 19be6b 19be6b 19be6b 19be6b 19be6b 19be6b 19be6b 19be6b 19be6b 根据PHP网站上的官方文档,应该有一些新特性和不推荐使用的功能。 新的 memory_reset_peak_usage 函数 PHP 8.2将包含一个名为 memory_reset_peak_usage 的新函数。它将重置 memory_get_peak_usage 函数返回的峰值内存使用量。 对于涉及多次调用操作并记录每次迭代的峰值内存使用情况的情况,此功能将很有帮助。开发人员将能够使用此新功能在请求的生命周期内的任何给定时间重置峰值内存使用量。 只读类 在PHP 8.1中引入,只读属性将在PHP 8.2中扩展以添加语法糖,以便所有类属性一次都是只读的: readonly class Post { public function __construct( public string $title, public Author $author, public string $body, public DateTime $publishedAt, ) { } }这将防止将动态属性添加到类中。 Null 和 False 独立类型 在PHP 8.2中,false 的返回类型将作为独立类型使用,而不是严格的联合类型,用于发生错误时,这已经是可能的: function alwaysFalse(): false { return false; }null 类型也是如此。例如,作为独立类型,与以前不同,NullPost::getAuthor() 将只能返回 null 。 弃用动态属性 动态属性将在PHP 8.2中被弃用,导致PHP 9.0出现 ErrorException。这些属性是在对象上设置的: class Post { public string $title; } // … $post->name = 'Name';动态属性允许在没有严格的类声明的情况下创建类(例如,值对象)时具有灵活性。对于依赖动态属性的开发人员来说,他们的弃用可能会成为一个问题,因为这会促使他们更多地进行静态分析。出于这个原因,一些开发人员对PHP 8.2的这种变化感到担忧。 但是,使用 __get 和 __set 的类仍将支持动态属性,stdClass 的对象也将如此。 或者,开发人员可以在这些属性的类上使用在全局命名空间中声明的新 #[AllowDynamicProperties]attribute: # [AllowDynamicProperties] class User{} $user = new User(); $user->foo = 'bar';虽然不建议这样做,但另一种选择是禁用弃用警告。 新的 /n 修饰符 PHP 8.2将包含对 preg_* 函数系列的 /n (no capture) modifier的支持。使用时,除了已命名的捕获组之外,任何具有()meta-characters的组都不会捕获。 本质上,结果与将每个组标记为非捕获相同。 此更改背后的原因是修饰符简化了多个组的复杂正则表达式。开发人员可以将所有组标记为非捕获,而不是将每个组都营销为非捕获。 然后,他们可以选择并命名需要捕获的特定组。 在回溯中编辑参数 许多开发人员使用从代码库跟踪堆栈跟踪和生产错误的服务。这些服务可以在出现问题时通知用户。例如,在调试应用程序时跟踪调用堆栈很有帮助。 但是,有时堆栈跟踪可能包含敏感信息,例如用户名和密码。PHP 8.2将包含一个 #[SensitiveParameter] 属性,当出现问题时,该属性将防止此信息包含在堆栈跟踪中: function test($foo, #[\SensitiveParameter] $bar, $baz) { throw new Exception('Error'); } test('foo', 'bar', 'baz');PHP 8.2将使用敏感参数从堆栈跟踪中编辑私有信息,使其更加安全。这些参数确保数据不会出现在错误日志中。请注意,此属性仅可用于参数。 弃用 ${} 字符串插值 有多种方法可以使用PHP在字符串中嵌入变量。但是,PHP 8.2将弃用两种方法。第一个是在字符串中使用 ${}: $str = "Hello ${world}";第二个是使用 ${}(变量) : $str = "Hello ${(world)}";这对开发人员来说可能不是一个重大问题,因为两种最流行的字符串插值方法仍然有效。 弃用部分支持的可调用对象 另一个不推荐使用的更改是部分支持的callables。有多种方法可以在 PHP 中创建可调用对象。可以使用 $callable() 语法、user_call_func(array) 或使用带有回调的函数调用带或不带参数的函数。 已弃用的可调用模式包括以下内容: $callable = "self::method"; $callable = "parent::method"; $callable = "static::method"; $callable = ["self", "method"]; $callable = ["parent", "method"]; $callable = ["static", "method"]; $callable = ["MyClass", "MyParentClass::myMethod"]; $callable = [new MyClass(), "MyOtherClass::myMethod"]从PHP 8.2开始,调用上述任何一个都将导致以下弃用通知: class Test { public static function myMethod(): void { echo "Called"; } public static function call(): void { $callable = 'self::myMethod'; call_user_func($callable); } } $callable = Test::call(); // "Called"但是,将这些可调用对象传递给is_callable函数或将它们与可调用参数类型一起使用不会生成弃用消息。为了防止出现弃用通知,开发人员可以使用::class 魔术方法将可调用代码中的parent、self和static关键字转换为各自的类名。 更改背后的部分原因是允许将可调用对象用于类型化属性。它使它们不那么依赖于上下文。 MySQLi不能再用libmysql编译 过去,PHP支持两个库来连接MySQL数据库:mysqlnd和libmysql。自PHP 5.4起,前者已成为默认库。但是,可以通过扩展编译MySQLi。 从PHP 8.2开始,将不支持使用libmysql编译MySQLi扩展。尝试这样做会导致配置错误: ./configure --with-mysqli=FOO不再支持将mysqli与外部库链接 这不太可能对开发人员造成任何重大错误。但是,通过LDAP和SASL自动重新连接和身份验证支持libmysql支持的两个mysqlnd不可用的最大功能。
技术教程
# PHP
易航
3年前
2
191
1
2022-08-19
PHP过滤XSS攻击插件源码实例
Xss 攻击是最经常遇到的攻击了,其中原理大家应该都懂了,我就不再这里做更多的详解了。 今天给大家分享的实例源码,直接可用的那种。虽然现在很多框架都封装了这种,但是作为 PHP 开发者的你,XSS 攻击原理与防止还是要懂得的。 文档说明: 1.将 waf.php 传到要包含的文件的目录 2.在页面中加入防护,有两种做法,根据情况二选一即可: a 在所需要防护的页面加入代码: require_once('waf.php');就可以做到页面防注入、跨站。如果想整站防注,就在网站的一个公用文件中,如数据库链接文件 config.inc.php 中添加 require_once('waf.php'); 来调用本代码 b 在每个文件最前加上代码 在 php.ini 中找到: Automatically add files before or after any PHP document. auto_prepend_file = waf.php路径;PHP 文件 waf.php 隐藏内容,请前往内页查看详情
技术教程
# PHP源码
# PHP
易航
3年前
4
129
2
2022-08-19
JsonDb-PHP轻量级文件数据库系统
介绍 JsonDb 是一款由原生 PHP 实现的非关系型轻量级 JSON 文件数据库。如果你需要存储各种基础类的数据,或者一个站点内有多个小项目,那么 JsonDb 就是你最佳的选择。它包括查询、新增、更新、删除等对数据的基本操作,适合存储数据量不大的数据 使用帮助文档:https://yepydvmpxo.k.topthink.com/@json-db/ 软件架构 由纯原生 PHP 实现的 JSON 文件数据库,将数据存储为 JSON 格式,不占用 MySql 资源纯以读写文件的形式查询数据库,用法类似于 ThinkPHP 的查询。 安装教程 composer require jsondb/jsondb:dev-master使用说明 use JsonDb\JsonDb\Db; // composer自动加载 require 'vendor/autoload.php'; // 默认关闭数据压缩、加密并开启调试模式,可使用自定义配置 // 自定义配置项 具体配置请参考文档:https://yepydvmpxo.k.topthink.com/@json-db/ $json_path = $_SERVER['DOCUMENT_ROOT'] . 'content' . DIRECTORY_SEPARATOR . 'JsonDb'; Db::setConfig([ 'path' => $json_path, // 数据存储路径(必须配置) 'file_suffix' => '.json', // 文件后缀名 'debug' => true, // 调试模式 'encode' => null, // 数据加密函数 'decode' => null, // 数据解密函数 ]); // 添加单条数据 Db::name('table_name')->insert([ 'a' => 5, 'b' => "测试5" ]); // 添加多条数据 Db::name('table_name')->insertAll([ [ 'a' => 5, 'b' => "测试5" ], [ 'c' => 1, 'b' => "测试" ] ]); // 删除一行中的部分数据 Db::name('table_name')->where('b', '测试3')->delete(['a', 'b']); // 删除一行数据 Db::name('table_name')->where('b', '测试3')->deleteAll(); // 更新数据 Db::name('table_name')->where('b', '测试4')->update(['c' => '测试测试']); // 根据ID查询数据 Db::name('table_name')->where('id', 0)->find(); // 查询单条数据 Db::name('table_name')->where('b', '测试')->find(); // 查询多条数据 Db::name('table_name')->where('b', '测试4')->select(); // 查询所有数据 Db::name('table_name')->selectAll(); // 自定义查询表达式 Db::name('table_name')->where('id', '>', 4)->select(); // 链式where Db::name('table_name')->where('id', 1)->where('a', 2)->select(); // 自定义判断条件 $select = Db::name('table_name')->where('`field_id` == 0 || `field_b` == `测试4`')->select(); // 字段LIKE查询 Db::name('table_name')->whereLike('b', '%测试')->select(); // 限制结果数量 Db::name('user')->where('status', 1)->limit(10)->select(); // 限制每次最大写入数量 Db::name('user')->limit(100)->insertAll($userList);
技术教程
# PHP
易航
3年前
0
1,548
4
2022-08-17
有了HTTP,为什么还要RPC?
有了HTTP,为什么还要RPC? RPC:Remote Procedure Call,远程过程调用 一直以来都没有深究过RPC和HTTP的区别,不都是写一个服务然后在客户端调用么? HTTP和RPC最本质的区别,就是 RPC 主要是基于 TCP/IP 协议的,而 HTTP 服务主要是基于 HTTP 协议的。 我们都知道 HTTP 协议是在传输层协议 TCP 之上的,所以效率来看的话,RPC 当然是要更胜一筹啦! HTTP和RPC的相同点是,底层通讯都是基于socket,都可以实现远程调用,都可以实现服务调用服务 HTTP 的本质 首先你要明确 HTTP 是一个协议,是一个超文本传输协议。 HTTP 它是协议,不是运输通道。 它基于 TCP/IP 来传输文本、图片、视频、音频等。 重点来了。 HTTP 不提供数据包的传输功能,也就是数据包从浏览器到服务端再来回的传输和它没关系。 这是 TCP/IP 干的。 那 HTTP 有啥用?我们来分析一波。 我们上网要么就是获取一些信息来看,要么就是修改一些信息。 比如你用浏览器刷微博就是获取信息,发微博就是修改信息。 所以说浏览器需要告知服务器它需要什么,这次的请求是要获取哪些信息?发怎么样的微博。 这就涉及到浏览器和服务器之间的通信交互。 而交互就需要一种格式。 像你我之间的谈话就用中文,你要突然换成俄语我听不懂那不就 GG 了。 所以说 HTTP 它规定了一种格式,一种通信格式,大家都用这个格式来交谈。 这样不论你是什么服务器、什么浏览器都能顺利的交流,减少交互的成本。 就像全世界如果都讲中文,那我们不就不需要学英文了,那不就较少交互的成本了。 不像现在我们还得学英文,不然就看不懂文档等等。 万一之后俄语又起来了,咱还得对接俄文,这交互成本是不是就上来了。 而网络世界还好,咱们现在的 Web 交互基本上就是 HTTP 了。 其实 HTTP 协议的格式很像我们信封,有个固定的格式。 左上角写邮编,右上角贴邮票,然后地址姓名啥的依次来。 因为计算机是很死板的,不像我们人一样有一种立体扫描感,所以要规定先写头、再写尾。 你要是先写尾,再写头计算机就认不出来了。 所以 HTTP 就规定了请求先搞请求行、再搞请求报头、再搞请求体。 响应就状态行、响应报头、响应体。 所以 HTTP 的本质是什么? 就是客户端和服务端约定好的一种通信格式。 HTTP 和 RPC 的关系 HTTP 和 RPC 其实是两个维度的东西, HTTP 指的是通信协议。 而 RPC 则是远程调用,其对应的是本地调用。 RPC 的通信可以用 HTTP 协议,也可以自定义协议,是不做约束的。 像之前的单体时代,我们的 service 调用就是自己实现的方法,是本地进程内的调用。 public User getUserById(Long id) { return userDao.getUserById(id); // 这叫本地调用 }现在都是微服务了,根据业务模块做了不同的拆分,像用户的服务不用我这个小组负责,我这小组只要写订单服务就行了。 但是我们服务需要用到用户的信息,于是我们需要调用用户小组的服务,于是代码变成了以下这种 public User getUserById(Long id) { return userConsumer.getUserById(id); // 这是远程调用,逻辑是用户小组的服务实现的。 }把之前的用户实现拆分出来弄了一个用户服务,订单相关的也拆成了订单服务,都单独部署。 这样订单相关的服务要获取用户的信息就需要远程调用了。 可以看到 RPC 就是通过网络进行远程调用,订单服务其实就是客户端,而用户服务是服务端。 这又涉及到交互了,所以也需要约定一个格式,至于要不要用 HTTP 这个格式,就是大家自己看着办。 至此相信你对 HTTP 是啥也清楚了。 RPC 和 HTTP 的之间的关系也清楚了。 那为什么要有 RPC? 可能你常听到什么什么之间是 RPC 调用的,那你有没有想过为什么要 RPC, 我们直接 WebClient HTTP 调用不行么? 其实 RPC 调用是因为服务的拆分,或者本身公司内部的多个服务之间的通信。 服务的拆分独立部署,那服务间的调用就必然需要网络通信,用 WebClient 调用当然可行,但是比较麻烦。 我们想即使服务被拆分了但是使用起来还是和之前本地调用一样方便。 所以就出现了 RPC 框架,来屏蔽这些底层调用细节,使得我们编码上还是和之前本地调用相差不多。 并且 HTTP 协议比较的冗余,RPC 都是内部调用所以不需要太考虑通用性,只要公司内部保持格式统一即可。 所以可以做各种定制化的协议来使得通信更高效。 比如规定 yes 代表 yes的练级攻略,你看是不是更高效了,少传输的 5 个字。 就像特殊行动的暗号,高效简洁! 所以公司内部服务的调用一般都用 RPC,而 HTTP 的优势在于通用,大家都认可这个协议。 所以三方平台提供的接口都是通过 HTTP 协议调用的。 所以现在知道为什么我们调用第三方都是 HTTP ,公司内部用 RPC 了吧? 上面这段话看起来仿佛 HTTP 和 RPC 是对等关系,不过相信大家看了之前的解析心里应该都有数了。 下面来具体说一说 RPC 服务和 HTTP 服务的区别。 OSI 网络七层模型 在说 RPC 和 HTTP 的区别之前,我觉得有必要了解一下 OSI 的七层网络结构模型 它可以分为以下几层:(从上到下) 第一层:应用层。定义了用于在网络中进行通信和传输数据的接口。 第二层:表示层。定义不同的系统中数据的传输格式,编码和解码规范等。 第三层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断。 第四层:传输层。管理着网络中的端到端的数据传输。 第五层:网络层。定义网络设备间如何传输数据。 第六层:链路层。将上面的网络层的数据包封装成数据帧,便于物理层传输。 第七层:物理层。这一层主要就是传输这些二进制数据。 实际应用过程中,五层协议结构里面是没有表示层和会话层的。应该说它们和应用层合并了。 我们应该将重点放在应用层和传输层这两个层面。因为 HTTP 是应用层协议,而 TCP 是传输层协议。 好,知道了网络的分层模型以后我们可以更好地理解为什么 RPC 服务相比 HTTP 服务要 Nice 一些! RPC 服务 从三个角度来介绍 RPC 服务,分别是: RPC 架构 同步异步调用 流行的 RPC 框架 RPC 架构 先说说 RPC 服务的基本架构吧。我们可以很清楚地看到,一个完整的 RPC 架构里面包含了四个核心的组件。 分别是: Client Server Client Stub Server Stub(这个Stub大家可以理解为存根) 分别说说这几个组件: 客户端(Client),服务的调用方。 服务端(Server),真正的服务提供者。 客户端存根,存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。 服务端存根,接收客户端发送过来的消息,将消息解包,并调用本地的方法。 RPC 主要是用在大型企业里面,因为大型企业里面系统繁多,业务线复杂,而且效率优势非常重要的一块,这个时候 RPC 的优势就比较明显了。 比如我们有一个处理订单的系统服务,先声明它的所有的接口,然后将整个项目打包,服务端这边引入,然后实现相应的功能,客户端这边也只需要引入就可以调用了。 为什么这么做? 主要是为了减少客户端这边的包大小,因为每一次打包发布的时候,包太多总是会影响效率。 另外也是将客户端和服务端解耦,提高代码的可移植性。 同步调用与异步调用 什么是同步调用?什么是异步调用? 同步调用就是客户端等待调用执行完成并返回结果。 异步调用就是客户端不等待调用执行完成返回结果,不过依然可以通过回调函数等接收到返回结果的通知。如果客户端并不关心结果,则可以变成一个单向的调用。 流行的 RPC 框架 目前流行的开源 RPC 框架还是比较多的。下面重点介绍三种: ①gRPC 是 Google 最近公布的开源软件,基于最新的 HTTP2.0 协议,并支持常见的众多编程语言。 我们知道 HTTP2.0 是基于二进制的 HTTP 协议升级版本,目前各大浏览器都在快马加鞭的加以支持。 这个 RPC 框架是基于 HTTP 协议实现的,底层使用到了 Netty 框架的支持。 ②Thrift 是 Facebook 的一个开源项目,主要是一个跨语言的服务开发框架。它有一个代码生成器来对它所定义的 IDL 定义文件自动生成服务代码框架。 用户只要在其之前进行二次开发就行,对于底层的 RPC 通讯等都是透明的。不过这个对于用户来说的话需要学习特定领域语言这个特性,还是有一定成本的。 ③Dubbo 是阿里集团开源的一个极为出名的 RPC 框架,在很多互联网公司和企业应用中广泛使用。协议和序列化框架都可以插拔是及其鲜明的特色。 HTTP 服务 通常,我们的开发模式一直定性为 HTTP 接口开发,也就是我们常说的 RESTful 风格的服务接口。 的确,对于在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便。 利用现成的 HTTP 协议进行传输。 平时的工作主要就是进行接口的开发,还要写一大份接口文档,严格地标明输入输出是什么?说清楚每一个接口的请求方法,以及请求参数需要注意的事项等。 比如下面这个例子: POST http://blog.bri6.cn/ 接口可能返回一个 JSON 字符串或者是 XML 文档。然后客户端再去处理这个返回的信息,从而可以比较快速地进行开发。 但是对于大型企业来说,内部子系统较多、接口非常多的情况下,RPC 框架的好处就显示出来了,首先就是长链接,不必每次通信都要像 HTTP 一样去 3 次握手什么的,减少了网络开销。 其次就是 RPC 框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。 小结 RPC 服务和 HTTP 服务还是存在很多的不同点的,一般来说,RPC 服务主要是针对大型企业的,而 HTTP 服务主要是针对小企业的,因为 RPC 效率更高,而 HTTP 服务开发迭代会更快。 很多RPC框架包含了重试机制,路由策略,负载均衡策略,高可用策略,流量控制策略等等。如果应用进程之间只使用HTTP协议通信,显然是无法完成上述功能的。 总之,选用什么样的框架不是按照市场上流行什么而决定的,而是要对整个项目进行完整地评估,从而在仔细比较两种开发框架对于整个项目的影响,最后再决定什么才是最适合这个项目的。 一定不要为了使用 RPC 而每个项目都用 RPC,而是要因地制宜,具体情况具体分析。
技术教程
# 网络协议
易航
3年前
0
81
1
2022-08-14
无违规封v群
100%有效!!! 隐藏内容,请前往内页查看详情
付费阅读
¥
0.99
技术教程
易航
3年前
1
266
2
2022-08-13
HTTP(S)状态码详解教程
导读:当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。HTTP状态码常见于网站日志分析 (1)、HTTP状态码的英文为 HTTP Status Code。下面是常见的HTTP状态码: 200 – 请求成功 301 – 资源(网页等)被永久转移到其它URL 404 – 请求的资源(网页等)不存在 500 – 内部服务器错误 (2)、HTTP状态码的分类 HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型: 1** 信息,服务器收到请求,需要请求者继续执行操作 2** 成功,操作被成功接收并处理 3** 重定向,需要进一步的操作以完成请求 4** 客户端错误,请求包含语法错误或无法完成请求 5** 服务器错误,服务器在处理请求的过程中发生了错误 一、(1**)开头的状态码详解 100:客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。 101:服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。例如,切换到新的HTTP 版本比旧版本更有优势,或者切换到一个实时且同步的协议以传送利用此类特性的资源。 102:由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。 二、(2**)开头的状态码详解 200:请求已成功,请求所希望的响应头或数据体将随此响应返回。实际的响应将取决于所使用的请求方法。在GET请求中,响应将包含与请求的资源相对应的实体。在POST请求中,响应将包含描述或操作结果的实体。 201:请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其 URI 已经随Location 头信息返回。假如需要的资源无法及时建立的话,应当返回 ‘202 Accepted’。 202:服务器已接受请求,但尚未处理。正如它可能被拒绝一样,最终该请求可能会也可能不会被执行。在异步操作的场合下,没有比发送这个状态码更方便的做法了。返回202状态码的响应的目的是允许服务器接受其他过程的请求(例如某个每天只执行一次的基于批处理的操作),而不必让客户端一直保持与服务器的连接直到批处理操作全部完成。在接受请求处理并返回202状态码的响应应当在返回的实体中包含一些指示处理当前状态的信息,以及指向处理状态监视器或状态预测的指针,以便用户能够估计操作是否已经完成。 203:服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。当前的信息可能是原始版本的子集或者超集。 204:服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。响应可能通过实体头部的形式,返回新的或更新后的元信息。如果存在这些头部信息,则应当与所请求的变量相呼应。如果客户端是浏览器的话,那么用户浏览器应保留发送了该请求的页面,而不产生任何文档视图上的变化,即使按照规范新的或更新后的元信息应当被应用到用户浏览器活动视图中的文档。由于 204 响应被禁止包含任何消息体,因此它始终以消息头后的第一个空行结尾。 205:服务器成功处理了请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,立即重置表单,以便用户能够轻松地开始另一次输入。 206:服务器已经成功处理了部分 GET 请求。类似于 FlashGet 或者迅雷这类的 HTTP 下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。 207:由 WebDAV(RFC 2518)扩展的状态码,代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。 三、(3**)开头的状态码详解 300:被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。 301:被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。 302:请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。 303:对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源。这个方法的存在主要是为了允许由脚本激活的POST请求输出重定向到一个新的资源。这个新的 URI 不是原始资源的替代引用。同时,303响应禁止被缓存。 304:如果客户端发送了一个带条件的GET请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。 305:被请求的资源必须通过指定的代理才能被访问。Location 域中将给出指定的代理所在的 URI 信息,接收者需要重复发送一个单独的请求,通过这个代理才能访问相应资源。只有原始服务器才能建立305响应。 306:在最新版的规范中,306状态码已经不再被使用。 307:请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。 四、(4**)开头的状态码详解 400:1、语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。2、请求参数有误。 401:当前请求需要用户验证。该响应必须包含一个适用于被请求资源的 WWW-Authenticate 信息头用以询问用户信息。客户端可以重复提交一个包含恰当的Authorization头信息的请求。如果当前请求已经包含了 Authorization证书,那么401响应代表着服务器验证已经拒绝了那些证书。如果401响应包含了与前一个响应相同的身份验证询问,且浏览器已经至少尝试了一次验证,那么浏览器应当向用户展示响应中包含的实体信息,因为这个实体信息中可能包含了相关诊断信息。 402:该状态码是为了将来可能的需求而预留的。 403:服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。 404:请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。 405:请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow 头信息用以表示出当前资源能够接受的请求方法的列表。 406:请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。 407:与401响应类似,只不过客户端必须在代理服务器上进行身份验证。 408:请求超时。客户端没有在服务器预备等待的时间内完成一个请求的发送。客户端可以随时再次提交这一请求而无需进行任何更改。 409:由于和被请求的资源的当前状态之间存在冲突,请求无法完成。 410:被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。 411:服务器拒绝在没有定义Content-Length头的情况下接受请求。在添加了表明请求消息体长度的有效 Content-Length头之后,客户端可以再次提交该请求。 412:服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。 413:服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围。 414:请求的URI 长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务。 415:对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝。 416:如果请求中包含了Range请求头,并且Range中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义 If-Range 请求头,那么服务器就应当返回416状态码。 417:在请求头 Expect中指定的预期内容无法被服务器满足,或者这个服务器是一个代理服务器,它有明显的证据证明在当前路由的下一个节点上,Expect 的内容无法被满足。 421:从当前客户端所在的IP地址到服务器的连接数超过了服务器许可的最大范围。 423:请求格式正确,但是由于含有语义错误,无法响应。 424:由于之前的某个请求发生的错误,导致当前请求失败,例如 PROPPATCH。 425:在WebDav Advanced Collections 草案中定义,但是未出现在《WebDAV 顺序集协议》(RFC 3658)中。 426:客户端应当切换到TLS/1.0。 449:由微软扩展,代表请求应当在执行完适当的操作后进行重试。 五、(5**)开头的状态码详解 500:服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现。 501:服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。 502:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。 503:由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。注意:503状态码的存在并不意味着服务器在过载的时候必须使用它。某些服务器只不过是希望拒绝客户端的连接。 504:作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。 505:服务器不支持,或者拒绝支持在请求中使用的HTTP版本。这暗示着服务器不能或不愿使用与客户端相同的版本。响应中应当包含一个描述了为何版本不被支持以及服务器支持哪些协议的实体。 506:由《透明内容协商协议》(RFC 2295)扩展,代表服务器存在内部配置错误:被请求的协商变元资源被配置为在透明内容协商中使用自己,因此在一个协商处理中不是一个合适的重点。 507:服务器无法存储完成请求所必须的内容。这个状况被认为是临时的。WebDAV (RFC 4918) 509:服务器达到带宽限制。这不是一个官方的状态码,但是仍被广泛使用。 510:获取资源所需要的策略并没有没满足。(RFC 2774)
技术教程
# 网络协议
易航
3年前
0
85
2
2022-08-13
PHP获取网站标题、关键词与描述
PHP如何获取网站标题、关键词与描述呢? 在网页采集过程中,我们需要获取一个网站的meta信息,如title、keywords、description等,但是如果用普通的正则匹配很容易出错。那么到底该如何写这个PHP的代码,这篇文章为你带来解决方法。 使用get_meta_tags函数获取meta信息 比如我们要获取 http://blog.bri6.cn 这个网页的meta信息,可以直接使用php内置函数get_meta_tags获取,代码如下: <?php $meta_tags = get_meta_tags("http://blog.bri6.cn/"); print_r($meta_tags); ?>运行结果:你会发现获取了网页的关键词与描述,但是发现缺少了网页的标题,原因是标题并不是meta标签,而是组成的,所以我们的完整代码应该如下: /** 获取META信息 */ function get_sitemeta($url) { $data = file_get_contents($url); $meta = array(); if (!empty($data)) { #Title preg_match('/<TITLE>([\w\W]*?)<\/TITLE>/si', $data, $matches); if (!empty($matches[1])) { $meta['title'] = $matches[1]; } #Keywords preg_match('/<META\s+name="keywords"\s+content="([\w\W]*?)"/si', $data, $matches); if (empty($matches[1])) { preg_match("/<META\s+name='keywords'\s+content='([\w\W]*?)'/si", $data, $matches); } if (empty($matches[1])) { preg_match('/<META\s+content="([\w\W]*?)"\s+name="keywords"/si', $data, $matches); } if (empty($matches[1])) { preg_match('/<META\s+http-equiv="keywords"\s+content="([\w\W]*?)"/si', $data, $matches); } if (!empty($matches[1])) { $meta['keywords'] = $matches[1]; } #Description preg_match('/<META\s+name="description"\s+content="([\w\W]*?)"/si', $data, $matches); if (empty($matches[1])) { preg_match("/<META\s+name='description'\s+content='([\w\W]*?)'/si", $data, $matches); } if (empty($matches[1])) { preg_match('/<META\s+content="([\w\W]*?)"\s+name="description"/si', $data, $matches); } if (empty($matches[1])) { preg_match('/<META\s+http-equiv="description"\s+content="([\w\W]*?)"/si', $data, $matches); } if (!empty($matches[1])) { $meta['description'] = $matches[1]; } } return $meta; }
技术教程
# PHP
易航
3年前
0
151
0
2022-08-13
Typecho高性能优化之缓存插件 YH Cache
使用场景 虽然HP typecho非常高效,但是为了提高Web站点的并发性,静态缓存页面是必要的。这个缓存插件的目的只是缓存首页,以减少对数据库的压力。 提醒:更高效和灵活的缓存方法应该使用nginx而不是插件。如果你有nginx基础,你可以参考这里的配置 插件配置 首先:启用这个插件。然后,配置插件 第一:配置文件缓存路径,您可以指定相对位置或绝对位置。 第二:配置缓存时间,单位为秒,请根据自己的需要进行配置。 Typecho高性能优化之缓存插件图片 应当指出的是 因为插件使用了简单的文件缓存机制,所以请确保缓存路径所在的分区有足够的空间和足够的inode节点。 后台文章更新后,缓存不会自动更新(实现起来很麻烦,所以这个版本暂时没有实现这个功能)。这一点特别重要,所以请合理配置缓存过期时间。 下载地址 隐藏内容,请前往内页查看详情
免费资源
源码资源
# Typecho
# Typecho插件
易航
3年前
4
491
4
上一页
1
...
19
20
21
...
28
下一页