整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

PHP 你真的了解INCLUDE、REQUIRE吗?

PHP中有两个引入文件的语言结构:include、require

1、注意这两个都是语言结构不是方法,与echo、print、isset()、empty()、unset()等类似都是语言结构不是函数!!!!!

2、include与require都是引入外部文件到当前上下文环境,但是他们有一些区别:

一、被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 include_path 指定的目录寻找。如果在 include_path 下没找到该文件则 include 最后才在调用脚本文件所在的目录和当前工作目录下寻找。如果最后仍未找到文件则 include 结构会发出一条警告;这一点和 require 不同,后者会发出一个致命错误。(在这点上include_once与require_once类似,但是他们在导入一个已导入的文件都会忽略,但是他们在引入文件时会判断是否引入会降低性能)

二、关于引入的文件:当一个文件被包含时,其中所包含的代码继承了 include、require 所在行的变量范围。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。不过所有在包含文件中定义的函数和类都具有全局作用域。

EG1:

vars.php

<?php

$color = 'green';

$fruit = 'apple';

?>

test.php

<?php

echo "A $color $fruit"; // A

include 'vars.php';

echo "A $color $fruit"; // A green apple

?>

如果 include 出现于调用文件中的一个函数里,则被调用的文件中所包含的所有代码将表现得如同它们是在该函数内部定义的一样。所以它将遵循该函数的变量范围。此规则的一个例外是魔术常量,它们是在发生包含之前就已被解析器处理的。

3、include返回值:

处理返回值:在失败时 include 返回 FALSE 并且发出警告。成功的包含则返回 1,除非在包含文件中另外给出了返回值。可以在被包括的文件中使用 return 语句来终止该文件中程序的执行并返回调用它的脚本。同样也可以从被包含的文件中返回值。可以像普通函数一样获得 include 调用的返回值。不过这在包含远程文件时却不行,除非远程文件的输出具有合法的 PHP 开始和结束标记(如同任何本地文件一样)。可以在标记内定义所需的变量,该变量在文件被包含的位置之后就可用了。因为 include 是一个特殊的语言结构,其参数不需要括号。在比较其返回值时要注意。

EG2:

<?php

// won't work, evaluated as include(('vars.php') == TRUE), i.e. include('')

if (include('vars.php') == TRUE) {

echo 'OK';

}

// works

if ((include 'vars.php') == TRUE) {

echo 'OK';

}

讲解:

$bar 的值为 1 是因为 include 成功运行了。注意以上例子中的区别。第一个在被包含的文件中用了 return 而另一个没有。如果文件不能被包含,则返回 FALSE 并发出一个 E_WARNING 警告。如果在包含文件中定义有函数,这些函数不管是在 return 之前还是之后定义的,都可以独立在主文件中使用。如果文件被包含两次,PHP 5 发出致命错误因为函数已经被定义,但是 PHP 4 不会对在 return 之后定义的函数报错。推荐用 include_once 而不是检查文件是否已包含并在包含文件中有条件返回.

3、include引入文件的处理:(这点很重要)

当一个文件被包含时,语法解析器在目标文件的开头脱离 PHP 模式并进入 HTML 模式,到文件结尾处恢复。由于此原因,目标文件中需要作为 PHP 代码执行的任何代码都必须被包括在有效的 PHP 起始和结束标记之中。并且当执行完成之后直接加入到缓冲区,将被导入的文件中的变量加入到当前的作用域变量链上。

EG3:

//t1.php 文件内容

1234<?php $name="PQS"; ?>5678<?php return 1; ?>9

//t2.php文件内容

<?php

include "t1.php";

echo $name;

//开始执行t2.php

会输出:12345678PQS

案例解析:

首先当include "t1.php";文件时PHP解析器脱离PHP模式进入HTML模式开始解析,因为HTML模式是将内容直接加入到缓冲区,所以没有标签1234会被首先加入到缓冲区,然后在执行<?php $name="PQS"; ?>这里就会把$name这个变量加入到t2.php的include "t1.php"这句代码的上线文变量作用域中。然后接着在回到HTM模式将5678加入到缓冲区,接下来遇到<?php return 1;?>就开始进入PHP模式进行执行代码,因为include是接受return的,所以当这里return 1之后整个文件的加载就到此处结束了, 返回到t2的代码执行域中了,这也是为什么最后没有输出9的原因。

举个例子证明PHP将文件输入到缓冲区:

//t3.php

1234567

//t4.php

<?php

$string = get_include_contents('t3.php');

function get_include_contents($filename) {

if (is_file($filename)) {

ob_start();

include $filename;

$contents = ob_get_contents();

ob_end_clean();

return $contents;

}

return false;

}

echo $string;

//执行t4.php

1234567

案例分析:

函数get_include_contents($filename)

在include之前开启缓冲区,当include将t3.php文件引入后就使用ob_get_contents()方法获取缓冲区数据赋值给$contents,然后使用ob_end_clean将缓冲区数据丢弃最后将$contents返回,最后输出返回值就是t3.php在经过php运行的值。

4、include支持引入URL:

如果“URL include wrappers”在 PHP 中被激活,可以用 URL(通过 HTTP 或者其它支持的封装协议——见支持的协议和封装协议)而不是本地文件来指定要被包含的文件。如果目标服务器将目标文件作为 PHP 代码解释,则可以用适用于 HTTP GET 的 URL 请求字符串来向被包括的文件传递变量。严格的说这和包含一个文件并继承父文件的变量空间并不是一回事;该脚本文件实际上已经在远程服务器上运行了,而本地脚本则包括了其结果。

<?php

/* This example assumes that www.example.com is configured to parse .php *

* files and not .txt files. Also, 'Works' here means that the variables *

* $foo and $bar are available within the included file. */

// Won't work; file.txt wasn't handled by www.example.com as PHP

include 'http://www.example.com/file.txt?foo=1&bar=2';

// Won't work; looks for a file named 'file.php?foo=1&bar=2' on the

// local filesystem.

include 'file.php?foo=1&bar=2';

// Works.

include 'http://www.example.com/file.php?foo=1&bar=2';

$foo = 1;

$bar = 2;

include 'file.txt'; // Works.

include 'file.php'; // Works.

此案例是PHP官网案例,如果不懂之处请移步值PHP官网include章节!

长文创作激励计划#

模板不仅仅是静态的HTML,在渲染的过程中经常包含着一部分变量。在Django中,通过一个类似字典的对象context,把所有模板中需要用到的变量从view传递到template。比如搜索结果列表和推荐列表显示样式和显示信息都一样,此种情况下,若模板根据不同变量显示不同数据的方式进行页面的渲染,则需要创建不同的模板进行显示,会做很多重复性的工作,并造成代码的冗余和结构的繁杂。在模板中使用变量的便利远不止此,例如还可以根据传递变量类型或者值得不同显示不同的样式和信息。

[!TIP]

与其它语言不同的是,在Django中,view中的变量不会自动在template中可用,必须通过view准确传递到template中,这样设计的目的是为了避免破坏模板的命名空间。

和其它语言PHP、Vue中的用法一样,Django的模板中的变量也是通过{{ }}进行表示,例如显示变量name:{{ name }}。即使变量中包含一些特殊字符(如:<),也不需要担心会影响显示结果,因为Django的也会自动避免将其以HTML的形式进行显示。

[!NOTE]

如果在模板中用到了没有传递的变量,Django只会在相应位置不做任何显示,而不会抛出异常。

示例:

1、以my_site项目为例,在Django应用myapp中创建templates文件夹,并在文件夹内创建welcome.html文件,其结构和内容如下:

示例结构

2、修改views.py文件,在其中添加welcome方法,其内容如下:

 from django.http import HttpResponse
 from django.shortcuts import render
 
 
 # Create your views here.
 def welcome(request):
     name="World"
     return render(request, "welcome.html" ,{"name":name})

3、在myapp中的urls.py进行配置,其内容如下:

 from django.contrib import admin
 from django.urls import path
 from .views import welcome
 
 urlpatterns = [
     path('welcome/', welcome, name="welcome"),
 ]

4、修改my_site项目的urls.py文件,引用myapp中的urls.py,其内容如下:

 from django.contrib import admin
 from django.urls import path, include
 
 urlpatterns = [
     path('admin/', admin.site.urls),
     path("", include("myapp.urls")),
 ]

5、通过python manage.py runserver命令运行项目,其显示如下:

示例效果图



该文章作为学习笔记进行分享和记录,如有错误或其它观点,请多多指教!!!

会创建一个 SEO 友好的 URL 只需要几分钟,但学会之后的好处,远不只有一个。

一个 SEO 友好的 URL 要易于理解和记忆,能提高用户点击或分享的机会,也能提高网站的可见性;当你在 URL 中添加了关键词,还能帮助搜索引擎去了解该页面的主题,有利于搜索排名。

在《外贸独立站域名挑选指南【2023】 | 慢慢来数字营销》一文中,我们提到了 URL(uniform resource locator)与域名之间的关系,域名是URL的组成部分。在《外贸谷歌SEO入门:长文+思维导图 | 慢慢来数字营销》这篇文章里也简单介绍了站内SEO的 On-Page SEO 包含很多要素,其中一个就是 URL 。

来源:SERanking

SEO 友好的 URL 能帮助网页获得一个良好的排名。什么样算 SEO 友好的 URL 呢?其实很简单,就是对用户友好的,能提高用户体验的 URL 。

URL 真能有这么大的帮助吗?谷歌真的看重 URL 吗?

谷歌还是很在乎的,毕竟 SEO入门指南还专门给了 URL 一个板块:

既然这么重要,对用户友好的,能提高用户体验的 URL 怎么创建呢?

一、URL 的组成

URL(uniform resource locator,统一资源定位符),是用于在互联网上定位资源的唯一标识符,指向特定网站、网页或文档,就是我们俗称的网页地址。

URL 由很多部分组成,一个简单的示例 URL 拆解如图:

来源:ahrefs

  • Protocol :协议,如 https:// ,用于在客户端和服务器之间传输数据的协议。
  • Subdomain :是由 URL 第一个 . 之前的任何单词或短语组成。每个子域名通常被认为是一个单独的网站,位于主域名(如 example.com )之外。
  • Domain :域名,这个就不多说了,详情可看《外贸独立站域名挑选指南【2023】 | 慢慢来数字营销》
  • Top-LevelDomain(TLD) :顶级域名,就是咱们之前提到的域名后缀,如 .com
  • Subfolder :子文件夹,也被称为子目录(Subdirectory),是主域名(如 example.com )里的一个文件夹,相当于网站里的一个页面,可用于按主题组织内容。
  • Slug :URL 最后的部分,用作页面的唯一标识符,是包含该个网页内容关键词的地方,也是我们创建 SEO 友好的 URL 中最重要的部分。

二、如何创建 SEO 友好的 URL ?

虽然创建 SEO 友好的 URL 很有必要,但不建议大家去对现有的 URL 进行大幅度的改动,我们应该专注于接下来每一个新的博客、新的网页的 URL。

1、slug 部分的优化

前文提到了 Slug 的重要性,作为 URL 里关键的一部分,也是包含该个网页内容关键词的地方。

虽然近几年也有一种说法:在 URL 里包含关键词对排名的影响并不大。谷歌的 John Mueller 多次对此进行声明:

  • 2016年,他分享到:“I believe that’s a very small ranking factor, so it’s not something I’d really try to force. And it’s not something where I’d say it’s even worth your effort to kind of restructure your site just so you can include keywords in the URL.”(我相信这只是一个很小的排名因素,所以我不会强求。我也不会说,为了在 URL 中包含关键词而调整网站结构是值得的。)
  • 2017年,他在解答“关于 URL 中包含关键词”的问题时,也再次强调:URL 包含关键词对排名的影响只是一个很小的因素。

  • 2018 年,他继续淡化 URL 中的关键词作为排名因素的影响。

那是不是在“URL 中包含关键词”是一个没必要去优化的因素呢?

首先,谷歌官方肯定了做好 URL 的优化是有用的,虽然是一个很小的因素,但是我们要做好这个细节只需要花几秒钟,毕竟 SEO 就是由无数个优秀的小细节组成的。

这点,谷歌的 Matt Cutts 在一个视频中也有提到:

在视频中,Matt Cutts 也提到了一个清晰简洁的 URL 对提高用户体验的重要性,视频里着重强调了用户体验。

其实,这也提醒我们,在优化 URL 的 Slug 部分时,简洁有重点(关键词)才是我们应该做的。

优化 Slug 可以从这几方面入手:

  • 提取关键词。以我们写一篇博客为例,在设置这篇博客的 URL 时,可以先从标题入手,一般标题都是对内容的高度概括。比如有一篇博客,标题是:10 Best Robot Mops of 2023, According to Cleaning Experts 那么 URL 的 Slug 可以设置为:/best-robot-mops
  • 选择简单的描述性词语,不需要太长。以 10 Best Robot Mops of 2023, According to Cleaning Experts 为例,有朋友可能会说,为了更好被抓取,我把整个标题都放上去:/10-best-robot-mops-of-2023-according-to-cleaning-experts 首先,还是要强调一个用户体验,太长的 Slug 给用户的观感并不好,而且在谷歌搜索结果界面也不会显示完整。

Slug 不要太长,其实也等同于 URL 不要设置得太长,越短的 URL ,谷歌搜索引擎更容易索引到网页的主题。Backlinko 做过一个实验发现, URL 越长,在谷歌上的排名越下降

来源:Backlinko

  • 字母要小写。虽然现在大部分的服务器对 URL 中的大小写都是一样的处理方式,但并不是所有服务器都是这样的,在有些服务器上,如果你的 URL 使用了大写字母,可能会导致重定向或 404 错误。如果你的网站是使用 WordPress ,那就不用担心,它会自动变成小写。
  • 不要使用特殊的字符或表情符号。比如 () [] 。谷歌搜索中心提到了,不要使用非 ASCII(American Standard Code for Information Interchange ,美国信息交换标准代码)标准的字符。

  • 用连字符 - 而不是下划线 _ 。连字符是用于分隔 URL 中单词的标准方式,也是谷歌官方推荐的方式:

  • 尽量避免使用数字。例如 10 Best Robot Mops ,当你在 URL 中加入数字,比如 10 ,一旦你要修改文章里面的数字,将 10 改为 7 ,那你也相应要调整 URL ,这当然也没什么问题,但如果忘记修改 URL 上的数字,确实也会出现一个尴尬的场面。再者,URL 也没必要因为这个原因而经常调整,频繁修改,谷歌也需要再次重新适应的。
  • 不建议使用 SEO stop words 。SEO stop words 可以理解为那些能帮助我们将关键词形成连贯句子的词语,基本上都是一些代词、冠词、介词和连词。这些词虽然对于我们形成一句连贯的句子很有帮助,但并不适合放在 URL 上,因为它们本身并没有什么特别的意义,反而容易让 URL 变得更长。常见的 SEO stop words 有:

来源:hubspot

  • 保证可读性。这一点还是我们一直强调的用户体验,可读性高的 URL ,用户理解起来更容易。

2、选择一个好的域名和顶级域名(后缀)

域名、顶级域名(后缀)对于SEO的影响这一点我们在《外贸独立站域名挑选指南【2023】 | 慢慢来数字营销》一文中已经讲解的很详细,这里也不再赘述。

谷歌表示:如果你的网站是多区域网站,建议考虑使用一种便于对网站进行地理位置定位的网址结构。

3、HTTPS 协议

HTTP 和 HTTPS 的区别咱们之前也聊到过,这点可以着重看看这篇文章:《5分钟教你搞定HTTPS!(附免费SSL证书申请流程) | 慢慢来数字营销》:

  • HTTP 是一种无加密的协议,在整个数据传输过程中是不提供数据的加密和安全性,网站容易被攻击,数据也更容易被窃取。
  • HTTPS 是基于HTTP的安全协议,它使用了 SSL 或 TLS 协议来对数据进行加密和认证,提供了更高的安全性和隐私保护。

来源:neilpatel 博客

而作为 URL 的一部分,HTTPS 也是谷歌衡量排名的一个因素:

4、子文件夹 > 子域名

外贸独立站不要使用子域名!

外贸独立站不要使用子域名!!

外贸独立站不要使用子域名!!!

重要的事情应该多说几遍。开头咱们就提到,子域名是位于主域名之外的,被认为是一个单独的网站;而子文件夹(相当于子目录)其实就等于是网站里的一个页面,是网站的一部分。举个例子:

子文件夹:mmldigi.com/blog/

子域名:blog.mmldigi.com

mmldigi.com/blog/是mmldigi.com 的一部分,但 blog.mmldigi.com 是独立于 mmldigi.com 之外的。这就意味着谷歌在对 mmldigi.com 这个主域进行排名的时候,是不会考虑 blog.mmldigi.com 上面的内容的,但 mmldigi.com/blog/ 就不会有这样的情况。

谷歌官方有个对外说法:

但现实的情况是,有很多从事 SEO 方面工作的人表示:呵呵!

GetCredo 的创始人 Jonn Doherty 曾在社交媒体上表示:

从事相关工作的 Craig Emerson 也专门做过研究,表示:

我只需将子域名改为子目录,就能从前列 100 名开外的某处(我知道我甚至没有进入前 200 名)跃升至 SERP 排名第 57 位。与我的网站相关的其他一切都保持不变。

当然,子文件夹(子目录)也并非是绝对的选择,比如一些大型的电子商务网站,也有因为技术原因而无法选择子文件夹的情况。

不过对于做外贸独立站的朋友们来讲,我们上千个独立站项目的切身经历得出来的结论就是:外贸独立站不要使用子域名!

我们曾经有个项目,客户因为考虑到公司的目标市场情况,坚持选择子域名,但结果就是,同等的资源倾斜上去,表现真的还不如 .www 。虽然后面网站问题顺利解决了,但是这期间的损失还是很可惜的。

还有一点是,选择子文件夹的话,大家要注意子文件夹的关键词不要跟 Slug 重复。重复的关键词没有必要且影响用户观感。

5、避免使用日期

这跟前面提到不要有数字很相似。避免使用日期有两个原因:

  • 一个是选择日期会让整个 URL 更长
  • 一点是选择日期对于更新不利,谷歌更喜欢新鲜、持续更新的内容。例如你在2022年更新了一篇文章:10 Best Robot Mops of 2022,但是你今年对这篇内容进行调整,甚至标题都进行了修改:10 Best Robot Mops of 2023 ,但如果你当初已经在 URL 中加入了日期且没修改,很容易使人混乱,而且相对于旧的内容,新鲜、持续更新的内容更受谷歌青睐。再说了想全面对此进行修改,也会把整个网站的 URL 弄得更加混乱,改起来也很麻烦。

6、不要轻易修改 URL

这个其实很好解释:

URL 对于 SEO 很有帮助,但这并不代表我们只要搞定了 URL 就是做好了 SEO 的优化,SEO 优化涉及的内容很多,只有方方面面都做到细致,才能让网站有更好的排名。