在 Windows 上部署 Laravel 項目

Laravel 框架中須要部署 PHP Web、隊列、任務調度三部分功能,官方文檔中只有 Linux 下的部署說明。雖然 Linux 純 CLI 看起來更高大上,不過 Windows 也是一種解決方案。javascript

PHP Web

參考 在 Windows 上使用 IIS 部署 PHP 項目 完成運行環境配置。php

在 Laravel 項目 public 目錄下已經存在一個用於 IIS 部署的 web.config 文件,內容是 Url Rewrite 規則:java

<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

跨域控制

關於 Web 跨域能夠閱讀 MDN 的文檔進一步瞭解——HTTP訪問控制(CORS) 。t經過添加特定的響應頭來控制 Web 瀏覽器的跨域限制,IIS 能夠在 HTTP 響應標頭 來設置相應的響應頭。sql

HTTP 響應標頭 能夠在 IIS 管理器中做爲全局設置,也能夠針對站點設置。若是針對站點配置,那麼會修改站點物理路徑下的 web.config 文件。數據庫

設置完後,能夠看到 web.configrewrite 節點後面增長了 httpProtocol 節點。api

<httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="example.com" />
    </customHeaders>
</httpProtocol>
複製代碼

其餘配置項也是相似,推薦的作法是將變動後的 web.config 文件簽入版本控制系統進行管理。跨域

須要注意,這裏配置是所有 URL 都會生效,若是須要針對特定 URL 路徑須要手動添加如下內容到<configuration> 節點:瀏覽器

<location path="api">
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Access-Control-Allow-Origin" value="example.com" />
            </customHeaders>
        </httpProtocol>
    </system.webServer>
</location>
複製代碼

若是須要更詳細的 CORS 控制須要安裝 IIS CORS Module,參考 IIS CORS module Configuration Reference | Microsoft Docs 進行配置。緩存

固然,在 PHP 代碼中控制會更加靈活。

客戶端緩存

Web 客戶端緩存主要經過 Cache-ControlETagLast-Modified 響應頭控制,關於 HTTP 緩存能夠查看 MDN 文檔瞭解更多 developer.mozilla.org/zh-CN/docs/…

這裏的客戶端緩存控制主要是針對靜態資源,動態資源能夠在代碼中進行控制。符合 HTTP 協議的客戶端,包括瀏覽器,還有 APP 開發中使用的 HTTP 請求庫,默認狀況下都會按照 HTTP 協議約定進行緩存。

默認狀況下,IIS 對靜態資源請求的響應頭中就包含 EtagLast-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 目錄下的 web.config 中添加相關節點:

<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> 參數能夠查看官方文檔 Client Cache | Microsoft Docs

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 版本。詳細的對應關係能夠經過官方文檔 System Requirements for the Microsoft Drivers for PHP for SQL Server - SQL Server | Microsoft Docs 查看。

以 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

總結:開發環境只能選擇 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 上採用一樣的思路,將隊列運行做爲系統服務運行,須要用到 NSSM - the Non-Sucking Service Manager

將下載好的 nssm.exe 路徑添加到系統 Path 變量中以後,在命令行中使用 nssm install <servicename> 會打開 GUI 界面配置。

Path 推薦填寫完整的 php.exe 路徑,Startup directory 是啓動目錄,填寫項目根目錄,Arguments 運行參數 artisan queue:work sqs --sleep=3 --tries=3

其餘須要注意的是 Log on 服務以何用戶運行,涉及到權限、環境變量、認證,通常狀況保持 Local System account 便可。若是使用指定用戶,用戶密碼失效或改變時,會形成服務沒法啓動。

任務調度

任務調度與隊列的區別在於執行週期不一樣,官方文檔中任務調度的部署方式是使用 crontab 以分鐘爲週期調用單一任務入口,Windows 上經過計劃任務能夠實現相同的目的。

打開計劃任務程序,建立任務。觸發器選擇 按預約計劃一次,可是時間要調整爲已通過去的時間。重複任務間隔設置爲 1 分鐘,持續期限 設置爲 無期限

操做中配置程序填寫 PHP.exe 的完整路徑。起始於 配置爲 Laravel 項目路徑,參數填寫 artisan schedule:run

在設置中勾選 若是過了計劃開始時間,當即啓動任務,去掉 若是請求後任務還在運行,強行將其中止,最後選擇 請勿啓動新實例

相關文章
相關標籤/搜索