原文:Kinsta Blog
一步一步的关键字研究指南(奖金:最佳关键字研究工具比较)
想象一下,每个月有超过 25 万的访问者访问你的网站。我们做到这一点多亏了关键词研究:

Monthly SEO Traffic
这张截图来自我的一个名为流浪房车的网站。我和我的妻子在仅仅三年的时间里,用不到 30 篇文章,把这个网站从一个全新的网站发展到每月 25 万的访问量。
是的,你还必须创造伟大的内容并建立到这些内容的链接,但是这些行动是在你知道最佳的目标关键词之后。每一次成功的 SEO 战役都是从关键词调研开始的;跳过这一步,后果自负。
准备好开始了吗?
如何进行关键词研究(快速步骤):
好的关键词决定了 SEO 营销活动的成败。以下是开始关键词研究的关键步骤:
第一步:根据关键词、相关搜索、长尾关键词、LSI 找到关键词创意。
第二步:查看真实关键词难度和搜索量。
第三步:确定用户意图。
Support
在今天的指南中,我分享了一个一步一步的关键词研究指南,不仅涵盖了如何找到数百个伟大的关键词,还包括如何告诉你哪些可以为你的业务移动针,哪些不值得你的时间。让我们开始吧!
关键词研究基础
在我谈论为你的搜索引擎优化活动寻找关键词的具体步骤之前,让我们简单地了解一下什么是关键词研究,以及为什么你应该关注它。
什么是关键词研究?
关键词研究是在搜索引擎优化活动中寻找和审查关键词的行为。
这是通过使用一些免费和/或付费的工具来完成的,这些工具会向你展示人们在谷歌和其他搜索引擎上搜索的内容。
关键词研究在数字营销中的作用
正如你将在下一节学到的,关键词的质量是成功营销活动和浪费时间的区别。你挑选的关键词会从头到尾决定你的 SEO 营销策略。
让我们看看怎么做。
关键词研究有多重要?(不要跳过这个!)
SEO 可能很复杂,但它可以归结为三个基本要素:
这三者中,关键词研究是最重要的。
为什么?因为你可以创造最好的内容,建立令人难以置信的链接,使你在谷歌排名中名列第一,但如果你瞄准了错误的关键词,在业务增长或收入方面仍然没有任何好处。
例如,假设你想在你网站的博客上写一些内容,这样你就可以出现在谷歌的第一页。你有一个博客帖子的想法,并认为你有一个好的关键词来瞄准。你制作惊人的内容,通过客座博文和电子邮件推广建立链接(这里是如何找到任何人的电子邮件地址,并最终出现在谷歌的首页。你每个月都有数百次访问…
但是你从那篇文章中获得的收入仍然是一大笔钱。
那是因为你没有提前研究好你的关键词。你可能找到了一个关键词,但是找到一个关键词和做关键词研究是完全不同的两码事。
正确地研究一个关键词意味着了解它的收入潜力,它的竞争力,甚至你需要创建的内容的确切类型,以便能够为它排名。在本指南结束时,你会明白我的意思。
简而言之:恰当的关键词研究可能是一场疯狂成功的搜索引擎优化活动和一场完全浪费时间和金钱的搜索引擎优化活动的区别。
搜索量和长尾关键词
关于关键词要理解的第一个概念是搜索量。
这是大多数人第一次开始研究关键词时看的,也是最糟糕的指标之一。
高搜索量非常具有欺骗性,原因有二:
- 搜索某样东西的原始人数与你实际能从流量中赚多少没有太大关系。例如,如果你对一个每月被搜索 10,000 次的关键词进行排名,但如果人们只是在寻找信息,并不准备购买(提示:你需要定义搜索意图。更多见下文。),这对你的底线没有任何帮助。
- 仅仅因为 10,000 人搜索一个关键词并不意味着所有 10,000 人实际上都点击了一个结果。以“特朗普多大了”这个关键词为例,它每个月会被搜索 3 万次,但只有 13%的人会点击任何东西。这是因为人们在谷歌上就能找到正确的答案,不需要点击就能找到。

Keyword Search Volume to Click-Ratio

Bad keyword example
另一方面,低搜索量并不意味着一个关键词是不好的,或者你看到的数字就是你将获得的访问者数量。事实上,所有在谷歌上对一个关键词进行排名的页面也会对几十个、几百个,有时甚至几千个其他关键词进行排名。
这些其他关键字通常是同义词和长尾变体。还有潜在的语义索引(LSI)关键字,我将在下面的一节中介绍。
例如,看看我妻子 Kayla 为流浪房车写的这篇文章。她瞄准的关键词是“最佳露营装备”,根据 Ahrefs 的数据,这个关键词每个月会被搜索 2700 次。但正如你在下面的截图中所看到的,它还在 1912 个其他关键词中排名,甚至在第一页的“露营装备”中排名每月 32000 次搜索!

Ahrefs Keywords
故事的重点?虽然搜索量是一个重要的指标,但你不应该把你的目标关键词仅仅建立在每月有多少人搜索它的基础上(除非你只关注品牌知名度和/或每次印象的广告收入)。
搜索意图
搜索意图就像它听起来的那样——搜索给定关键字的人的意图。类似于营销概念“买家意图”。
换句话说:用户在寻找什么?
他们是否正在寻找一件他们现在就准备购买的商品?他们在做出购买决定之前是否做了调查?或者他们只是在寻找与购买无关的信息,而是寻找他们可能需要解决的问题?
让我们来看一个例子。
高购买意愿:高购买意愿关键词可能是一个产品名称,如“RV rental las vegas”。如果你在谷歌上输入这个,看看结果,你会看到一堆房车租赁广告和一张显示拉斯维加斯房车租赁公司的地图。有人搜索这可能是准备购买,或非常接近。

High Buying Intent
研究意图:这些是人们仍在研究解决方案,但可能很快就会购买的关键词。“最佳”和“评论”关键词往往属于这一类,比如“最佳房车租赁公司”。

Medium Buying Intent
信息意图:这些关键词是给那些严格地寻找信息,但还没有准备好或者甚至还没有考虑购买任何东西的人的。“特朗普多大了”的例子就属于这一类。另一个适合房车租赁的例子可能是“如何带着宠物在全国旅行”。
但是,不要以为买了意向关键词就应该只去。信息关键词可以帮助你建立你的电子邮件列表,让人们进入你的营销漏斗,最终向你购买。
了解搜索意图也很重要,因为它会影响内容在谷歌上的排名。如果你试图创建一个登陆页面来对一个信息关键词进行排名,而谷歌正在对长篇博客内容进行排名,即使有完美的页面搜索引擎优化和大量的反向链接,你可能也不会排名,因为这根本不是用户正在搜索的。
比如说你要给“小营员”排名。所以你创建了一个拥有小型露营车的指南。然而,当我们查看谷歌时,我们可以看到人们并不是在寻找指南,而是在寻找一份小型露营者的购买清单。

Search Intent Example
这就是为什么即使在你找到好的关键词创意、之后,你也应该总是手动将它们输入谷歌,并查看当前的排名,以了解你需要创造什么。当人们只是想要一个快速的答案时,不要写大量的指南,当人们想要购买一个产品时,不要试图对一篇博客文章进行排名。
LSI 和同义词的作用
前面我提到了 LSI 关键字。这代表潜在语义索引,这是谷歌说“同义词和相关关键词”的一种奇特方式。它们是在同一个主题中经常出现的单词,并且在语义上相互关联。
他们告诉搜索引擎你的内容是关于什么的是很重要的,因为同一个关键词可能有多种含义。
例如,假设你正在写一篇关于汽车的文章。你可以谈论五种不同的潜在“汽车”:
- 汽车,车辆
- 迪士尼动画电影《汽车总动员》
- 汽车,加拿大拉力运动协会
- 汽车,加拿大航空条例
- 汽车,美国 20 世纪 70 年代的乐队
谷歌怎么知道你说的是哪个版本的“汽车”?靠 LSI 关键词!看一看:
- 使用“车辆”、“二手”、“新”、“购买”、“出售”等词语。
- 使用“电影”、“电影”、“迪士尼”等字眼。
- 使用“协会”、“集会”、“运动”等词语。
- 使用“航空”、“管理”、“行政”等词语。
虽然 LSI 关键词在你的关键词研究中不一定重要,但在开发你的实际内容时却很重要。你应该在你的内容中自然地包含各种 LSI 关键字,而不是把它们塞进去,包括在标题和图片替换文本中。
你可以用类似于 LSI Graph 的工具找到 LSI 关键字(并了解更多)。
T3】
你是怎么做关键词研究的?(逐步指南)
好了,现在你已经对关键词研究背后的重要指标有了一个明确的理解,是时候真正找到你自己的关键词了!当我为一个新网站做关键词研究时,我会遵循三个步骤,还有一个可选的、更高级的第四步:
- 查找关键词创意
- 检查真实关键词难度和搜索量
- 确定他们的搜索意图
- (可选)查找和利用关键字仓库
让我们开始吧!
第一步:找到关键词想法
找到关键词想法是容易的部分。有很多工具,只要点击一个按钮,就会产生数百个想法。审查他们需要努力,但我们会做到这一点。
现在,去看看下面的“最佳关键词研究工具”部分,选择你的毒药。我将在示例中使用 Ahrefs,因为它是我最喜欢的工具,具有所有的功能,但其他工具也可以工作。
我最喜欢的方式来寻找伟大的关键字机会是刺探我的竞争对手。你可以将他们的网站插入任何关键词工具,然后查看他们的关键词。Ahrefs 有一个很棒的工具,叫做内容差距分析。
它是这样工作的:
1.将你的网站插入 Ahrefs,然后点击左边菜单中的内容间隙链接。

Ahrefs Content Gap
2.插入 1-10 个在谷歌上为你想要排名的关键词排名的竞争者。你可以通过谷歌搜索这些关键词,从谷歌上抓取网址,或者使用 Ahrefs 的竞争域名工具,就在内容差距链接的上方。运行该工具。

Ahrefs Keyword Research
3.如果愿意,您可以从这里将列表导出到 excel 电子表格。我喜欢在 Ahrefs 中梳理列表。如果我看到一个我可能想锁定的关键字,我会在一个新标签页中打开它,并使用右上角的+ Add to 按钮将其添加到关键字列表中。

Keyword List
如果你无法使用 Ahrefs 或其他关键字工具来查看竞争对手的关键字,你也可以使用 Keyword Shitter 这样的工具来给你大量的想法,然后使用其他免费工具如优步建议来审查它们。
注册订阅时事通讯
想知道我们是怎么让流量增长超过 1000%的吗?
加入 20,000 多名获得我们每周时事通讯和内部消息的人的行列吧!
第二步:查看真实关键词难度和搜索量
一旦你有了一个你可以放心使用的关键词列表(我的目标是一次 50-100 个,但你可以做得更多),是时候根据关键词难度(KD)和搜索量来看看哪些是值得追求的了。
只有一个警告…你在大多数关键词研究工具中看到的搜索量和 KD 通常相差甚远。Ahrefs 中的 KD 仅仅基于链接到顶级结果的域的数量,这并不能 100%准确地描述一个关键词的真正排名难度。
这是因为 SEO 是一个复杂的野兽,像域名评级(我将很快介绍)和内部链接这样的事情会对排名产生巨大的影响。反向链接只是图片的一部分。
搜索量呢?那还不包括 LSI 和长尾关键词!
还记得我在本文开头给你看的那个露营装备的例子吗?main 关键字每月只有 2700 次搜索,但这篇文章每月的访问量超过 5000 次。那是因为它是针对主关键词之外的其他关键词的排名。
因此,如果你看到一个关键词每月有 200 次搜索,如果你包括相关的关键词,你的排名可能会达到 500 或 1000 次。
要确定真实的搜索量,在谷歌上抓取该关键词的#1 结果,并将其输入 Ahrefs 或优步建议,看看该页面实际获得了多少流量。这应该会给你一个给定关键字的搜索量的更准确的图片。
以下是排名第一的“小营员”页面的流量,这个关键词每月被搜索 3400 次:

True Search Volume
看看这个页面是如何获得超过 10k 的流量的,尽管主关键词只有它的三分之一?这才是真正的搜索量潜力。
另一个指标,关键词难度,也不是 100%准确。但是,找出真正的困难通常就像查看首页域名权威(DA)或域名评级(DR)一样简单,如果你使用 Ahrefs 的话。让我解释一下。
如果一个关键词的难度分数为 8,但排名靠前的页面都是 DR 80+,那么如果你的 DR 较低,尽管难度分数较低,但为这些关键词对你的网站进行排名可能会很困难。
我的建议是,如果你的 DR 在 40 以下,目标是 30 KD 或更低的关键词,然后随着你建立更多的链接和获得更高的权威而扩展。随着你的 DR 攀升,你的内部链接更有“链接价值”(或者传递更多的“页面权威”,取决于你听的是什么来源)。
但是这不是一篇关于技术性搜索引擎优化的文章,所以我现在就不写了!
步骤 3:确定搜索意图
在这一点上,你应该有一个相当不错的关键词列表,有一个你能轻松应对的困难和一个你乐于捕捉的潜在搜索量。现在是时候弄清楚人们在搜索这些术语时到底想要什么,以及它是否符合你的营销和收入目标。
这一部分就像谷歌搜索你列表中的每个关键词并查看前 3-5 个结果一样简单。查看他们的元标题和描述,点击他们查看页面,并检查他们在页面上采取的角度。
- 它们主要是列表文章吗?怎么做?终极指南?登陆页面?还有别的吗?
- 他们似乎是如何将页面货币化的?他们在使用展示广告吗?销售产品作为解决问题的方法?联盟营销?只是获取电子邮件,实际上不卖任何东西?
- 看看评论吧。人们在问文章中没有回答的问题吗?他们看起来是高兴、愤怒还是中立?
所有这些问题将帮助你了解你需要创建的帖子/页面的类型,你如何将其货币化(或使用它来捕捉电子邮件/推送通知订阅者/社交关注者),以及你可以做些什么来改善它。
当你浏览每一个关键词时,把你对这些问题的答案保存在一个电子表格或 word 文档中,以便跟踪你感兴趣的问题。你的最终清单是你可以开始追求的清单!
为了让你更好地了解如何确定搜索意图,下面是一些来自 Moz 帖子的例子:
信息意图:
- [产品名称]
- 什么是[产品名称]
- [产品名称]是如何工作的
- 如何使用[产品名称]
商业意图(又名研究意图):
- 最佳[产品名称]
- [产品名称]评论
- 比较[产品名称]
- 什么是顶级[产品名称]
- [颜色/款式/尺寸][产品名称]
交易意向(又名购买意向):
- [产品名称]的价格是多少
- [位置]中的[产品名称]
- 在线订购[产品名称]
- [产品名称]我的附近
- 实惠的[品牌名称][产品名称]
来自 Ahrefs 的图表也有帮助:
厌倦了你的 WordPress 站点缓慢的主机?我们提供超快的服务器和来自 WordPress 专家的 24/7 世界级支持。查看我们的计划

Ahrefs Search Intent Chart
现在拿着你的清单,去做一些内容吧!或者,您可以遵循最后一个步骤。
步骤 4:(高级)找到并利用关键词仓库
如果你真的想做得更好,你可以有选择地更进一步,在你的网站上寻找关键字筒仓来创建相应的内容筒仓。
关键词仓是一个高度相关的关键词列表,您可以围绕它创建内容,以便在您的站点上相互链接(也称为“中心辐射”方法)。这是我制作的一个视频来帮助你理解:

Hub and Spoke Method of Content Marketing
本质上,你创建一个针对你想要排名的主要头项的中心页面,然后基于相关和长尾关键词创建“分支”页面。
例如,在为我妻子 Kayla 的素食食品博客做关键词研究时,我发现了一系列相关的关键词,问“是 __ 素食主义者吗”。人们想知道普通食物,如百吉饼、油炸圈饼或奥利奥是否是纯素食者。
为了对这些关键词进行排名,我们创建了这个中心页面,链接到她所有的“Is ___ vegan”文章。这些文章相互链接,并返回到主页面。

Content Silo
这种相互链接被称为内容孤岛,它之所以如此有效有两个原因:
- 因为所有的页面都是相互链接的,所以如果你建立了到任何一个页面的链接,就会提高所有其他页面的权威性。
- 谷歌在它的算法中使用了相关性,因为这些主题彼此高度相关,它可以进一步提高你的排名。
那么如何找到关键词筒仓呢?没有灵丹妙药——你必须善于发现模式并注意相关性。然而,有一个技巧可以让你试着找到它们:书。
在亚马逊上寻找与你的主题相关的书籍,并浏览目录。通常情况下,书籍充满了关键词筒仓:这就是为什么他们是一本书!把装订看作是中心页面,把章节看作是分支页面。

Keyword Silo Ideas
当然,正如你在上面的例子中看到的,这些关键词并不完全是人们在谷歌上搜索的。人们输入的不是“世界上的素食主义者”,而是“如何在餐馆吃素食”或“如何在家庭聚会上吃素食”。所以你可能需要做一些调查,找出与你找到的书的章节标题相对应的关键词。
一旦你发现一个潜在的筒仓,在你提交之前,一定要通过步骤 2 和 3 运行关键字!仅仅因为你发现了一个筒仓,并不意味着你应该追求它。从逻辑上思考所有这些内容如何适合你的业务,以及你将来如何扩展这些内容。
最好的关键词研究工具是什么?
有几十个,如果不是数百个关键词研究工具在市场上今天。有些非常独特,但大多数只是在相同的想法上略有不同。那么最好的是哪一个呢?让我们用免费和付费工具来分解一下。
免费关键词研究工具
我用过并推荐两个免费的关键词研究工具:
- Ubersuggest
- 关键词快门
Ubersuggest

Ubersuggest
让我们暂时搁置所有关于尼尔·帕特尔的转换。这个工具完成了它的工作,如果你预算有限,它可以帮助你开始 SEO。
Ubersuggest 基本上是 Ahrefs 或 Moz 的免费缩小版。它可以让你窥探竞争对手的反向链接,看看他们的关键字排名,并做一些像样的关键字研究。如果你在预算范围内做搜索引擎优化,它可以完成工作。
关键词快门

Keyword Shitter
关键字 Shitter 听起来很像。你输入一个关键词,就会得到数百个关键词建议。如果你只是需要大量的想法,这是很好的,但它通常只会吐出与你输入的关键词相关的关键词,而不是独特的、独立的想法。
付费关键词研究工具
现在我们进入大男孩(或女孩)工具!如果你对 SEO 很认真,并且有预算,这些是你想要使用的工具。
- Ahrefs
- 塞姆拉什
- 关键词洞察
- 关键词无处不在
Ahrefs

Ahrefs
Ahrefs 是我最喜欢的 SEO 工具;不仅仅是关键词研究,还包括链接建设、排名跟踪、内容创意等等。它拥有所有的功能,是市场上最好的全方位搜索引擎优化工具。然而,它的价格很高,仅基本工具每月就要 99 美元。
塞姆拉什

SEMrush
SEMrush 是另一个伟大的关键词研究工具。它比 Ahrefs 更实惠,但没有那么多功能。它更倾向于搜索引擎营销和点击付费(因此 SEM 在 SEMrush)。然而,如果你想要一个很棒的付费工具,但不想为 Ahrefs 支付额外费用,这是一个有效的选择。它甚至让你免费试用产品!
关键词洞察
Keyword Insights
Keyword Insights 声称是“对关键字进行分组并对搜索意图进行大规模分类的最聪明的方法”…这是有充分理由的。该工具利用特定地理位置的实时搜索引擎结果页面数据将关键词聚类到相似的组中,同时还可以计算出它们背后的搜索意图。
用户只需上传一个关键词列表(你想上传多少就上传多少),该工具就会给出一个预先格式化的 Google sheets 文档,其中包含聚集的关键词和意图。其最近的更新还将分组的关键词分类为“顶级主题”,这样你就可以看到它们的内容枢纽应该是什么,以及它们的发言内容可能是什么样子。洞察还会告诉你哪些关键词可以作为单个页面的目标,或者哪些关键词需要分成多个页面。
关键词无处不在

Keywords Everywhere
关键词无处不在是一个很棒的工具,以前是免费的,现在是基于信用的。每当你输入一些东西,这个工具就会显示你在谷歌上的搜索量、竞争对手和平均点击费。它还显示了相关关键词和“人们也搜索”关键词的统计数据。不管你使用其他什么工具,我都强烈推荐使用这个工具。
想要更多的 SEO 工具?查看 Kinsta 为 WordPress 列出的必备 SEO 插件列表。
建议的堆栈
那么应该获得哪些关键词研究工具呢?我建议的堆栈是 Ahrefs 和 Keywords Everywhere。Ahrefs 是一个完整的 SEO 软件,它将帮助你对你的网站进行排名,而不仅仅是查找关键词。“关键词无处不在”让你在谷歌上搜索的任何时候都能看到搜索量和关键词的想法。再加上是免费的,有什么不喜欢的呢?
摘要
以下是我们所学内容的快速回顾:
- 关键词研究对任何搜索引擎优化活动都非常重要,不应该被忽略或轻视。
- 搜索量和关键词难度可能具有欺骗性。做一些更深入的研究,在你做决定之前,在谷歌上输入关键词并查看结果。
- 不要被低搜索量所迷惑。通过使用 Ubersuggest 或 Ahrefs 查看热门页面搜索流量来检查真实的搜索量。
- 搜索意图才是王道。确保你创建的内容与人们想看的内容(以及谷歌已经在展示的内容)相匹配。
- 寻找关键词筒仓。它们可以成为快速排列网页的捷径。
这就是全部了!如果你有任何问题,欢迎在下面留言或发邮件给我。要获得更多关于 SEO 的帮助,点击这里阅读我的逐步指南和这个关于如何给你的网站带来更多流量的很棒的深度指南。
祝你好运!
让你所有的应用程序、数据库和 WordPress 网站在线并在一个屋檐下。我们功能丰富的高性能云平台包括:
- 在 MyKinsta 仪表盘中轻松设置和管理
- 24/7 专家支持
- 最好的谷歌云平台硬件和网络,由 Kubernetes 提供最大的可扩展性
- 面向速度和安全性的企业级 Cloudflare 集成
- 全球受众覆盖全球多达 35 个数据中心和 275 多个 pop
在第一个月使用托管的应用程序或托管的数据库,您可以享受 20 美元的优惠,亲自测试一下。探索我们的计划或与销售人员交谈以找到最适合您的方式。
金斯塔在感恩节为 300 名无家可归者提供食物
原文:https://kinsta.com/blog/kinsta-feeds-homeless-thanksgiving/
在金斯塔,我们尽力回馈社区。仅今年一年,我们就在奥兰治县、东京、悉尼、达拉斯、里约热内卢、纳什维尔、凤凰城、西雅图、斯德哥尔摩、日内瓦、乌代布尔、圣保罗和巴塞罗那赞助了单词营。我们还赠送了一份奖学金给我们参加单词营。但有时我们也会回馈非 WordPress 社区。

今年,我们决定为洛杉矶的无家可归者提供食物,向美国最大的食物银行之一第二丰收组织捐赠食物。
我们去了好市多,买了 200 份土豆泥、红薯、面包卷、馅料和烘豆。最后在捐赠现场称了 140 磅的食物,他们说因为我们捐赠了这么多东西,如果加上他们每年收到的火鸡捐赠,他们可以轻松地做 300 顿饭。

如果你的公司想做类似的事情,这里有一些建议。
首先,如果你的团队中有人有好市多或山姆的卡,无论你的预算是多少(我们花了几百),它都会让你得到比一般杂货店多得多的食物。
第二,如果你要提前购买,一定要检查保质期,以确保食物至少能保存到感恩节之后几天。
第三,你很可能想把重点放在不需要冷藏的物品上,所以这就是我们所做的。像火鸡这样的东西通常是由专业的大型供应商在当天送达的,因为许多避难所缺乏额外的冷藏空间。
最后,在你去购物之前,一定要打电话给收容所,问问他们需要什么。我们做到了,而且效果很好。
让你所有的应用程序、数据库和 WordPress 网站在线并在一个屋檐下。我们功能丰富的高性能云平台包括:
- 在 MyKinsta 仪表盘中轻松设置和管理
- 24/7 专家支持
- 最好的谷歌云平台硬件和网络,由 Kubernetes 提供最大的可扩展性
- 面向速度和安全性的企业级 Cloudflare 集成
- 全球受众覆盖全球多达 35 个数据中心和 275 多个 pop
在第一个月使用托管的应用程序或托管的数据库,您可以享受 20 美元的优惠,亲自测试一下。探索我们的计划或与销售人员交谈以找到最适合您的方式。
金斯塔雇佣布莱恩·杰克逊帮助制定入境策略
原文:https://kinsta.com/blog/kinsta-hires-brian-jackson-inbound-strategy/
Kinsta 非常高兴地欢迎 Brian Jackson 加入我们的团队,成为我们新的集客营销总监。他将帮助我们的在线发展战略、销售线索生成、内容创建、技术搜索引擎优化以及 WordPress 社区内的拓展。
Brian 从 KeyCDN 来到我们这里,在那里他花了一年的时间帮助创建战略性内容,产生销售线索,并在 web 性能行业中拓展业务。在加入 KeyCDN 之前,Brian 在一家医疗广告公司担任 SEO 和 PPC 专家,负责管理超过 50 万美元的年度广告支出。在最初的 6 个月里,他帮助他们的客户增加了 346%的网络推荐,同时减少了 315%的 CPA。他在 SEO 和 WordPress 社区非常活跃,在 Moz、Ahrefs、Torque、codeinwp、WPExplorer、WP Dev Shed 和 WP-Tonic 等网站上都有介绍。
谈到 WordPress,Brian 并不陌生。他用它建立网站已经超过 8 年了,他所做的一切都围绕着它。晚上,你会发现他在 woorkup.com 上写关于 WordPress 产品和服务的博客,或者在开发他和他兄弟开发的高级 WordPress 插件 WP 优惠券。简单地说,他对一切事物都有一种般的巨大热情。
具有讽刺意味的是,Brian 实际上是我们推出时 Kinsta 的第一批客户之一!所以对我们来说,这种关系是在过去几年中形成的。他已经为 Kinsta 带来了新的客户,因此让他加入团队与我们的发展战略以及他能为团队带来的技能完全吻合。
Brian 还拥有非常强大的技术和支持背景。在他的职业生涯中,他担任过各种职务,包括 IT 服务台、IT 主管、IT 服务器管理员和 PeopleSoft 安全管理员。Brian 告诉我们,这种多元化的背景帮助他比大多数人更好地将数据和转化驱动的策略应用到他的在线营销中。
说到营销,你做的每一件事背后都应该有原因;无论是产生线索,搜索引擎流量,还是品牌知名度。布莱恩
Brian 毕业于 Walla Walla 大学,获得新媒体图像学士学位,包括网页和平面设计,还辅修了工商管理。布莱恩来自阳光明媚的亚利桑那州斯科茨代尔,他喜欢在业余时间看电影、游泳、骑自行车、写博客和浏览网站。
布莱恩在推特上最活跃,你可以和他联系。
我们很高兴你加入了我们的团队。欢迎加入布莱恩! 请帮助我们欢迎 Brian 加入 Kinsta 团队!
让你所有的应用程序、数据库和 WordPress 网站在线并在一个屋檐下。我们功能丰富的高性能云平台包括:
- 在 MyKinsta 仪表盘中轻松设置和管理
- 24/7 专家支持
- 最好的谷歌云平台硬件和网络,由 Kubernetes 提供最大的可扩展性
- 面向速度和安全性的企业级 Cloudflare 集成
- 全球受众覆盖全球多达 35 个数据中心和 275 多个 pop
在第一个月使用托管的应用程序或托管的数据库,您可以享受 20 美元的优惠,亲自测试一下。探索我们的计划或与销售人员交谈以找到最适合您的方式。
金斯塔·金并:凯文·桥史访谈
原文:https://kinsta.com/blog/kinsta-kingpin-interview-with-kevin-ohashi/
Q1:你能简单介绍一下你的业务背景吗?
我创造并经营了 ReviewSignal.com。这是一个数据驱动的评论网站。我这样称呼它是因为它的运作方式不同于我们传统上认为的评论网站。它提取人们在社交媒体上公开发布的评论,并自动进行分类和分析,以了解人们对虚拟主机公司的看法。本着这种精神,我也写了很多数据驱动的博客,测试和分析虚拟主机公司。我做的最受欢迎的事情是我的年度 WordPress 主机性能基准文章,在这篇文章中,我详尽地测试了 WordPress 主机业务中的所有大牌,看看他们彼此之间的比较如何。
Q2:你在 WordPress 工作了多久,是什么让你对它充满了好奇?
我使用 WordPress 已经有 5-10 年了。我不确定我是什么时候开始接触它的。我从 1996 年开始建立网站,从那以后我使用了大量的 CMS,WordPress 在开始的时候有一个简单的吸引力。对于建立基本的网站来说,与其他选择相比,它真的非常简洁和容易。
你觉得 WordPress 有什么令人惊讶的地方吗?
生态系统变得有多大。令人惊讶的是,它驱动了多少网站,多少人创建插件/主题,仅仅依靠开源软件谋生。看到它对网络的影响真的很令人着迷。
Q4:你觉得主机行业有什么令人惊讶的地方吗?
它有多可怕。我开始创业是因为在虚拟主机行业工作了十年之后,仍然没有一个诚实的虚拟主机评论网站让我放心推荐给别人。在运营我的网站 4 年后,很容易理解为什么。
我经常收到虚拟主机公司给我发的邮件,试图贿赂他们,让他们被评为最好的。最糟糕的是,他们中的大多数人甚至不隐藏它。这种行为对他们来说是正常的。因此,最令我惊讶的是,我经常对这个领域中许多公司的行为感到厌恶。这并不是说没有一些很棒的公司,但它们似乎是少数。最糟糕的是,这些欺诈/恶心的策略看起来非常有效,而真正的好人却因此打了一场更糟糕的硬仗。
与现在相比,托管行业应该如何运作?
创新似乎真的停在了市场的底端。10 年前有一个 cPanel 托管账户,今天感觉也一样。我们看到了像 WordPress 托管这样的利基托管解决方案的爆发。我们看到了开发者托管选项的巨大改进和变化,通常称为云之类的。但底层的普通消费者还没有从中获益,我不确定我看到了多少创新。该领域最大的挑战者/创新者可能是 SquareSpace/Wix/Shopify/等公司,它们正把人们从拥有自己的主机服务中拉出来,转而被 SaaS 的产品所吸引。他们提供的体验往往比简单地获得一个虚拟主机账户和一套复杂的自行安装应用程序选项要好。
既然你已经广泛地使用了负载测试,对于扩展应用程序有什么一般的建议吗?
我喜欢扩展和性能。这两种策略是:我能让它更快吗?或者我能让它并行化吗?让它变得更快可以是任何事情,从编码优化,我正在努力做的事情,到缓存,再到简单地购买更快的硬件。就性能优化而言,缓存通常给我们带来最轻松的结果。但是整个思考过程就是,我怎么才能让这个跑快一次或者多次。一旦你超越了基本的速度提高,它通常会变得更加深思熟虑,在哪些方面可以使应用程序运行得更快。
注册订阅时事通讯
想知道我们是怎么让流量增长超过 1000%的吗?
加入 20,000 多名获得我们每周时事通讯和内部消息的人的行列吧!
第二种策略是并行化。我的应用程序可以在 Y 时间内完成任务 X。在线性世界里,如果我需要做 X 10 次,需要 10Y 次。如果我可以将其并行化,并拥有应用程序的两个实例,则需要 5 年时间(10 倍任务/ 2 个实例)。这种策略可以应用于整个应用程序,这在负载平衡的 web 设置中很常见,其中多个服务器响应网站请求。在服务器之间分担负载,您可以处理更多的请求。如果您可以分解不相互依赖的组件,它也可以应用于应用程序的各个部分。但是这要复杂得多,可能超出了本文的讨论范围。
旅行似乎是你的事情。你去过哪些国家,如果只能选一个你会回哪个国家?
我想这些天我会被归入所谓的数字流浪者。在过去的几年里,我每年都会花 4-6 个月的时间环游世界。我计划从明年开始进行一次不确定的旅行。我大概去过 35-40 个国家,就不一一列举了。不过今年我去了泰国、柬埔寨、日本、瑞典、丹麦、荷兰、卢森堡、比利时和捷克共和国。
至于只选择一个,那就很难了。我将返回泰国开始我的无限期旅行。在泰国的安达曼海边,有一个我非常喜欢的岛屿,我已经去了好几年了,它叫兰达岛。它有一个叫做 KoHub 的奇妙的共同工作空间,这是我在泰国经历过的最好的潜水,还有美妙的海滩。今年我在那里呆了两个半月,我非常喜欢那里。那就是我开始冒险的地方。二号目的地是捷克共和国的布拉格。我爱这座城市,它美丽、有趣、实惠。
华盛顿特区的科技/创业公司是什么样的?你和这件事有任何关系吗?
最好的回答是说它很棒,每个人都应该来 DC。但这是一个谎言。我认为它很平庸,正在走下坡路。这个地区肯定有一些成功和有前途的创业公司,但这是任何一个拥有大量人口、大量大学、美国教育程度最高的城市和大量资金的地区都应该有的。鉴于它拥有所有这些东西,我对来自 DC 的非常成功的创业公司如此之少感到失望。
Struggling with downtime and WordPress problems? Kinsta is the hosting solution designed to save you time! Check out our features
上一家来自 DC 的“独角兽”创业公司是 Living Social,但在交易泡沫破裂后,它似乎陷入了困境。有一批与安全相关的初创公司正在悄悄地做得非常好,比如去年以$1B 的价格出售的 Mandiant。DC 科技领域的另一个亮点是对社会影响和公民黑客行为的关注。这两个问题似乎越来越严重,而且非常重要。在 DC 有很多聪明人在这些领域解决问题是很棒的。
因此,DC 的一些利基市场似乎正在蓬勃发展,但这通常都与政府有关。但对于消费者/b2b 科技创业公司来说,我认为情况更糟。创业人士参加的科技活动数量似乎在减少。黑客马拉松比几年前少了。我们不再有庆祝 DC 科技界的 DC 周。许多曾经免费举办与科技相关的大型活动的公司和空间已经停止或希望收取巨额费用。
当我还是一个现已不存在的共同工作空间的成员和董事会成员时,我曾经参与更多。我会定期主持一些每月一次的技术和创业相关的活动,比如 DC Drupal 实验室和 DC 夜猫子。这些天,我参加了一些活动,并帮助朋友们举办一些当地活动,如 DC 创业周末。
托管行业的未来会是什么样子?
低端将是一场底部竞赛,你的大品牌将在这里大规模生存。我认为还在 cPanel/generic 共享主机游戏中的中产阶级提供商将被慢慢消灭/停滞。你会看到服务提供商越来越专业化。
WordPress 托管仅仅是一个开始,我认为你将会看到每种类型的利基托管越来越多的竞争。我认为 SaaS 的平台即服务提供商将会涌现出来支持各种利基市场。我看到越来越少的人只是在寻找“主机服务”他们想要<的东西>托管。WordPress 托管。Drupal 托管。NodeJS 托管。Ruby on Rails 托管。我不确定我们是否会再次看到 cPanel 级别的关于托管的报道,每个人都有一个解决方案。我认为我们会看到较小的专业公司收取较高的价格,并(希望)提供更好的服务,而大型主机以足够低的价格提供这些技术的基本覆盖水平,以留住足够多的人。
你和你的企业的未来会是什么样子?
对我来说,这是旅行,并试图找到一个我快乐和富有成效的社区。对我的业务来说,就是查看数据,讲述数据驱动的故事,并继续尝试将大数据引入网站托管评论。
让你所有的应用程序、数据库和 WordPress 网站在线并在一个屋檐下。我们功能丰富的高性能云平台包括:
- 在 MyKinsta 仪表盘中轻松设置和管理
- 24/7 专家支持
- 最好的谷歌云平台硬件和网络,由 Kubernetes 提供最大的可扩展性
- 面向速度和安全性的企业级 Cloudflare 集成
- 全球受众覆盖全球多达 35 个数据中心和 275 多个 pop
在第一个月使用托管的应用程序或托管的数据库,您可以享受 20 美元的优惠,亲自测试一下。探索我们的计划或与销售人员交谈以找到最适合您的方式。
如何阻止谷歌分析中的语言垃圾
没有人喜欢垃圾邮件,这可能会让网站所有者非常沮丧,因为它通常需要花时间来设置过滤器,并研究阻止垃圾邮件的最佳方法。
到目前为止,许多人已经习惯于处理推荐垃圾信息,因为这是困扰我们多年的问题。然而,在过去的几个月里,出现了一种新的解决方法,那就是大家现在所说的“T2”语言垃圾邮件“T3”。
你们大多数人可能在 2016 年美国大选前后开始注意到这一点。请遵循我们下面的教程,了解阻止语言垃圾的最佳方式,并防止它扭曲你的流量和分析统计数据。一旦这些问题开始出现,立即解决是非常重要的。
68% of a WordPress site’s traffic we tested was from language spam. 😱 Combat it now.Click to Tweet
- 什么是语言垃圾邮件?
- 如何在谷歌分析中拦截语言垃圾
什么是语言垃圾邮件?
虽然推荐垃圾邮件主要针对搜索引擎,但语言垃圾邮件通常被垃圾邮件发送者用于特定目的或推广他们自己的网站或产品。所发生的是他们操纵真实网站使用的语言,如 motherboard.vice.com、thenextweb.com、lifehacker.com、reddit.com 等。语言垃圾邮件通常只在你网站的主页上注册浏览量。
他们能得到什么?来自 Dowser 的 Peter Velchev 很好地解释了这一点:
这背后的想法是,一旦你看到新访客的网址,你可能会忍不住追踪到它的来源。这反过来会产生对黑客网站的实际访问,从而推动其评级阶梯上升…

Language spam referral source
语言垃圾可以在你的仪表盘上的谷歌分析中看到,或者在“受众>地理>语言”部分下看到。以下是您最近可能在报告中看到的一些语言垃圾邮件攻击的例子:
需要在这里大声喊出来。Kinsta 太神奇了,我用它做我的个人网站。支持是迅速和杰出的,他们的服务器是 WordPress 最快的。
- Secret.ɢoogle.com 你被邀请了!仅使用此票证 URL 进入。复制它。投票给川普!
- 祝贺特朗普和所有美国人
- 维塔利统治谷歌☆*:。゜゚・ヽ(ᴗ)ノ・゜゚。:*☆_(ツ)_/(ಠ益ಠ)(ಥ‿ಥ)(ʘ‿ʘ)ლ(ಠ_ಠლ)(͜͡ʖ͡)ヽ(゚д゚)ノʕ•̫͡•ʔᶘᵒᴥᵒᶅ(=^ ^=)oo
- o-o-8-o-o.com 搜索壳比谷歌好得多!
- 谷歌官方推荐 o-o-8-o-o.com 搜索外壳!
谷歌显然正在解决这个问题,但是越来越多的问题不断出现。一旦一个停止,另一个似乎开始。

Google Analytics language spam
这是在一个全新的网站上拍摄的截图,如你所见,在 11 月 1 日至 12 月 17 日期间,**1377 个会话中有 929 个来自语言垃圾邮件!**谈谈扭曲你的数据。

Language spam traffic
语言垃圾问题在 11 月 9 日的搜索引擎圆桌会议上被提出。如果我们看一下谷歌趋势,我们可以看到从 2016 年 11 月开始,围绕“谷歌垃圾分析”的活动激增。

Google Analytics spam trends
为什么要屏蔽语言垃圾?
阻止语言垃圾的第一个原因显然是不要完全扭曲你的分析数据,如上所述。如果你想使用你的访问者的语言数据,比如说在一个多语言的 WordPress 设置中,那么你希望数据是准确的。
另一个很多人没有意识到的重要原因是谷歌分析过滤器不能追溯应用。这意味着过滤器仅适用于从过滤器创建之日起收集的数据。这就是为什么立即解决垃圾邮件问题很重要。历史数据不能用过滤器来修复。然而,这样做的缺点是,如果您错误地实现了过滤器,您可能会永远丢失有价值的数据。还有高级段可以帮助你处理历史数据,我们将在下面详细介绍。
如何阻止谷歌分析中的语言垃圾
在谷歌分析中处理语言垃圾有几个选择。我们不一定推荐使用插件,因为通常在接近问题根源的地方使用会更好。还有,外挂很难消除幽灵下线。在处理、过滤和分割数据方面,谷歌分析实际上非常强大。通过不使用插件,你可以确保无论你的网站安装发生什么情况,过滤器/片段都不会被移除。
选项 1:用过滤器阻止语言垃圾邮件
在 Google Analytics 中阻止语言垃圾的第一个也可能是最简单的方法是使用过滤器。过滤器允许您修改和限制数据。例如,您可以从特定 IP 或 IP 范围中排除某些子目录、白名单流量等。我们建议您在创建过滤器时设置一个新的视图,因为如果出现任何问题,您应该始终可以访问您的原始数据。然后将所有自定义过滤器应用于新视图。
第一步(可选)
第一步是复制当前视图,这样就可以只在单独的视图中筛选数据。为了您的安全,这是可选的。您可能已经有了一个单独的视图,在这种情况下,您可以跳到步骤 2。否则,点击进入谷歌分析的管理部分,进入你当前的“视图设置”然后点击“复制视图”你之所以要使用 copy,是因为它会延续你网站上已经有的其他过滤器和目标。

Copy view in Google Analytics
命名您的新视图。在我们的示例中,我们选择“filtered domain.com”,然后单击“Copy view”
注册订阅时事通讯
想知道我们是怎么让流量增长超过 1000%的吗?
加入 20,000 多名获得我们每周时事通讯和内部消息的人的行列吧!

Copy view
第二步
点击进入新的过滤视图(或原始视图)并点击进入“过滤器”然后点击“+添加过滤器。”
You will need “Edit” access at the “Account” level in Google Analytics in order to set up new filters, or you won’t have the ability to follow through on these next steps.

Add new filter in Google Analytics
第三步
给你的过滤器一个名字(例如:过滤语言垃圾邮件)。然后从过滤器类型中选择自定义。您需要选择“语言设置”过滤器,并在过滤器模式字段中输入以下内容:
.{15,}|\s[^\s]*\s|\.|,|\!|\/

Language spam filter
然后,您可以单击“验证”按钮,查看过滤器在过去 7 天中发现的内容示例。然后单击“保存”以应用过滤器。

Verify language spam filter
就是这样!你现在只能在谷歌分析中看到有效的/真实的语言。
Struggling with downtime and WordPress problems? Kinsta is the hosting solution designed to save you time! Check out our features
选项 2:用高级段拦截语言垃圾邮件
在谷歌分析中,对抗语言垃圾的第二个选择是使用高级段。这些实际上与您的历史数据一起工作,并且通常被认为是更改您的数据的更安全的选择,因为它们不会改变任何东西。您可以随时取消激活它们以返回到以前的状态。然而,如果你使用一个带有过滤器的单独视图,就像我们上面展示的那样,这也是安全的。
第一步
要创建一个细分市场,请点击谷歌分析的管理部分,进入“细分市场”然后点击“+新细分。”
Just like with filters, you will need “Edit” access at the “Account” level in Google Analytics in order to set up new filters, or you won’t have the ability to follow through on these next steps.

Create segment in Google Analytics
第二步
为您的段命名(例如:段语言垃圾邮件),在语言字段下,将下拉列表更改为“不匹配正则表达式”,并输入以下内容:
.{15,}|\s[^\s]*\s|\.|,|\!|\/
然后点击“保存”

Language spam advanced segment
仅此而已。然后,您可以在 Analytics dashboard 上选择该语言段,并删除“所有用户”请记住,数据段会实时修改数据。提示:您可以使用已经应用的新细分创建自定义仪表板/快捷方式,以便以后快速查看。

View segment in Google Analytics
选项 3:用第三方列表阻止语言垃圾邮件
垃圾邮件最令人讨厌的一点是,对于我们这些网站所有者来说,这很费时间。我们必须不断更新我们的细分市场和过滤器,以确保我们的数据尽可能准确。但是,如果您没有时间,也有一些资源和第三方工具可以帮助您加快这个过程。以下是你可能想看看的几个选项:
- Analytics-Toolkit:这家公司提供了一个他们称之为的自动垃圾邮件过滤器,它会为你不断更新。
- Analytics Edge 有免费的预建段,您只需点击一下即可使用。这些也在不断更新。
如果你有兴趣更深入地了解如何最好地从 Google Analytics 中删除垃圾邮件,以下这些教程很棒:
摘要
如您所见,过滤和排除这种新的语言垃圾邮件策略非常容易。我们建议浏览您网站上的分析,并确保您的数据没有失真。你对语言垃圾有什么看法?我们发现这简直是令人讨厌,希望在未来谷歌可以帮助打击更多的这种无用的数据,企业主现在不得不处理。
让你所有的应用程序、数据库和 WordPress 网站在线并在一个屋檐下。我们功能丰富的高性能云平台包括:
- 在 MyKinsta 仪表盘中轻松设置和管理
- 24/7 专家支持
- 最好的谷歌云平台硬件和网络,由 Kubernetes 提供最大的可扩展性
- 面向速度和安全性的企业级 Cloudflare 集成
- 全球受众覆盖全球多达 35 个数据中心和 275 多个 pop
在第一个月使用托管的应用程序或托管的数据库,您可以享受 20 美元的优惠,亲自测试一下。探索我们的计划或与销售人员交谈以找到最适合您的方式。
Laravel 9 的新特性:深入了解最新的主要版本
多年来,Laravel 一直是最受欢迎的 PHP 开发框架之一。它优雅、可伸缩,已经成为开发人员和使用 PHP 的公司事实上的框架之一。Laravel 9 是其最新发布的版本,具有许多新功能。
在过去,每六个月就会有新的 Laravel 发布,导致了大量的问题、苛刻的评论和对 Laravel 新发布过程的困惑。随着 2022 年 2 月 Laravel 9 的发布,该框架进入了 12 个月的主要发布周期。
本文探讨了 Laravel 9 的主要特性。除此之外,我们还将详细介绍如何升级到 Laravel 9 并开始开发 web 应用程序。
T3】
什么是 Laravel?
Laravel 是一个开源的 PHP web 应用程序框架,以其优雅的语法而闻名。这是一个使用 PHP 编程语言构建简单到复杂的 web 应用程序的 MVC 框架,它严格遵循 MVC(模型-视图-控制器)架构模式。
如果你还没有使用过 Laravel,你可以阅读什么是 Laravel并查看我们的优秀 Laravel 教程列表来开始使用。
Laravel 9 来了,还有很多要拆包的!🎒在本指南的帮助下深入了解👇 点击推文
Laravel 的主要特点
如果你是这个框架的新手,我们已经整理了一些最好的 Laravel 特性,让你有更好的理解。
Kinsta 把我宠坏了,所以我现在要求每个供应商都提供这样的服务。我们还试图通过我们的 SaaS 工具支持达到这一水平。
Laravel features in bubbles. (Image source: Moon Technolabs)
雄辩的 ORM
Laravel 的对象关系映射器(ORM)被称为雄辩的,这是 Laravel 的最佳特性之一,因为它允许与数据模型和选择的数据库无缝交互。
借助雄辩,Laravel 抽象出了涉及与复杂的 SQL 查询交互和编写复杂的 SQL 查询以从数据库中访问数据的每一个障碍。
Artisan CLI
Artisan CLI 或命令行是 Laravel 的另一个重要方面。有了它,您可以从命令行创建或修改 Laravel 的任何部分,而不必浏览文件夹和文件。
使用 Artisan,您甚至可以使用 Laravel Tinker 从命令行直接与数据库进行交互,而无需安装数据库客户端。
MVC 架构
Laravel 的 MVC 架构本质使得这种语言具有相关性和适应性,因为它遵循了一种流行的 web 开发模式,并不断进行重大改进。
Laravel 会强迫你学习和理解 MVC 架构模式,这种模式在几乎所有框架中都很流行和使用,比如 JavaScript 的 AdonisJS 和 C#的 ASP.NET MVC。
T3】
自动分页
如果您曾经在应用程序中挣扎过分页,那么您将会理解通过内置框架整理分页的价值。
Laravel 通过构建开箱即用的自动分页解决了分页问题。这个特性是它最受认可的特性之一,它消除了自己解决分页之谜所涉及的工作。
安全性
仔细检查你正在考虑使用的任何网络应用程序的安全措施是很重要的,因为缺乏尽职调查会导致资金损失,甚至劫持你的网站或产品。
由于 Laravel 遵循了 OWASP 安全原则,因此它提供了许多安全措施。从跨站请求伪造(CSRF)到 SQL 注入,Laravel 有一个内置的解决方案。
Laravel 9 的新功能
原定于 2021 年 9 月发布的 Laravel 9 版本被推迟到 2022 年 1 月(以及 2022 年 2 月晚些时候),这使得它成为继 12 个月的发布周期之后推出的第一个长期支持(LTS)版本。这种延迟是由多种原因造成的,包括但不限于以下原因:
- Laravel 使用各种社区驱动的项目和大约 9 个 Symfony 库。然而,Symfony 计划在 2021 年 11 月发布 6.0 版本。延迟将允许 Laravel 团队将这个新版本的 Symfony 作为 Laravel 9 的一部分。
- 这一延迟将为团队提供两个月的时间来监控 Laravel 如何与 Symfony 的新版本进行交互。这也给了他们修正任何重大变化或错误的空间。
- 最后,延迟 Laravel 9 可以更好地为 Laravel 团队将来的年度发布做准备。Symfony 发布后,将会给团队两个月的额外加速时间。
基于这些原因,你可以看到发布延迟是值得等待的。
Kinsta 允许您为您的产品运行 Laravel,尽管我们的团队并不正式支持它。
Laravel 9 中的新功能
现在,让我们来看看 Laravel 即将发布的主要版本中的特性和改进列表。
注册订阅时事通讯
想知道我们是怎么让流量增长超过 1000%的吗?
加入 20,000 多名获得我们每周时事通讯和内部消息的人的行列吧!
最低 PHP 要求
首先也是最重要的,Laravel 9 需要最新的 PHP 8 和 PHPUnit 8 进行测试。这是因为 Laravel 9 将使用最新的 Symfony v6.0,它也需要 PHP 8。
PHP 8 有显著的改进和特性,从 JIT 编译到构造函数属性提升。你可以在我们的博客上探索不同的 PHP 版本基准测试,并学习如何从 T2 升级到最新的 PHP 8。
匿名存根迁移
Laravel 将匿名存根迁移设置为运行常用迁移命令时的默认行为:
php artisan make:migration
匿名存根迁移特性在 Laravel 8.37 中首次发布,以解决这个 Github 问题。问题是,当试图从头开始重新创建数据库时,具有相同类名的多个迁移可能会导致问题。新的存根迁移功能消除了迁移类名冲突。
从 Laravel 8.37 开始,框架现在支持匿名类迁移文件,在 Laravel 9 中,这将是默认行为。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('people', function (Blueprint $table)
{
$table->string('first_name')->nullable();
});
}
};
新的查询生成器界面
有了新的 Laravel 9,类型提示在他们的ide中对于重构、静态分析和代码完成是高度可靠的。由于在**查询\构建器、雄辩\构建器和雄辩\关系之间缺乏共享接口或继承。**尽管如此,有了 Laravel 9,开发人员现在可以享受新的查询构建器接口,用于类型提示、重构和静态分析。
<?php
return Model::query()
->whereNotExists(function($query) {
// $query is a Query\Builder
})
->whereHas('relation', function($query) {
// $query is an Eloquent\Builder
})
->with('relation', function($query) {
// $query is an Eloquent\Relation
});
这个版本增加了新的Illuminate\Contracts\Database\QueryBuilder interface,以及将代替__call魔法方法实现接口的Illuminate\Database\Eloquent\Concerns\DecoratesQueryBuilder特征。
需要为您的电子商务网站提供超快的、可靠的、完全安全的托管服务吗?Kinsta 提供了所有这些以及来自 PHP 专家的 24/7 世界级支持。查看我们的计划
PHP 8 字符串函数
由于 Laravel 9 的目标是 PHP 8,Laravel 合并了这个 PR ,建议使用最新的 PHP 8 字符串函数。
这些函数包括在\Illuminate\Support\Str类内部使用str_contains()、str_starts_with()和str_ends_with()。
上面列出的 Laravel 9 的特性和改进是对即将到来的事物的一个先睹为快。它肯定会带来许多 bug 修复、特性,当然,还有许多突破性的变化。
如何安装 Laravel 9
如果您想开始使用 Laravel 9 进行开发和测试,您可以很容易地在本地机器上安装并运行它。
Laravel 9 支持 PHP 版本 8,所以如果你打算测试它,确保检查你的 PHP 版本或者启动全新安装。
你可以通过 Packagist 找到关于发布的更多细节。
要使用 composer 安装 Laravel 9,请运行以下命令:
composer create-project --prefer-dist laravel/laravel laravel-9-dev dev-develop
上面的命令将创建一个新的 Laravel 项目,项目名为laravel-9-dev,使用最新的 Laravel 9,正如我们所知,它仍在开发中(因此为dev-develop)。
第二种方法是使用 Laravel 全局 CLI 创建一个新的 Laravel 项目,并选择从 dev 分支创建您的新项目。
输入以下命令创建一个新的 Laravel 9 项目:
laravel new laravel-9-dev --dev
现在您已经安装了 Laravel 9,您可以进入新目录(laravel-dev)并执行 artisan 命令来检查版本:
cd laravel-9-dev
php artisan --version
它应该向您展示 Laravel 9 的开发版本。瞧啊。
就在这里!😄在这本大型指南中获取所有关于 Laravel 9 的独家新闻💥
摘要
Laravel 是一个引人注目的 PHP 框架,越来越受到开发人员的关注。Laravel 9 是 12 个月发布周期后的第一个版本,我们已经可以体验到它“有趣”的新功能。
Laravel 团队可能会在未来宣布新的特性和更新。因此,请确保将这篇文章加入书签,因为我们将在未来的更新中涵盖它们。
现在,轮到你了!你对 Laravel 9 最期待的是什么?请在评论区告诉我们!
让你所有的应用程序、数据库和 WordPress 网站在线并在一个屋檐下。我们功能丰富的高性能云平台包括:
- 在 MyKinsta 仪表盘中轻松设置和管理
- 24/7 专家支持
- 最好的谷歌云平台硬件和网络,由 Kubernetes 提供最大的可扩展性
- 面向速度和安全性的企业级 Cloudflare 集成
- 全球受众覆盖全球多达 35 个数据中心和 275 多个 pop
在第一个月使用托管的应用程序或托管的数据库,您可以享受 20 美元的优惠,亲自测试一下。探索我们的计划或与销售人员交谈以找到最适合您的方式。
关于 Laravel 缓存您需要知道的一切
缓存对于实现高性能和可伸缩性至关重要。从开发阶段就实施正确的缓存策略对于避免滞后的 API 和缓慢的页面加载时间至关重要。Laravel 是最流行的 PHP 框架之一,因此实现最佳的 Laravel 缓存策略对于更好的用户体验和更大的业务影响是不可或缺的。
在本文中,我们将探索在 Laravel 中实现和操作缓存的策略。您将了解 Laravel 缓存如何工作,几个 Laravel 缓存查询,以及如何在 Laravel 应用程序上处理缓存。
如果您已经对以下内容有了基本的了解,那么您将从这篇文章中获得更多:
让我们开始吧!
查看我们的视频指南到 Laravel 缓存
为什么缓存很重要?
随着最近互联网业务的蓬勃发展,不同公司的统计数据显示,网站加载时间和低性能如何严重影响 SEO、用户参与度和没有缓存的对话率。这从一个优秀的缓存策略开始。
需要在这里大声喊出来。Kinsta 太神奇了,我用它做我的个人网站。支持是迅速和杰出的,他们的服务器是 WordPress 最快的。
一项在线研究发现“1 秒钟的加载延迟时间会让亚马逊每年损失 16 亿美元的销售额。”
另一项谷歌研究报告“我们的研究表明,如果搜索结果慢了甚至几分之一秒,人们就会少搜索(说真的:一个400 毫秒的延迟会导致0.44%的搜索量下降,数据粉丝)。这种不耐烦不仅限于搜索领域:如果视频在加载过程中出现停滞,五分之四的互联网用户会点击离开。
网页加载时间稍有迟缓,就会对用户体验造成巨大影响,并导致大量资金损失。
什么是 Laravel 缓存?
Laravel 提供了一个健壮且易于使用的缓存实现和不同的缓存后端。使用 Laravel cache,您无需编写任何代码,就可以高效地在许多缓存引擎之间进行切换。
您可以在**config/cache.php**文件夹中找到 Laravel 缓存的配置,尽管您可能只需要**。env** 文件在不同的缓存后端之间切换。
Laravel cache 还提供了许多实用的方法,我们可以用它们来实现不同的缓存策略。
Laravel 高速缓存驱动程序和比较
Laravel cache 提供了优秀的缓存后端和驱动程序。根据您的使用情况,您可以在它们之间切换,以提高您的应用程序性能和加载时间。
也就是说,Laravel cache 还提供了一种无缝的方式来创建自定义后端并将其与 Laravel cache 一起使用,但前提是下面的列表不适合您的用例。
我们接下来会谈到 Laravel cache 提供的所有后端的列表。
1.文件
当在中没有指定驱动程序时,文件驱动程序是 Laravel 缓存使用的默认后端。env 文件。
文件后端被设计成将缓存数据存储在**storage/framework/**下的加密文件中。当缓存新数据时,Laravel 用数据和缓存密钥创建一个加密文件。当用户试图检索内容时,也会发生同样的情况。Laravel cache 在文件夹中搜索指定的键,如果找到,就返回内容。
虽然文件后端工作完美,节省了安装和配置外部驱动程序的时间,但它也可以成为开发的完美。这比直接从数据库服务器访问数据要快。
要使用文件驱动程序,将以下代码添加到您的中。env 文件:
CACHE_DRIVER=file
2.排列
数组驱动程序是运行自动化测试的完美的缓存后端,可以通过 Github Actions、Jenkins 等工具轻松配置。
数组后端将缓存的数据存储在 PHP 中的一个数组中,不需要您安装或配置任何驱动程序。它非常适合自动化测试,并且比文件缓存后端快一点。
要使用数组驱动程序,将以下代码添加到您的中。env 文件:
CACHE_DRIVER=array
3.数据库ˌ资料库
当使用数据库驱动程序时,当前 PHP 进程的数据存储在内存中。因此,您需要创建一个数据库表来存储缓存的数据。此外,数据库缓存通过将查询工作负载从后端分配到多个前端来提高可伸缩性。
您可以运行 Artisan 命令php artisan cache:table来自动生成数据库驱动程序所需的数据库模式。
数据库驱动主要用于你可以在你的托管平台上安装任何软件的情况。
例如,假设你正在使用一个有限选项的免费托管计划。为此,我们建议坚持使用文件驱动程序,因为数据库驱动程序在大多数情况下是应用程序最薄弱的地方,试图将更多的数据推入这个瓶颈并不是一个好主意。
要使用数据库驱动程序,将以下代码添加到您的中。env 文件:
CACHE_DRIVER=database
4.雷迪斯
redis 驱动使用基于内存的缓存技术,称为 Redis **。**虽然与上面讨论的其他高速缓存驱动程序相比,它很快,但它需要安装和配置外部技术。
要使用 redis 驱动程序,将以下代码添加到您的中。env 文件:
CACHE_DRIVER=redis
5.Memcached
众所周知,Memcached 是最流行的基于内存的缓存存储。如果你不介意额外的服务器维护(必须安装和维护额外的服务),基于内存的缓存驱动 Memcached 是很好的选择。
使用 memcached 驱动需要安装 Memcached PECL 包。
要使用 memcached 驱动程序,将以下代码添加到您的中。env 文件。
CACHE_DRIVER=memcached
要使用的最佳缓存驱动程序和缓存驱动程序的性能取决于您的项目用例以及要检索的数据量。
Laravel 高速缓存的使用和方法
Laravel cache 提供了许多有价值的方法,用于实现许多缓存策略。
下面我们将列出并解释不同的方法(根据它们的用例分类):
put()get()many()putMany()increment()decrement()forever()forget()flush()remember()rememberForever()
存储缓存
使用不同的方法在缓存中存储新数据非常简单,每种方法都有几个用例。
1.Cache::put()
这个方法接受三个关键参数,持续时间,以及要缓存的数据。
让我们来看看如何使用**Cache::put()**:
Cache::put(key, data, duration)
$post = Post::find(1);
Cache::put('post_1', $post, 20);
上面的代码将使用唯一的键缓存帖子 20 秒。
2.高速缓存::putMany()
此方法以相同的持续时间在缓存中一次存储一个数据数组。它接受两个参数,即数据和秒。
让我们来看看如何使用**Cache::putMany()**:
Cache::putMany(data, duration) // syntax
$posts = Post::all();
Cache::putMany($posts, 20);
3.Cache::remember()
这种方法是实现缓存备用策略的另一种很好的方式。**Cache::remember()**方法接受三个参数,一个键、秒和闭包,用于在没有找到数据时从数据库中检索数据。
让我们来看看如何使用**Cache::remember()**:
Cache::remember(key, duration, closure) // syntax
Cache::remember('posts', 20, function(){
return Post::all();
});
Laravel cache 也有**Cache::rememberForever()**方法,不接受秒参数,永久存储数据。
4.Cache::forever()
此方法将数据永久存储在缓存服务器中,而不指定任何持续时间。您可以用下面的代码实现它:
Cache::forever(key, data)
$post = Post::find(1);
Cache::forever('post_1', $post);
正在检索缓存数据
此类别中的方法从缓存中检索数据。根据数据是否被找到,这些方法中的一些会有不同的表现。
1.Cache::get()
该方法使用特定的键从缓存服务器中检索数据。您可以使用下面的代码来检索项目:
Cache::get(key) // syntax
$posts = Cache::get('posts');
2.Cache::many()
这个方法类似于**Cache::putMany()**。它用于使用缓存的键数组一次检索缓存的数据数组。您可以使用以下代码检索缓存数组:
Cache::many(keys) // syntax
const $keys = [
'posts',
'post_1',
'post_2'
];
$posts = Cache::many($keys);
3.Cache::remember()
您还可以使用此方法通过使用提供的键检查缓存服务器来检索缓存的数据。如果数据存储在缓存中,它将检索它。否则,它将从数据库服务器中检索数据并缓存。该方法与**Cache::rememberForever()**方法相同,只是在**Cache::remember()**方法中多了一个秒参数。
从缓存中删除项目
此类别下的方法用于从缓存中移除项目,按功能分组。
1.Cache::forget()
此方法使用指定的键参数从缓存中移除单个项:
Cache::forget('key');
2.Cache::flush()
该方法清除所有缓存引擎。它会删除存储在缓存中任何位置的所有项目:
Cache::flush();
递增或递减高速缓存值
您可以分别使用 increment 和 decrement 方法来调整存储在缓存中的整数值:
Cache::increment('key');
Cache::increment('key', $amount);
Cache::decrement('key');
Cache::decrement('key', $amount);
Laravel cache 有很多我们上面没有讨论的很棒的方法,但是上面的方法很受欢迎。你可以在官方的 Laravel 缓存文档中获得所有方法的概述。
注册订阅时事通讯
想知道我们是怎么让流量增长超过 1000%的吗?
加入 20,000 多名获得我们每周时事通讯和内部消息的人的行列吧!
缓存命令解释
Laravel 提供了一些命令,使使用 Laravel 缓存变得简单快捷。以下是所有命令及其功能的列表。
清除 Laravel 缓存
该命令用于使用终端/控制台在 Laravel 缓存过期之前将其清除。例如,您可以运行以下命令:
php artisan cache:clear
清除路由缓存
这个命令用于清除 Laravel 应用程序的路由缓存。例如,运行以下命令来清除路径缓存:
php artisan config:cache
清除编译的视图文件
该命令用于清除 Laravel 应用程序的编译视图文件。您可以使用以下命令来实现它:
php artisan view:clear
数据库表
使用数据库驱动时,需要创建一个名为 cache 的数据库模式来存储缓存数据。您也可以使用 Artisan 命令生成具有正确模式的移植:
php artisan cache:table
Laravel 缓存策略
根据您的应用程序用例和数据结构,您可能会有几种不同的缓存策略。您甚至可以创建自定义策略来满足您的需求。下面我们将讨论可以在 Laravel 项目中实现的流行缓存策略列表。
信息
Kinsta 允许您为您的产品运行 Laravel,尽管我们的团队没有正式支持它。
直写
在直写策略中,缓存服务器位于请求和数据库服务器之间,使得每个写操作在到达数据库服务器之前都要经过缓存服务器。因此,直写缓存策略类似于直读策略。
您可以使用 Laravel 缓存通过以下代码实现这一策略:
public function writeThrough($key, $data, $minutes) {
$cacheData = Cache::put($key, $data, $minutes)
// Database Server is called from(after) the Cache Server.
$this->storeToDB($cachedData)
return $cacheData
}
private function storeToDB($data){
Database::create($data)
return true
}
写回(写后)
这种策略是通过增加写操作延迟来实现写通策略的更高级的方式。
您也可以称之为 writeBehind 策略,因为在将数据写入数据库服务器之前,缓存服务器会有时间延迟。
您可以使用 Laravel 缓存通过以下代码实现这一策略:
$durationToFlush = 1; // (in minute)
$tempDataToFlush = [];
public function writeBack($key, $data, $minutes){
return $this->writeThrough($key, $data, $minutes);
}
public function writeThrough($key, $data, $minutes) {
$cacheData = Cache::put($key, $data, $minutes);
$this->storeForUpdates($cacheData);
return $cacheData;
}
// Stores new data to temp Array for updating
private function storeForUpdates($data){
$tempData = {};
$tempData['duration'] = this.getMinutesInMilli();
$tempData['data'] = data;
array_push($tempDataToFlush, data);
}
// Converts minutes to millisecond
private function getMinutesInMilli(){
$currentDate = now();
$futureDate = Carbon(Carbon::now()->timestamp + $this->durationToFlush * 60000)
return $futureDate->timestamp
}
// Calls to update the Database Server.
public function updateDatabaseServer(){
if($this->tempDataToFlush){
foreach($this->tempDataToFlush as $index => $obj){
if($obj->duration timestamp){
if(Database::create($obj->data)){
array_splice($this->tempDataToFlush, $index, 1);
}
}
}
}
}
写回方法调用写通方法,该方法将数据存储到缓存服务器,并使用更新数据库服务器方法将一个临时数组稍后推送到数据库服务器。您可以设置一个 CronJob 每五分钟更新一次数据库服务器。
四处写
这种策略允许所有的写操作直接进入数据库服务器,而无需更新缓存服务器——只有在读操作期间,缓存服务器才会被更新。
假设用户想要创建一个新的文章,文章直接存储到数据库服务器。当用户第一次想要阅读文章的内容时,从数据库服务器中检索文章,并为后续请求更新缓存服务器。
您可以使用 Laravel 缓存通过以下代码实现这一策略:
厌倦了低于 1 级的 WordPress 托管支持而没有答案?试试我们世界一流的支持团队!查看我们的计划
public function writeAround($data) {
$storedData = Database::create($data);
return $storedData;
}
public function readOperation($key, $minutes){
$cacheData = Cache::remember($key, $minutes, function() {
return Article::all();
})
return $cacheData;
}
缓存搁置(延迟加载)
在这种策略中,数据库处于闲置状态,应用程序首先从缓存服务器请求数据。然后,如果有一个命中(发现),数据被返回给客户端。否则,如果有未命中(未找到),数据库服务器将请求数据并为后续请求更新缓存服务器。
您可以使用 Laravel 缓存通过以下代码实现这一策略:
public function lazyLoadingStrategy($key, $minutes, $callback) {
if (Cache::has($key)) {
$data = Cache::get($key);
return $data;
} else {
// Database Server is called outside the Cache Server.
$data = $callback();
Cache::set($key, $data, $minutes);
return $data;
}
}
上面的代码展示了缓存备用策略的实现,这相当于实现了 Cache::remember 方法。
通读
这种策略与缓存备用策略正好相反。在这种策略中,缓存服务器位于客户机请求和数据库服务器之间。
请求直接发送到缓存服务器,如果在缓存服务器中没有找到数据,缓存服务器负责从数据库服务器中检索数据。
您可以使用 Laravel 缓存通过以下代码实现这一策略:
public function readThrough($key, $minutes) {
$data = Cache::find($key, $minutes);
return $data;
}
private function find($key, $minutes){
if(Cache::has($key);){
return Cache::get($key);
}
// Database Server is called from the Cache Server.
$DBdata = Database::find($key);
Cache:put($key, $DBdata, $minutes);
return $DBdata;
}
你有它!我们现在已经讨论了下一个 Laravel 应用程序的一些流行的缓存策略。请记住,您甚至可以使用最适合您的项目需求的自定义缓存策略。
缓存 Laravel 应用程序的 UI 部分
缓存我们的 Laravel 应用程序的 UI 是一个被称为全页面缓存 FPC 的概念。该术语指的是缓存来自应用程序的 HTML 响应的过程。
它非常适合动态 HTML 数据不经常变化的应用程序。您可以缓存 HTML 响应以获得更快的总体响应和 HTML 呈现。
我们可以用下面一行代码实现 FPC:
class ArticlesController extends Controller {
public function index() {
if ( Cache::has('articles_index') ) {
return Cache::get('articles_index');
} else {
$news = News::all();
$cachedData = view('articles.index')->with('articles', $news)->render();
Cache::put('articles_index', $cachedData);
return $cachedData;
}
}
}
乍一看,您可能已经注意到我们检查了那个 articles_index 页面是否已经存在于我们的缓存服务器中。然后,我们通过用 Laravel 的**视图()和渲染()**方法渲染页面来返回页面。
否则,我们将呈现页面,并在将呈现的页面返回到浏览器之前,将输出存储在缓存服务器中以供后续请求使用。
构建一个 Laravel 应用程序
现在,我们将通过创建一个新的 Laravel 项目并实现 Laravel 缓存来应用我们目前所学的内容。
如果你没有用过 Laravel,你可以通读什么是 Laravel并偷看我们的优秀 Laravel 教程列表来入门。
设置 Laravel
首先,我们将使用下面的命令创建一个新的 Laravel 实例。你可以查阅更多的官方文件。
在运行下面的命令之前,打开您的控制台并导航到您存储 PHP 项目的位置。确保正确安装和配置了 Composer 。
composer create-project laravel/laravel fast-blog-app
// Change directory to current Laravel installation
cd fast-blog-app
// Start Laravel development server.
php artisan serve
配置和设定数据库种子
接下来,我们将建立我们的数据库,创建一个新的文章模型,并播种 500 个假数据点进行测试。
打开您的数据库客户端并创建一个新的数据库。我们将对名称 fast_blog_app_db 做同样的处理,然后填充我们的**。带有数据库凭证的 env** 文件:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=fast_blog_app_db
DB_USERNAME=//DB USERNAME HERE
DB_PASSWORD=//DB PASSWORD HERE
接下来,我们将运行以下命令来同时创建迁移和文章模型:
php artisan make:model Article -m
打开新创建的迁移发现database/migrations/xxx-create-articles-xxx.php并粘贴以下代码:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateArticlesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('articles', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('description');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('articles');
}
}
接下来,运行下面的命令来创建一个新的种子:
php artisan make:seeder ArticleSeeder
打开在database/seeders/ArticleSeeder.php中新创建的种子文件,并粘贴以下代码:
<?php
namespace Database\Seeders;
use App\Models\Article;
use Illuminate\Database\Seeder;
class ArticleSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Article::factory()->count(500)->create();
}
}
打开同一目录下的DatabaseSeeder.php文件,添加以下代码:
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
$this->call(ArticleSeeder::class);
}
}
接下来,运行下面的命令创建一个新工厂:
php artisan make:factory ArticleFactory
打开在database/factories/ArticleFactory.php中找到的新建工厂文件,并粘贴以下代码:
<?php
namespace Database\Factories;
use App\Models\Article;
use Illuminate\Database\Eloquent\Factories\Factory;
class ArticleFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = Article::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'title' => $this->faker->text(),
'description' => $this->faker->paragraph(20)
];
}
}
现在,运行下面的命令来迁移我们新创建的模式,并为测试植入我们的假数据:
php artisan migrate --seed
创建文章控制器
接下来,我们将创建控制器,并设置路由来处理我们的请求,并使用上述模型检索数据。
运行以下命令,在app/Http/Controllers文件夹中创建一个新的 ArticlesController :
php artisan make:controller ArticlesController --resource
打开文件,并将以下代码添加到类中:
// Returns all 500 articles with Caching
public function index() {
return Cache::remember('articles', 60, function () {
return Article::all();
});
}
// Returns all 500 without Caching
public function allWithoutCache() {
return Article::all();
}
之后,打开在routes/文件夹中找到的api.php文件,并粘贴以下代码来创建一个端点,我们可以调用它来检索我们的数据:
Route::get('/articles', '[[email protected]](/cdn-cgi/l/email-protection)');
Route::get('/articles/withoutcache', '[[email protected]](/cdn-cgi/l/email-protection)');
测试性能
最后,我们将测试我们的应用程序响应的性能,无论是否实现了 Laravel 缓存。
此屏幕截图显示了实现了缓存的 API 的响应时间:
Laravel API response time with cache.
下面的屏幕截图显示了未实现缓存的 API 的响应时间—注意,缓存实例的响应时间增加了超过 5,000% :
Laravel API response time without cache.
对 web 开发和 laravel 有扎实的掌握,但是想了解更多关于 laravel 缓存的知识,以及如何实现?✅:这封信是给你的👇
摘要
我们通过构建一个新的项目,对其响应进行基准测试,并比较结果,探索了实现和操作 Laravel 缓存的各种策略。
您还了解了如何使用不同的 Laravel 缓存驱动程序和方法。此外,我们实施了不同的缓存策略来帮助您确定哪种策略可能适合您。
要了解更多 laravel,请浏览我们精心挑选的最佳 Laravel 教程。无论您是初学者还是高级 Laravel 开发人员,这里都有适合每个人的东西!
如果你还有关于 Laravel 缓存的问题,请在评论区告诉我们。
让你所有的应用程序、数据库和 WordPress 网站在线并在一个屋檐下。我们功能丰富的高性能云平台包括:
- 在 MyKinsta 仪表盘中轻松设置和管理
- 24/7 专家支持
- 最好的谷歌云平台硬件和网络,由 Kubernetes 提供最大的可扩展性
- 面向速度和安全性的企业级 Cloudflare 集成
- 全球受众覆盖全球多达 35 个数据中心和 275 多个 pop
在第一个月使用托管的应用程序或托管的数据库,您可以享受 20 美元的优惠,亲自测试一下。探索我们的计划或与销售人员交谈以找到最适合您的方式。
建立一个 Laravel 实时评论系统
为了在你的在线社区或博客中建立信任,你需要一个设计良好的 Laravel live 评论系统。
然而,第一次尝试就做对并不容易,除非你依赖自托管评论系统,如 Disqus 或 Commento,它们都有自己的缺点。他们拥有你的数据,提供有限的设计和定制,最重要的是,他们不是免费的。
有了这些限制,如果建立你的实时评论系统的想法——有控制你的数据、设计和定制适合你的博客的外观和感觉的好处——吸引你,继续读下去。
这篇文章将教你如何开发一个具有不同评论功能的设计良好的实时评论系统。遵循用 Vue.js 和 Socket.io 构建实时聊天应用的原则,我们将使用 Laravel、Pusher 和 React 来开发实时评论系统。
让我们开始吧!
我们将建造什么
我们将建立一个实时评论系统,它可以集成到任何网站或博客中,在社区中建立信任。
构建模块概述:Laravel、Pusher 和 Vue
在我们深入开发之前,让我们讨论一下我们将用来开发实时评论系统的技术。
拉勒韦尔
Laravel 是一个开源的面向 MVC 的 PHP 框架。它用于构建简单到复杂的 PHP web 应用程序,以其优雅的语法而闻名。了解什么是 Laravel对建立这个评论系统至关重要。
推进器
Pusher 使开发者能够大规模创建实时功能。本文将结合 Laravel Echo 创建一个对 Pusher 服务器的实时广播事件,并用 Vue.js 在前端显示内容
view . js-检视. js
Vue.js 是我们首选的前端框架。Vue.js 是一个进步的 JavaScript 前端框架,以其简单易学和直接的前端开发方法而闻名。我们将使用 Vue.js 来开发我们的实时评论系统。
建立评论系统
如果我们上面概述的评论系统听起来像你想要的,让我们继续构建它。
1.安装和设置 Laravel、Pusher 和 Echo
Laravel、Echo 和 Pusher 的安装和设置非常简单,因为 Laravel 已经通过设置和配置 Laravel Echo 与 Pusher 完美配合完成了所有后台任务。
首先,我们将开始安装和配置 Laravel,我们的后端 PHP 框架。如果您已经全局安装了 Laravel CLI ,那么您可以使用这个命令获取 Laravel 的一个新实例:
laravel new commenter
您的新 Laravel 实例将安装在一个名为 commenter 的文件夹中。让我们打开虚拟代码中的文件夹,并在终端中导航至该文件夹:
cd commenter
code .
在我们启动开发服务器之前,让我们安装并配置一些将用于项目的必要包。
运行这个命令来安装 Pusher PHP SDK:
composer require pusher/pusher-php-server
运行此命令为 Vue.js 前端安装必要的 NPM 软件包:
npm install --save laravel-echo pusher-js
接下来,我们将配置 Laravel Echo 和 Pusher。打开您的resources/js/bootstrap . js文件,并粘贴以下脚本:
window._ = require("lodash");
window.axios = require("axios");
window.moment = require("moment");
window.axios.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest";
window.axios.defaults.headers.post["Content-Type"] =
"application/x-www-form-urlencoded";
window.axios.defaults.headers.common.crossDomain = true;
window.axios.defaults.baseURL = "/api";
let token = document.head.querySelector('meta[name="csrf-token"]');
if (token) {
window.axios.defaults.headers.common["X-CSRF-TOKEN"] = token.content;
} else {
console.error("CSRF token not found");
}
/**
* Echo exposes an expressive API for subscribing to channels and listening
* for events that Laravel broadcasts. Echo and event broadcasting
* allows your team to build robust real-time web applications quickly.
*/
import Echo from "laravel-echo";
window.Pusher = require("pusher-js");
window.Echo = new Echo({
broadcaster: "pusher",
key: process.env.MIX_PUSHER_APP_KEY,
cluster: process.env.MIX_PUSHER_APP_CLUSTER,
forceTLS: true
});
您会从上面的脚本中注意到,我们只是用默认配置来配置 Axios 实例。接下来,我们将配置 Laravel Echo 来使用 Pusher 及其配置。
2.数据库设置和迁移
接下来,我们将创建并设置我们的数据库来存储持久化的注释。我们将使用 SQLite,尽管您可以使用自己选择的任何数据库客户机。
在数据库文件夹中创建一个 database.sqlite 文件,并更新您的**。env** 文件如下:
DB_CONNECTION=sqlite
DB_DATABASE=/Users/all/paths/to/project/commenter_be/database/database.sqlite
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=
接下来,运行此命令创建注释迁移,并使用以下脚本对其进行更新:
php artisan make:migration create_comments_table
打开数据库/migrations/xxxx _ create _ comments _ table _ xxxx . PHP文件并粘贴以下代码:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCommentsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('comments', function (Blueprint $table) {
$table->id();
$table->string('content');
$table->string('author');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('comments');
}
}
这将创建一个新的评论数据库表,并添加内容和作者列。
最后,要创建迁移,请运行以下命令:
php artisan migrate
3.创建模型
在 Laravel 中,模型很重要——它们是与我们的数据库通信和处理数据管理的最可靠的方式。
为了在 Laravel 中创建一个模型,我们将运行以下命令:
php artisan make:model Comment
接下来,打开 app/models/Comment.php 文件并粘贴以下代码:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
use HasFactory;
protected $fillable = ['content', 'author'];
} The $fillable array allows us to create and update the model in mass.
4.创建控制器
控制器至关重要,因为它们容纳了我们应用程序的所有逻辑、业务和其他内容,所以让我们创建一个控制器来处理注释逻辑:
注册订阅时事通讯
想知道我们是怎么让流量增长超过 1000%的吗?
加入 20,000 多名获得我们每周时事通讯和内部消息的人的行列吧!
php artisan make:controller CommentController
接下来,打开app/Http/Controllers/comment controller . PHP文件并粘贴以下代码:
<?php
namespace App\Http\Controllers;
use App\Models\Comment;
use App\Events\CommentEvent;
use Illuminate\Http\Request;
class CommentController extends Controller
{
//
public function index()
{
return view('comments');
}
public function fetchComments()
{
$comments = Comment::all();
return response()->json($comments);
}
public function store(Request $request)
{
$comment = Comment::create($request->all());
event(new CommentEvent($comment));
return $comment;
}
}
控制器有三种不同的方法:分别返回一个注释视图、获取所有注释和存储一个新注释。最重要的是,我们每次存储新评论时都会触发一个事件,前端会监听这个事件,使用 Pusher 和 Laravel Echo 用新评论实时更新相关页面。
5.创建路线
为了正确配置我们的路线,我们需要更新大量的文件,所以让我们开始吧。
首先,我们将更新 routes 文件夹中的api.php文件。打开文件并添加以下代码:
use App\Http\Controllers\CommentController;
//...
Route::get('/', [CommentController::class, 'index']);
Route::get('/comments', [CommentController::class, 'fetchComments']);
Route::post('/comments', [CommentController::class, 'store']);
接下来,打开同一个文件夹中的channels.php文件,并添加以下代码来授权我们之前触发的事件:
Broadcast::channel('comment', function ($user) {
return true;
});
接下来,打开同一个文件夹中的web.php文件,并添加下面的代码,将我们的请求重定向到主页,Vue.js 将在那里获取它:
use App\Http\Controllers\CommentController;
//...
Route::get('/', [CommentController::class, 'index']);
最后,我们将在资源/视图文件夹中创建一个名为【comments.blade.php】T2 的新刀片文件,并添加以下代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Commenter</title>
<meta name="csrf-token" content="{{ csrf_token() }}">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<style>
.container {
margin: 0 auto;
position: relative;
width: unset;
}
#app {
width: 60%;
margin: 4rem auto;
}
.question-wrapper {
text-align: center;
}
</style>
</head>
<body>
<div id="app">
<div class="container">
<div class="question-wrapper">
<h5 class="is-size-2" style="color: #220052;">
What do you think about <span style="color: #47b784;">Dogs</span>?</h5>
<br>
<a href="#Form" class="button is-medium has-shadow has-text-white" style="background-color: #47b784">Comment</a>
</div>
<br><br>
<comments></comments>
<new-comment></new-comment>
</div>
</div>
<script async src="{{mix('js/app.js')}}"></script>
</body>
</html>
该脚本添加了一个文章标题和一个 Vue 组件,以显示上面创建的文章标题并向其添加新的评论。
运行以下命令来测试是否一切都正确:
需要一个给你带来竞争优势的托管解决方案吗?Kinsta 为您提供了令人难以置信的速度、一流的安全性和自动伸缩功能。查看我们的计划
npm run watch
php artisan serve
如果您看到了这个页面,那么您已经准备好进入本文的下一步了。

Live commenting system in Laravel
6.设置 Vue(前端)
我们将创建并设置我们的 Vue 实例,以创建并显示在这篇帖子上发表的所有评论。
我们将从建立我们的 Vuex 商店开始。在 resource/js/store 文件夹中创建以下文件。
创建评论状态
创建 actions.js 并添加以下代码:
let actions = {
ADD_COMMENT({ commit }, comment) {
return new Promise((resolve, reject) => {
axios
.post(`/comments`, comment)
.then(response => {
resolve(response);
})
.catch(err => {
reject(err);
});
});
},
GET_COMMENTS({ commit }) {
axios
.get("/comments")
.then(res => {
{
commit("GET_COMMENTS", res.data);
}
})
.catch(err => {
console.log(err);
});
}
};
export default actions;
动作文件调用后端的注释端点。
接下来,创建 getters.js 文件并添加以下代码:
let getters = {
comments: state => {
return state.comments;
}
};
export default getters;
Getter 文件用于检索状态中的所有注释。
创建 mutations.js 文件,并将其粘贴到以下代码中:
let mutations = {
GET_COMMENTS(state, comments) {
state.comments = comments;
},
ADD_COMMENT(state, comment) {
state.comments = [...state.comments, comment];
}
};
export default mutations;
接下来,创建 state.js 文件并将其粘贴到以下代码中:
let state = {
comments: []
};
export default state;
最后,我们将把所有内容添加到导出到 Vue 实例的 index.js 文件中,创建一个 index.js 文件并添加以下内容:
import Vue from "vue";
import Vuex from "vuex";
import actions from "./actions";
import mutations from "./mutations";
import getters from "./getters";
import state from "./state";
Vue.use(Vuex);
export default new Vuex.Store({
state,
mutations,
getters,
actions
});
创建组件
最后,我们将创建注释组件来显示和添加新的注释。让我们从创建单个注释组件开始。
在 resource/js 文件夹中创建一个名为 components 的文件夹,添加 comment.vue 并添加以下代码:
<template>
<li class="comment-wrapper animate slideInLeft">
<div class="profile">
</div>
<div class="msg has-shadow">
<div class="msg-body">
<p class="name">
{{ comment.author }} <span class="date">{{ posted_at }}</span>
</p>
<p class="content">{{ comment.content }}</p>
</div>
</div>
</li>
</template>
<script>
export default {
name: "Comment",
props: ["comment"],
computed: {
posted_at() {
return moment(this.comment.created_at).format("MMMM Do YYYY");
},
},
};
</script>
<style lang="scss" scoped>
.comment-wrapper {
list-style: none;
text-align: left;
overflow: hidden;
margin-bottom: 2em;
padding: 0.4em;
.profile {
width: 80px;
float: left;
}
.msg-body {
padding: 0.8em;
color: #666;
line-height: 1.5;
}
.msg {
width: 86%;
float: left;
background-color: #fff;
border-radius: 0 5px 5px 5px;
position: relative;
&::after {
content: " ";
position: absolute;
left: -13px;
top: 0;
border: 14px solid transparent;
border-top-color: #fff;
}
}
.date {
float: right;
}
.name {
margin: 0;
color: #999;
font-weight: 700;
font-size: 0.8em;
}
p:last-child {
margin-top: 0.6em;
margin-bottom: 0;
}
}
</style>
接下来,在同一个文件夹中创建以下名为 comments.vue 的文件,并添加以下代码:
<template>
<div class="container">
<ul class="comment-list">
<Comment
:key="comment.id"
v-for="comment in comments"
:comment="comment"
></Comment>
</ul>
</div>
</template>
<script>
import { mapGetters } from "vuex";
import Comment from "./Comment";
export default {
name: "Comments",
components: { Comment },
mounted() {
this.$store.dispatch("GET_COMMENTS");
this.listen();
},
methods: {
listen() {
Echo.channel("comment").listen("comment", (e) => {
console.log(e);
this.$store.commit("ADD_COMMENT", e);
});
},
},
computed: {
...mapGetters(["comments"]),
},
};
</script>
<style scoped>
.comment-list {
padding: 1em 0;
margin-bottom: 15px;
}
</style>
最后,创建一个名为 NewComment.vue 的文件,并添加以下代码:
<template>
<div id="commentForm" class="box has-shadow has-background-white">
<form @keyup.enter="postComment">
<div class="field has-margin-top">
<div class="field has-margin-top">
<label class="label">Your name</label>
<div class="control">
<input
type="text"
placeholder="Your name"
class="input is-medium"
v-model="comment.author"
/>
</div>
</div>
<div class="field has-margin-top">
<label class="label">Your comment</label>
<div class="control">
<textarea
style="height: 100px"
name="comment"
class="input is-medium"
autocomplete="true"
v-model="comment.content"
placeholder="lorem ipsum"
></textarea>
</div>
</div>
<div class="control has-margin-top">
<button
style="background-color: #47b784"
:class="{ 'is-loading': submit }"
class="button has-shadow is-medium has-text-white"
:disabled="!isValid"
@click.prevent="postComment"
type="submit"
>
Submit
</button>
</div>
</div>
</form>
<br />
</div>
</template>
<script>
export default {
name: "NewComment",
data() {
return {
submit: false,
comment: {
content: "",
author: "",
},
};
},
methods: {
postComment() {
this.submit = true;
this.$store
.dispatch("ADD_COMMENT", this.comment)
.then((response) => {
this.submit = false;
if (response.data) console.log("success");
})
.catch((err) => {
console.log(err);
this.submit = false;
});
},
},
computed: {
isValid() {
return this.comment.content !== "" && this.comment.author !== "";
},
},
};
</script>
<style scoped>
.has-margin-top {
margin-top: 15px;
}
</style>
现在,打开 app.js 文件,添加以下代码来注册您之前创建的 Vue 组件:
// resource/js/app.js
require("./bootstrap");
window.Vue = require("vue");
import store from "./store/index";
Vue.component("comment", require("./components/Comment"));
Vue.component("comments", require("./components/Comments"));
Vue.component("new-comment", require("./components/NewComment"));
const app = new Vue({
el: "#app",
store
});
摘要
就是这样!您刚刚学习了如何使用 Laravel 为您的站点构建一个实时评论系统。
我们已经讨论了在你的社区或博客中建立信任的过程中创建和管理评论系统的好处。我们还探索了如何利用不同的评论功能从头开始开发一个设计良好的实时评论系统。
你可以在这个 Github repo 里克隆这个项目的源代码。
你对我们一起建立的 Laravel 实时评论系统有什么看法?请在评论中告诉我们!
让你所有的应用程序、数据库和 WordPress 网站在线并在一个屋檐下。我们功能丰富的高性能云平台包括:
- 在 MyKinsta 仪表盘中轻松设置和管理
- 24/7 专家支持
- 最好的谷歌云平台硬件和网络,由 Kubernetes 提供最大的可扩展性
- 面向速度和安全性的企业级 Cloudflare 集成
- 全球受众覆盖全球多达 35 个数据中心和 275 多个 pop
在第一个月使用托管的应用程序或托管的数据库,您可以享受 20 美元的优惠,亲自测试一下。探索我们的计划或与销售人员交谈以找到最适合您的方式。



T2】






