在Windows上部署Laravel项⽬
Laravel 框架中需要部署 PHP Web、队列、任务调度三部分功能,官⽅⽂档中只有 Linux 下的部署说明。虽然 Linux 纯 CLI 看起来更⾼⼤上,不过 Windows 也是⼀种解决⽅案。
PHP Web
参考 完成运⾏环境配置。
在 Laravel 项⽬ public ⽬录下已经存在⼀个⽤于 IIS 部署的 fig ⽂件,内容是 Url Rewrite 规则:
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Imported Rule 1" stopProcessing="true">
<match url="^(.*)/$" ignoreCase="false" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
</conditions>
<action type="Redirect" redirectType="Permanent" url="/{R:1}" />
</rule>
<rule name="Imported Rule 2" stopProcessing="true">
<match url="^" ignoreCase="false" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
</conditions>
<action type="Rewrite" url="index.php" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
复制代码
添加 IIS 站点时,站点物理路径需要指向到 public ⽬录下。⼀般情况下,站点其他相关配置会从根配置⽂件继承,⽐如 FastCGI 相关配置。同时运⾏多个站点需要为站点绑定域名,否则只能有⼀个站点使⽤ 80 端⼝。
跨域控制
关于 Web 跨域可以阅读 MDN 的⽂档进⼀步了解——。t通过添加特定的响应头来控制 Web 浏览器的跨域限制,IIS 可以在 HTTP 响应标头 来设置相应的响应头。
HTTP 响应标头 可以在 IIS 管理器中作为全局设置,也可以针对站点设置。如果针对站点配置,那么会修改站点物理路径下的 fig ⽂件。
设置完后,可以看到 fig 中 rewrite 节点后⾯增加了 httpProtocol 节点。
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="example" />
</customHeaders>
</httpProtocol>
复制代码
其他配置项也是类似,推荐的做法是将变更后的 fig ⽂件签⼊版本控制系统进⾏管理。
需要注意,这⾥配置是全部 URL 都会⽣效,如果需要针对特定 URL 路径需要⼿动添加以下内容到<configuration> 节点:
<location path="api">
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="example" />
</customHeaders>
</httpProtocol>
</system.webServer>
</location>
复制代码
如果需要更详细的 CORS 控制需要安装 ,参考 进⾏配置。
当然,在 PHP 代码中控制会更加灵活。
客户端缓存
Web 客户端缓存主要通过 Cache-Control、ETag、Last-Modified 响应头控制,关于 HTTP 缓存可以查看 MDN ⽂档了解更多 。
这⾥的客户端缓存控制主要是针对静态资源,动态资源可以在代码中进⾏控制。符合 HTTP 协议的客户端,包括浏览器,还有 APP 开发中使⽤的 HTTP 请求库,默认情况下都会按照 HTTP 协议约定进⾏缓存。
默认情况下,IIS 对静态资源请求的响应头中就包含 Etag 与 Last-Modified。可以在 HTTP 响应标头 中通过 设置常⽤标头 选项进⾏配置Cache-Control,响应头如下:
HTTP/1.1 200 OK
Cache-Control: max-age=86400
Content-Type: application/javascript
Content-Encoding: gzip
Last-Modified: Fri, 11 Jan 2019 15:06:10 GMT
Accept-Ranges: bytes
ETag: "05d6b2fbfa9d41:0"
Vary: Accept-Encoding
Date: Sat, 12 Jan 2019 17:26:08 GMT
Content-Length: 112411
复制代码
如果是在站点操作完成之后同样会在项⽬ public ⽬录下的 fig 中添加相关节点:
<staticContent>
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="1.00:00:00" />
</staticContent>
复制代码
如果需要按⽬录控制,⼿动添加以下内容到<configuration> 节点:
<location path="favicon.ico">
<system.webServer>
<staticContent>
<clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />
</staticContent>
</system.webServer>
</location>
复制代码
更多关于 <staticContent> 参数可以查看官⽅⽂档 。
SQL Server
如果说有什么原因⼀定要在 Windows 上部署 PHP Web 项⽬,那么 SQL Server ⼀定是个很常见的原因。
PHP 访问 SQL Server 数据库需要安装两个数据库驱动程序:
Microsoft Drivers for PHP for SQL Server
Microsoft ODBC Driver for SQL Server
影响因素包括以上两个驱动的版本、SQL Server 版本、PHP 版本以及 Windows 版本。详细的对应关系可以通过官⽅⽂档 查看。
以 Laravel 5.7 版本的需求 PHP >= 7.1.3 为例:
Microsoft Drivers for PHP for SQL Server 5.3/5.2
Microsoft ODBC Driver for SQL Server 17+/13.1/11
SQL Server 2008 R2 ~ SQL Server 2017
Windows 10 、Windows Server 2012 ~ Windows Server 2016
如何运行php项目总结:开发环境只能选择 Windows 10,⽣产环境最低要选择 Window Server 2012。
安装 Microsoft Drivers for PHP for SQL Server 5.3 与 Microsoft ODBC Driver for SQL Server 17+,配置好 PHP 的扩展之后,可以访问 SQL Server 2008 R2 ~ SQL Server 2017 版本的数据库。
队列
官⽅⽂档中部署队列的⽅式是使⽤ Supervisor, Linux 上也可以使⽤ systemd 来部署。Windows 上采⽤同样的思路,将队列运⾏作为系统服务运⾏,需要⽤到 。
将下载好的 路径添加到系统 Path 变量中之后,在命令⾏中使⽤ nssm install <servicename> 会打开 GUI 界⾯配置。
Path 推荐填写完整的 路径,Startup directory 是启动⽬录,填写项⽬根⽬录,Arguments 运⾏参数 artisan queue:work sqs --sleep=3 --tries=3。
其他需要注意的是 Log on 服务以何⽤户运⾏,涉及到权限、环境变量、认证,⼀般情况保持 Local System account 即可。如果使⽤指定⽤户,⽤户密码失效或改变时,会造成服务⽆法启动。
任务调度
任务调度与队列的区别在于执⾏周期不同,官⽅⽂档中任务调度的部署⽅式是使⽤ crontab 以分钟为周期调⽤单⼀任务⼊⼝,Windows 上通过计划任务可以实现相同的⽬的。
打开计划任务程序,创建任务。触发器选择 按预定计划、⼀次,但是时间要调整为已经过去的时间。重复任务间隔设置为 1 分钟,持续期限 设置为 ⽆期限。
操作中配置程序填写 的完整路径。起始于 配置为 Laravel 项⽬路径,参数填写 artisan schedule:run。
在设置中勾选 如果过了计划开始时间,⽴即启动任务,去掉 如果请求后任务还在运⾏,强⾏将其停⽌,最后选择 请勿启动新实例。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。