如何在Windows環(huán)境下使用IIS部署PHP框架ThinkPHP5
前言
博主今天抽空幫朋友部署一個(gè)PHP網(wǎng)站,平時(shí)接觸php的機(jī)會(huì)很少,之前也寫過一篇文章
介紹如果在IIS在部署PHP。
博主通過會(huì)看那篇文章發(fā)現(xiàn),后續(xù)的版本有點(diǎn)不一樣了,所以,再次寫篇文章記錄下。
代碼分析
現(xiàn)在有AI實(shí)在是太方便了,特別是很久沒接觸過php,已經(jīng)忘記在那些地方查看數(shù)據(jù)庫以及
當(dāng)前代碼用的是php那個(gè)版本,以及用的ThinkPHP框架又是那個(gè)版本。
為什么說要看版本呢,因?yàn)椴煌陌姹荆a庫還是會(huì)有差異,版本使用不對(duì),可能就會(huì)報(bào)錯(cuò)運(yùn)行不起來。
數(shù)據(jù)庫
首先要看下是用的什么數(shù)據(jù)庫,這個(gè)好判斷,大概能猜到,php一般都是用mysql。
讓AI進(jìn)行掃描分析下代碼,數(shù)據(jù)庫的命名以及賬號(hào)密碼,確保運(yùn)行時(shí)一致。
知道數(shù)據(jù)庫名稱后,就可以在mysql上先創(chuàng)建一個(gè)數(shù)據(jù)庫,然后執(zhí)行sql語句創(chuàng)建表和數(shù)據(jù)。

MYSQL歷史版本下載地址:https://downloads.mysql.com/archives/community/

php版本
通過AI分析后,知道了PHP版本是在5.4.0+,這就好辦了,用太低或者用太高版本都可能有問題。
用接近的或者使用一個(gè)穩(wěn)定性和兼容性好的一個(gè)版本。

ThinkPHP
通過上一步AI已經(jīng)知道是基于ThinkPHP框架開發(fā)的,進(jìn)一步確認(rèn)下是框架那個(gè)版本。
當(dāng)前代碼使用的是ThinkPHP5.0.24,對(duì)應(yīng)php版本要求是>=5.4.0。

版本兼容
進(jìn)一步詢問AI是否兼容php最新版本的8.0+。
雖然AI只是給出了建議性,但是可以作為參考,優(yōu)先使用穩(wěn)定版本比較好。

PHP安裝
它是一種廣泛使用的開源通用腳本語言,特別適用于Web開發(fā)。PHP以其簡潔的語法和易于學(xué)習(xí)的特性而受到開發(fā)者的喜愛。它的特點(diǎn)是跨平臺(tái)、開源、簡單易學(xué)、靈活的框架、強(qiáng)大的數(shù)據(jù)庫支持、內(nèi)置服務(wù)器功能等。

下載地址
歷史版本:https://www.php.net/releases/

格式說明:
- .tar.gz - 最常見的壓縮格式,幾乎所有系統(tǒng)都支持解壓。
- .tar.bz2 - 壓縮率通常比
.gz更高,文件稍小,解壓稍慢。大部分主流工具也支持。 - .tar.xz - 壓縮率最高,文件最小,但解壓需要更多內(nèi)存和CPU時(shí)間。
選擇建議:
- 如果您不確定,直接點(diǎn)擊
PHP 7.4.33 (tar.gz)這個(gè)鏈接下載。這是最通用、最不容易出問題的選擇。 - 如果您很在意下載文件的大小,可以選擇
.tar.xz。 - 下載后,您需要對(duì)應(yīng)的解壓工具來解壓(如 Windows 上的 7-Zip,或 Linux/macOS 上的命令行工具)。
PHP CGI
但是這里我們不使用上面的壓縮文件,由于博主是在windows下部署php,
所以,直接下載NTS版本(包含php-cgi.exe)
64位:https://windows.php.net/downloads/releases/archives/php-7.4.33-nts-Win32-vc15-x64.zip
https://windows.php.net/downloads/releases/archives/


解壓
php是綠色版本,不需要運(yùn)行安裝,直接解壓即可,并創(chuàng)建一個(gè)php目錄存放解壓文件,并配置一些信息。

配置

將PHP根目錄下的php.ini-production復(fù)制一份并改名為 php.ini,并進(jìn)行如下設(shè)置:
設(shè)置路徑
找到extension_dir,并將前面的分號(hào)去掉(啟用),并復(fù)制php配置具體路徑,如下:

; http://php.net/extension-dir extension_dir = "C:\web\php\php-7.4.33-nts-Win32-vc15-x64\ext"
設(shè)置擴(kuò)展
extension=bz2 extension=curl ;extension=ffi ;extension=ftp extension=fileinfo extension=gd2 extension=gettext ;extension=gmp ;extension=intl ;extension=imap ;extension=ldap extension=mbstring extension=exif ; Must be after mbstring as it depends on it extension=mysqli ;extension=oci8_12c ; Use with Oracle Database 12c Instant Client ;extension=odbc extension=openssl ;extension=pdo_firebird extension=pdo_mysql ;extension=pdo_oci extension=pdo_odbc extension=pdo_pgsql extension=pdo_sqlite extension=pgsql ;extension=shmop
其他設(shè)置
設(shè)置時(shí)區(qū)date.timezone=Asia/Beijing
設(shè)置ssl=cacert.pem
開啟php短標(biāo)簽short_open_tag=on
以CGI模式運(yùn)行PHP cgi.force_redirect = 0
開啟IIS的FastCGI托管
fastcgi.impersonate = 1
cgi.rfc2616_headers = 1
PHP部署

添加角色
如果是首次配置的IIS環(huán)境,需要添加角色以及CGI等應(yīng)用,此處略過。


處理程序映射
點(diǎn)擊處理程序映射,再點(diǎn)添加模塊映射,彈窗填寫信息

請求路徑:*.php 模塊選擇:FastCgiModel 可執(zhí)行文件:php-cgi.exe(解壓文件里找) 名稱:phpcgi(自己自定義命名)
增加默認(rèn)文件
添加默認(rèn)文件,目的是訪問首頁不用輸入具體php文件名就能夠自動(dòng)訪問默認(rèn)的index.php文件。


PHP運(yùn)行
常見報(bào)錯(cuò)
缺少VC運(yùn)行庫:
下載安裝:https://aka.ms/vs/16/release/vc_redist.x64.exe

5.5對(duì)應(yīng)的是VC++2012

綠色版本
這里博主以mysql-5.7.44-winx64綠色版本為例子
文件結(jié)構(gòu)
D:\mysql-5.7.44-winx64\ ├── bin\ # 可執(zhí)行文件 ├── docs\ # 文檔 ├── include\ # 頭文件 ├── lib\ # 庫文件 ├── share\ # 共享文件 ├── LICENSE # 許可證 └── README # 說明文件
一鍵啟動(dòng)
創(chuàng)建 start_mysql.bat,附上下面內(nèi)容運(yùn)行即可開啟服務(wù),并且會(huì)自動(dòng)創(chuàng)建my.ini文件
@echo off
chcp 65001 > nul
title MySQL 5.7.44 綠色版啟動(dòng)器
setlocal enabledelayedexpansion
echo ========================================
echo MySQL 5.7.44 綠色版啟動(dòng)程序
echo ========================================
echo.
REM 設(shè)置MySQL根目錄(當(dāng)前目錄)
set "MYSQL_DIR=%~dp0"
set "MYSQL_DIR=%MYSQL_DIR:~0,-1%"
echo MySQL目錄:%MYSQL_DIR%
echo.
REM 檢查必要的文件
if not exist "%MYSQL_DIR%\bin\mysqld.exe" (
echo ? 錯(cuò)誤:未找到 mysqld.exe
pause
exit /b 1
)
REM 檢查是否已安裝服務(wù)
sc query MySQL57 >nul 2>&1
if !errorlevel! equ 0 (
echo [1/4] ? MySQL57服務(wù)已存在
goto :START_SERVICE
)
echo [1/4] 準(zhǔn)備安裝MySQL57服務(wù)...
REM 1. 創(chuàng)建必要的目錄
if not exist "%MYSQL_DIR%\data" mkdir "%MYSQL_DIR%\data"
if not exist "%MYSQL_DIR%\logs" mkdir "%MYSQL_DIR%\logs"
REM 2. 創(chuàng)建my.ini配置文件
echo [2/4] 創(chuàng)建配置文件...
(
echo [mysqld]
echo # MySQL安裝目錄
echo basedir=%MYSQL_DIR:\=/%
echo # MySQL數(shù)據(jù)目錄
echo datadir=%MYSQL_DIR:\=/%/data
echo # 端口
echo port=3306
echo # 字符集(使用utf8避免兼容問題)
echo character-set-server=utf8
echo collation-server=utf8_general_ci
echo # 最大連接數(shù)
echo max_connections=200
echo # 存儲(chǔ)引擎
echo default-storage-engine=INNODB
echo # Windows下不區(qū)分表名大小寫
echo lower_case_table_names=1
echo # 日志
echo log-error=%MYSQL_DIR:\=/%/logs/mysql_error.log
echo general_log_file=%MYSQL_DIR:\=/%/logs/mysql_general.log
echo # 跳過密碼驗(yàn)證(第一次安裝后可以注釋掉)
echo # skip-grant-tables
echo.
echo [client]
echo default-character-set=utf8
echo port=3306
echo.
echo [mysql]
echo default-character-set=utf8
) > "%MYSQL_DIR%\my.ini"
REM 3. 初始化MySQL
echo [3/4] 初始化MySQL數(shù)據(jù)庫...
cd /d "%MYSQL_DIR%"
bin\mysqld --initialize-insecure --user=mysql --console
if !errorlevel! neq 0 (
echo ?? 初始化可能已存在,繼續(xù)安裝...
)
REM 4. 安裝Windows服務(wù)
echo [4/4] 安裝MySQL服務(wù)...
bin\mysqld --install MySQL57 --defaults-file="%MYSQL_DIR%\my.ini"
if !errorlevel! neq 0 (
echo ?? 服務(wù)安裝失敗,可能已存在
)
:START_SERVICE
echo.
echo 啟動(dòng)MySQL服務(wù)...
net start MySQL57
if !errorlevel! equ 0 (
echo ? MySQL 5.7.44 啟動(dòng)成功!
echo.
echo ========================================
echo 連接信息:
echo 用戶名:root
echo 密碼:(無,首次登錄請直接回車)
echo 端口:3306
echo.
echo 連接命令:
echo %MYSQL_DIR%\bin\mysql -u root
echo.
echo 修改密碼命令(在MySQL中執(zhí)行):
echo ALTER USER 'root'@'localhost' IDENTIFIED BY '你的密碼';
echo FLUSH PRIVILEGES;
echo ========================================
) else (
echo ? 服務(wù)啟動(dòng)失敗
echo 請查看日志:%MYSQL_DIR%\logs\mysql_error.log
)
echo.
echo 是否現(xiàn)在打開MySQL命令行?(Y/N)
set /p choice=
if /i "!choice!"=="y" (
start "%MYSQL_DIR%\bin\mysql.exe" -u root
)
pause


停止服務(wù)
創(chuàng)建 stop_mysql.bat,附上下面內(nèi)容運(yùn)行即可停止服務(wù)
@echo off
chcp 65001 > nul
echo 正在停止MySQL 5.7.44...
net stop MySQL57
if %errorlevel% equ 0 (
echo ? MySQL已停止
) else (
echo ?? 服務(wù)未運(yùn)行或停止失敗
)
pause
卸載服務(wù)
創(chuàng)建uninstall_mysql.bat,附上下面內(nèi)容
@echo off
chcp 65001 > nul
echo ========================================
echo 卸載 MySQL 5.7.44 服務(wù)
echo ========================================
echo.
echo 正在停止MySQL服務(wù)...
net stop MySQL57 >nul 2>&1
echo 正在刪除MySQL服務(wù)...
sc delete MySQL57 >nul 2>&1
if %errorlevel% equ 0 (
echo ? 服務(wù)刪除成功
) else (
echo ?? 服務(wù)不存在或刪除失敗
)
echo.
echo 是否刪除數(shù)據(jù)文件?(Y/N)
echo 警告:這將刪除所有數(shù)據(jù)庫數(shù)據(jù)!
set /p choice=
if /i "%choice%"=="y" (
rmdir /s /q "%~dp0data" 2>nul
rmdir /s /q "%~dp0logs" 2>nul
del "%~dp0my.ini" 2>nul
echo ? 數(shù)據(jù)文件已刪除
)
echo.
echo 卸載完成!
pause
測試鏈接
創(chuàng)建 test_mysql.bat(測試連接)
@echo off
chcp 65001 > nul
echo 測試MySQL連接...
cd /d "%~dp0"
if exist "bin\mysql.exe" (
bin\mysql -u root -e "SELECT VERSION() as MySQL版本;" 2>nul
if %errorlevel% equ 0 (
echo ? MySQL連接成功!
bin\mysql -u root -e "SHOW DATABASES;"
) else (
echo ? MySQL連接失敗
)
) else (
echo ? 未找到mysql.exe
)
pause

設(shè)置賬號(hào)
@echo off
chcp 65001 > nul
title MySQL 5.7.44 一鍵配置工具
setlocal enabledelayedexpansion
echo ========================================
echo MySQL 5.7.44 一鍵配置工具
echo 自動(dòng)創(chuàng)建test用戶并開啟遠(yuǎn)程訪問
echo ========================================
echo.
REM 設(shè)置MySQL根目錄
set "MYSQL_DIR=%~dp0"
set "MYSQL_DIR=%MYSQL_DIR:~0,-1%"
echo MySQL目錄:%MYSQL_DIR%
echo.
REM 檢查必要的文件
if not exist "%MYSQL_DIR%\bin\mysqld.exe" (
echo ? 錯(cuò)誤:未找到 mysqld.exe
echo 請將此腳本放在MySQL根目錄下運(yùn)行
pause
exit /b 1
)
echo [1/7] 檢查MySQL服務(wù)狀態(tài)...
sc query MySQL57 >nul 2>&1
if !errorlevel! equ 0 (
echo ? MySQL57服務(wù)已存在
goto :CHECK_RUNNING
)
echo ?? MySQL57服務(wù)不存在,開始安裝...
REM 1. 創(chuàng)建必要的目錄
echo [2/7] 創(chuàng)建目錄結(jié)構(gòu)...
if not exist "%MYSQL_DIR%\data" mkdir "%MYSQL_DIR%\data"
if not exist "%MYSQL_DIR%\logs" mkdir "%MYSQL_DIR%\logs"
REM 2. 創(chuàng)建my.ini配置文件(支持遠(yuǎn)程訪問)
echo [3/7] 創(chuàng)建配置文件...
(
echo [mysqld]
echo # 基礎(chǔ)配置
echo basedir=%MYSQL_DIR:\=/%
echo datadir=%MYSQL_DIR:\=/%/data
echo port=3306
echo character-set-server=utf8
echo collation-server=utf8_general_ci
echo max_connections=1000
echo default-storage-engine=INNODB
echo lower_case_table_names=1
echo log-error=%MYSQL_DIR:\=/%/logs/mysql_error.log
echo.
echo # 遠(yuǎn)程訪問配置(關(guān)鍵?。?
echo bind-address=0.0.0.0
echo skip-name-resolve
echo wait_timeout=600
echo interactive_timeout=600
echo.
echo [client]
echo default-character-set=utf8
echo port=3306
echo.
echo [mysql]
echo default-character-set=utf8
) > "%MYSQL_DIR%\my.ini"
REM 3. 初始化MySQL(無密碼)
echo [4/7] 初始化MySQL數(shù)據(jù)庫...
cd /d "%MYSQL_DIR%"
echo 正在初始化,請稍候...
bin\mysqld --initialize-insecure --user=mysql --console >nul 2>&1
if exist "%MYSQL_DIR%\data\*.err" (
echo ? 初始化完成
) else (
echo ?? 初始化可能已存在
)
REM 4. 安裝Windows服務(wù)
echo [5/7] 安裝MySQL服務(wù)...
bin\mysqld --install MySQL57 --defaults-file="%MYSQL_DIR%\my.ini" >nul 2>&1
if !errorlevel! equ 0 (
echo ? 服務(wù)安裝成功
) else (
echo ?? 服務(wù)可能已存在
)
:CHECK_RUNNING
REM 5. 啟動(dòng)MySQL服務(wù)
echo [6/7] 啟動(dòng)MySQL服務(wù)...
net start MySQL57 >nul 2>&1
if !errorlevel! equ 0 (
echo ? MySQL服務(wù)啟動(dòng)成功
) else (
net stop MySQL57 >nul 2>&1
net start MySQL57 >nul 2>&1
if !errorlevel! equ 0 (
echo ? MySQL服務(wù)重啟成功
) else (
echo ? MySQL服務(wù)啟動(dòng)失敗
echo 請查看日志:%MYSQL_DIR%\logs\mysql_error.log
pause
exit /b 1
)
)
REM 6. 創(chuàng)建test用戶和數(shù)據(jù)庫
echo [7/7] 創(chuàng)建數(shù)據(jù)庫用戶...
echo 創(chuàng)建用戶:test,密碼:Test#2025
echo.
REM 使用臨時(shí)SQL文件創(chuàng)建用戶
(
echo USE mysql;
echo.
echo -- 刪除已存在的test用戶
echo DROP USER IF EXISTS 'test'@'localhost';
echo DROP USER IF EXISTS 'test'@'%%';
echo.
echo -- 創(chuàng)建test用戶(本地訪問)
echo CREATE USER 'test'@'localhost' IDENTIFIED BY 'Test#2025';
echo -- 授予所有權(quán)限
echo GRANT ALL PRIVILEGES ON *.* TO 'test'@'localhost' WITH GRANT OPTION;
echo.
echo -- 創(chuàng)建test用戶(遠(yuǎn)程訪問)
echo CREATE USER 'test'@'%%' IDENTIFIED BY 'Test#2025';
echo -- 授予所有權(quán)限
echo GRANT ALL PRIVILEGES ON *.* TO 'test'@'%%' WITH GRANT OPTION;
echo.
echo -- 刷新權(quán)限
echo FLUSH PRIVILEGES;
echo.
echo -- 驗(yàn)證創(chuàng)建
echo SELECT user, host FROM mysql.user WHERE user = 'test';
echo SHOW GRANTS FOR 'test'@'%%';
) > "%TEMP%\create_user.sql"
REM 執(zhí)行SQL文件
cd /d "%MYSQL_DIR%\bin"
mysql -u root < "%TEMP%\create_user.sql"
REM 7. 配置Windows防火墻
echo 配置防火墻允許遠(yuǎn)程連接...
netsh advfirewall firewall add rule name="MySQL 3306" dir=in action=allow protocol=TCP localport=3306 >nul 2>&1
netsh advfirewall firewall add rule name="MySQL 3306 Out" dir=out action=allow protocol=TCP localport=3306 >nul 2>&1
REM 8. 獲取本機(jī)IP地址
echo.
echo 正在獲取本機(jī)IP地址...
echo.
echo 本機(jī)IP列表:
set count=0
for /f "tokens=2 delims=:" %%i in ('ipconfig ^| findstr "IPv4"') do (
set "ip=%%i"
set "ip=!ip: =!"
if not "!ip!"=="" (
set /a count+=1
echo [!count!] !ip!
set "ip!count!=!ip!"
)
)
REM 刪除臨時(shí)文件
del "%TEMP%\create_user.sql" >nul 2>&1
echo.
echo ========================================
echo ? 配置完成!
echo ========================================
echo.
echo ?? 數(shù)據(jù)庫信息:
echo 主機(jī):localhost 或 上面顯示的IP地址
echo 端口:3306
echo 用戶名:test
echo 密碼:Test#2025
echo.
echo ?? 連接方式:
echo 1. 本地連接:mysql -u test -pTest#2025
echo 2. Navicat連接:
echo 主機(jī):上面顯示的IP地址 [!count!]
echo 端口:3306
echo 用戶:test
echo 密碼:Test#2025
echo.
echo ?? 測試連接:
echo %MYSQL_DIR%\bin\mysql -u test -pTest#2025 -e "SELECT VERSION();"
echo.
echo ??? 安全提醒:
echo 1. 請及時(shí)修改root密碼:ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼';
echo 2. 如需關(guān)閉遠(yuǎn)程訪問,修改my.ini中的bind-address=127.0.0.1
echo ========================================
echo.
REM 測試連接
echo 正在測試test用戶連接...
%MYSQL_DIR%\bin\mysql -u test -pTest#2025 -e "SELECT '? 連接成功!' as Status, VERSION() as MySQL版本, USER() as 當(dāng)前用戶, @@hostname as 服務(wù)器;" 2>nul
if !errorlevel! equ 0 (
echo ? test用戶連接測試通過!
) else (
echo ?? test用戶連接測試失敗,正在嘗試修復(fù)...
REM 嘗試使用root創(chuàng)建用戶
%MYSQL_DIR%\bin\mysql -u root -e "CREATE USER IF NOT EXISTS 'test'@'%%' IDENTIFIED BY 'Test#2025'; GRANT ALL ON *.* TO 'test'@'%%'; FLUSH PRIVILEGES;" 2>nul
)
echo.
set /p choice=是否打開MySQL命令行測試?(Y/N):
if /i "!choice!"=="y" (
start "%MYSQL_DIR%\bin\mysql.exe" -u test -pTest#2025
)
echo.
set /p choice2=是否創(chuàng)建測試數(shù)據(jù)庫?(Y/N):
if /i "!choice2!"=="y" (
%MYSQL_DIR%\bin\mysql -u test -pTest#2025 -e "CREATE DATABASE IF NOT EXISTS test_db; SHOW DATABASES;"
echo ? 測試數(shù)據(jù)庫 test_db 已創(chuàng)建
)
pause


總結(jié)
到此這篇關(guān)于如何在Windows環(huán)境下使用IIS部署PHP框架ThinkPHP5的文章就介紹到這了,更多相關(guān)Windows使用IIS部署ThinkPHP5內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
單臺(tái)服務(wù)器的PHP進(jìn)程之間實(shí)現(xiàn)共享內(nèi)存的方法
這篇文章主要介紹了單臺(tái)服務(wù)器的PHP進(jìn)程之間實(shí)現(xiàn)共享內(nèi)存的方法,需要的朋友可以參考下2014-06-06
PHP foreach引用變量導(dǎo)致的問題及其解決方案
在 PHP 中,foreach 是用于遍歷數(shù)組的重要結(jié)構(gòu),然而,在某些情況下,使用 foreach 的 引用變量(&) 可能會(huì)導(dǎo)致意想不到的錯(cuò)誤,尤其是在不同版本的 PHP 環(huán)境下,本文將詳細(xì)分析 foreach 在不同 PHP 版本中的行為變化,深入剖析引用帶來的問題,并提供最佳解決方案2025-02-02
PHP獲取當(dāng)前文件所在目錄 getcwd()函數(shù)
PHP 當(dāng)前目錄獲取方法。2009-05-05
PHP __autoload函數(shù)(自動(dòng)載入類文件)的使用方法
在使用PHP的OO模式開發(fā)系統(tǒng)時(shí),通常大家習(xí)慣上將每個(gè)類的實(shí)現(xiàn)都存放在一個(gè)單獨(dú)的文件里,這樣會(huì)很容易實(shí)現(xiàn)對(duì)類進(jìn)行復(fù)用,同時(shí)將來維護(hù)時(shí)也很便利2012-02-02
PHP中單引號(hào)與雙引號(hào)的區(qū)別分析
在PHP中,我們可以使用單引號(hào)或者雙引號(hào)來表示字符串。不過我們作為開發(fā)者,應(yīng)該了解其中的區(qū)別。單引號(hào)與雙引號(hào)對(duì)于定義字符一個(gè)是可以解析變量一個(gè)是會(huì)把變量直接輸出來,同時(shí)單引號(hào)與雙引號(hào)在字符處理上單引號(hào)要優(yōu)與雙引號(hào)2014-08-08
php源碼加密 仿微盾PHP加密專家(PHPCodeLock)
php源碼加密 仿照 微盾PHP加密專家(PHPCodeLock),需要的朋友可以參考下。2010-05-05

