windows上php环境批处理启动

因为工作的需要,老大叫我在Windows上写一个一键启动php环境的脚本,因为以前一直也没有写过bat脚本文件,所以特地在此记录。这一次的脚本我一共写了三个版本,其中有两个成功了,另外一个失败了。



大致的思路:先分别检测几个服务所需要的端口是否被占用,如果被占用,想办法获取占用它进程的pid,然后杀死该进程。然后依次运行几个服务的启动程序,

我们先来看看php环境所有文件的布局:

  • 最外一层

  • apache层

版本一(失败告终)

先上代码:

@echo off

:: 检测80端口是否被占用
:testApachePort
netstat -aon | findstr :80 | findstr LISTENING >> closePort.txt 2>&1

::ERRORLEVEL用来表示上一条命令的返回值,0成功 1失败,如果系统在监听80端口
::ERRORLEVEL为0,没有监听则为1
if %ERRORLEVEL% EQU 0 (
    ::复合语句需要开启变量延迟拓展
    setlocal enabledelayedexpansion

        :: 杀死80端口
        for /f "tokens=5" %%i in ('@netstat -aon ^| findstr ":80" ^| findstr "LISTENING"') do (
            set apachePort=%%i
        )
        taskkill /f /pid !apachePort! >> mysqlLog.txt 2>&1

        endlocal
)



:: 检测3306端口是否被占用
:testMysqlPost

netstat -aon | findstr :3306 | findstr LISTENING >> closePort.txt 2>&1

if %ERRORLEVEL% EQU 0 (
    setlocal enabledelayedexpansion

        :: 杀死3306端口
        for /f "tokens=5" %%b in ('@netstat -aon ^| findstr ":3306" ^| findstr "LISTENING"') do (
            set mysqlPort=%%b
        )
        taskkill /f /pid !mysqlPort! >> mysqlLog.txt 2>&1

    endlocal

)
:: 启动apache
:startApache
::进入apache应用程序目录
cd Apache\bin

echo starting apache
start /b httpd.exe >> apacheLog.txt 2>&1

::这里程序休眠5秒,因为程序启动有时间,防止程序还没有启动起来就去检测对应的端口,导致结果不准确。
choice /t 5 /d y /n >nuly

netstat -aon | findstr :80 | findstr LISTENING >> batStartPort.txt 2>&1

if %ERRORLEVEL% EQU 0 (
    echo success
) else (
    echo error
)


:: 启动mysql
:startMysql

::进入mysql应用程序目录
cd ../../MySQL\bin

echo starting mysql
start /b mysqld.exe >> mysqlLog.txt 2>&1

::这里程序休眠5秒,因为程序启动有时间,防止程序还没有启动起来就去检测对应的端口,导致结果不准确。
choice /t 5 /d y /n >nuly

netstat -aon | findstr :3306 | findstr LISTENING >> batStartPort.txt 2>&1


if %ERRORLEVEL% EQU 0 (
    echo success
) else (
    echo error
)

call cmd

失败的原因是apache在配置php模块的时候,只能用绝对路径,因为这个环境包可以随便移动,所以确定不了绝对路径,陷入了沉思,一时没有想起怎么处理。于是我就把目光投降了nginx,nginx不需要直接依赖php模块,只要开启php-fpm就好了,但是在windows上面又没有php-fpm,但是这难不倒我啊,因为我知道可以用php-cgi来模拟php-fpm,于是就有了下面版本二的代码了。

版本二:

@echo off
:: 检测80端口是否被占用
:testNginxPort
netstat -aon | findstr :80 | findstr LISTENING >> closePort.txt 2>&1

::ERRORLEVEL用来表示上一条命令的返回值,0成功 1失败,如果系统在监听80端口
::ERRORLEVEL为0,没有监听则为1
if %ERRORLEVEL% EQU 0 (
    ::复合语句需要开启变量延迟拓展
    setlocal enabledelayedexpansion

        :: 杀死80端口
        for /f "tokens=5" %%i in ('@netstat -aon ^| findstr ":80" ^| findstr "LISTENING"') do (
            set nginxPort=%%i
        )
        taskkill /f /pid !nginxPort! >> nginxLog.txt 2>&1

        endlocal
)



:: 检测3306端口是否被占用
:testMysqlPost

netstat -aon | findstr :3306 | findstr LISTENING >> closePort.txt 2>&1

if %ERRORLEVEL% EQU 0 (
    setlocal enabledelayedexpansion

        :: 杀死3306端口
        for /f "tokens=5" %%b in ('@netstat -aon ^| findstr ":3306" ^| findstr "LISTENING"') do (
            set mysqlPort=%%b
        )
        taskkill /f /pid !mysqlPort! >> mysqlLog.txt 2>&1

    endlocal

)

:: 检测9000端口是否被占用
:testMysqlPost

netstat -aon | findstr :9000 | findstr LISTENING >> closePort.txt 2>&1

if %ERRORLEVEL% EQU 0 (
    setlocal enabledelayedexpansion

        :: 杀死3306端口
        for /f "tokens=5" %%b in ('@netstat -aon ^| findstr ":9000" ^| findstr "LISTENING"') do (
            set cgiPort=%%b
        )
        taskkill /f /pid !cgiPort! >> cgiLog.txt 2>&1

    endlocal

)

::用php-cgi来代替php-fpm
:startCgi
cd php

echo starting php-fpm
start php-cgi -b 127.0.0.1:9000

::这里程序休眠5秒,因为程序启动有时间,防止程序还没有启动起来就去检测对应的端口,导致结果不准确。
choice /t 5 /d y /n >nuly

netstat -aon | findstr :9000 | findstr LISTENING >> batStartPort.txt 2>&1

if %ERRORLEVEL% EQU 0 (
    echo success
) else (
    echo error
)


:: 启动nginx
:startNginx
::进入apache应用程序目录
cd ../nginx

echo starting nginx
start /b nginx.exe >> nginxLog.txt 2>&1

::这里程序休眠5秒,因为程序启动有时间,防止程序还没有启动起来就去检测对应的端口,导致结果不准确。
choice /t 5 /d y /n >nuly

netstat -aon | findstr :80 | findstr LISTENING >> batStartPort.txt 2>&1

if %ERRORLEVEL% EQU 0 (
    echo success
) else (
    echo error
)


:: 启动mysql
:startMysql

::进入mysql应用程序目录
cd ../MySQL\bin

echo starting mysql
start /b mysqld.exe >> mysqlLog.txt 2>&1

::这里程序休眠5秒,因为程序启动有时间,防止程序还没有启动起来就去检测对应的端口,导致结果不准确。
choice /t 5 /d y /n >nuly

netstat -aon | findstr :3306 | findstr LISTENING >> batStartPort.txt 2>&1


if %ERRORLEVEL% EQU 0 (
    echo success
) else (
    echo error
)

call cmd

写好了后交给给老大看,老大说我们线上环境是apache,所以这边的环境要和线上一样,所以不用nginx,还是用apache,然后告诉我可以用bat脚本来获取绝对路径,然后修改配置文件,于是就有了下面的第三版代码:

版本三

@echo off

::初始化脚本路径
set pwd=%~dp0
set php_path_to_apache=%pwd%php
set php_moudle_to_apache=%pwd%php/php-cgi.exe
set php_ext=%pwd%php\ext
set php_upload_dir=%pwd%php\uploadTemp
set php_sys_dir=%pwd%php\sysTemp
set php_session_tmp=%pwd%tmp

:: 检测8080端口是否被占用
:testApachePort
netstat -aon | findstr :8080 | findstr LISTENING >> %pwd%closePort.txt 2>&1

::ERRORLEVEL用来表示上一条命令的返回值,0成功 1失败,如果系统在监听8080端口
::ERRORLEVEL为0,没有监听则为1
if %ERRORLEVEL% EQU 0 (
    ::复合语句需要开启变量延迟拓展
    setlocal enabledelayedexpansion

        :: 杀死8080端口
        for /f "tokens=5" %%i in ('@netstat -aon ^| findstr ":8080" ^| findstr "LISTENING"') do (
            set apachePort=%%i
        )
        taskkill /f /pid !apachePort! >> %pwd%mysqlLog.txt 2>&1

        endlocal
)



:: 检测3306端口是否被占用
:testMysqlPost

netstat -aon | findstr :3306 | findstr LISTENING >> %pwd%closePort.txt 2>&1

if %ERRORLEVEL% EQU 0 (
    setlocal enabledelayedexpansion

        :: 杀死3306端口
        for /f "tokens=5" %%b in ('@netstat -aon ^| findstr ":3306" ^| findstr "LISTENING"') do (
            set mysqlPort=%%b
        )
        taskkill /f /pid !mysqlPort! >> %pwd%mysqlLog.txt 2>&1

    endlocal

)

::=============================================================================================================

::配置apache的php模块
:configure_the_apache

::进入apache的php模块配置目录
cd %pwd%Apache\conf\extra

::匹配配置文件中的路径到临时文件
findstr "\".*\"" httpd-php.conf > temp.txt

::因为这里面有两个路径需要替换,所有这里给一个index标识来说明正在替换哪一个
set index=1

::开启延迟变量拓展
setlocal enabledelayedexpansion
::以双引号"来分割字符串
for /f tokens^=2*^ delims^=^" %%i in (temp.txt) do (
    if !index! EQU 1 (
        for /f "eol=* tokens=*" %%b in (httpd-php.conf) do (
            set temp=%%b
            set "temp=!temp:%%i=%php_path_to_apache%!"
            echo !temp!>>%pwd%temp.conf
        )
    ) else (
        for /f "eol=* tokens=*" %%c in (httpd-php.conf) do (
            set temp=%%c
            set "temp=!temp:%%i=%php_moudle_to_apache%!"
            echo !temp!>>%pwd%temp.conf
        )
    )
    ::用已经修改后的文件替换原文件
    move %pwd%temp.conf httpd-php.conf >> nul 2>&1
    ::标识加1
    set /a index=%index%+1
    
)

::删除零时文件
del temp.txt

endlocal

::配置php拓展路径和php上传文件路径
:config_the_php

::进入php目录
cd %pwd%php

::开启延迟变量拓展
setlocal enabledelayedexpansion

findstr "sys_temp_dir" php.ini > temp.txt
for /f tokens^=2*^ delims^=^" %%i in (temp.txt) do (
        for /f "eol=* tokens=*" %%b in (php.ini) do (
            set temp=%%b
            set "temp=!temp:%%i=%php_sys_dir%!"
            echo !temp!>>%pwd%temp.conf
        )
        move %pwd%temp.conf php.ini >> nul 2>&1
)

findstr "upload_tmp_dir" php.ini > temp.txt
for /f tokens^=2*^ delims^=^" %%i in (temp.txt) do (
        for /f "eol=* tokens=*" %%b in (php.ini) do (
            set temp=%%b
            set "temp=!temp:%%i=%php_upload_dir%!"
            echo !temp!>>%pwd%temp.conf
        )
        move %pwd%temp.conf php.ini >> nul 2>&1
)

::注意,这个配置项等号两边不能留空格 
findstr "extension_dir=" php.ini > temp.txt
for /f tokens^=2*^ delims^=^" %%i in (temp.txt) do (
        for /f "eol=* tokens=*" %%b in (php.ini) do (
            set temp=%%b
            set "temp=!temp:%%i=%php_ext%!"
            echo !temp!>>%pwd%temp.conf
        )
        move %pwd%temp.conf php.ini >> nul 2>&1
)

::注意,这个配置项等号两边不能留空格 
findstr "session.save_path" php.ini > temp.txt
for /f tokens^=2*^ delims^=^" %%i in (temp.txt) do (
        for /f "eol=* tokens=*" %%b in (php.ini) do (
            set temp=%%b
            set "temp=!temp:%%i=%php_session_tmp%!"
            echo !temp!>>%pwd%temp.conf
        )
        move %pwd%temp.conf php.ini >> nul 2>&1
)








::删除零时文件
del temp.txt

endlocal




::=============================================================================================================


:: 启动apache
:startApache
::进入apache应用程序目录
cd %pwd%Apache\bin

echo starting apache
start /b httpd.exe >> %pwd%apacheLog.txt 2>&1

::这里程序休眠5秒,因为程序启动有时间,防止程序还没有启动起来就去检测对应的端口,导致结果不准确。
choice /t 5 /d y /n >nuly

netstat -aon | findstr :8080 | findstr LISTENING >> %pwd%batStartPort.txt 2>&1

if %ERRORLEVEL% EQU 0 (
    echo success
) else (
    echo error
)


:: 启动mysql
:startMysql

::进入mysql应用程序目录
cd %pwd%MySQL\bin

echo starting mysql
start /b mysqld.exe >> %pwd%mysqlLog.txt 2>&1

::这里程序休眠5秒,因为程序启动有时间,防止程序还没有启动起来就去检测对应的端口,导致结果不准确。
choice /t 5 /d y /n >nuly

netstat -aon | findstr :3306 | findstr LISTENING >> %pwd%batStartPort.txt 2>&1


if %ERRORLEVEL% EQU 0 (
    echo success
) else (
    echo error
)



call cmd

Snail's Blog
请先登录后发表评论
  • 最新评论
  • 总共0条评论
  • 本博客使用免费开源的 laravel-bjyblog v5.5.1.3 -develop 搭建 © 2014-2018 www.snail-c.cn 版权所有 ICP证:蜀ICP备18023253号-1
  • 联系邮箱:459921737@qq.com