Advertisement
Inquisitor

Loader.cmd [php workers pool]

Jul 2nd, 2019
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Batch 4.84 KB | None | 0 0
  1. @Echo Off
  2. SetLocal EnableDelayedExpansion
  3. :: Portable nginx+php+mysql for Windows
  4. :: Inquisitor, 2016-2019
  5.  
  6. :: nginx    1.15.8
  7. :: php      7.2.10
  8. :: mysql    5.7.23
  9.  
  10. CD /D "%~dp0"
  11.  
  12. :: Лог работы скрипта
  13. Set LogFile=%~dpn0.log
  14. :: Формат даты в логе
  15. Set TimestampFormat=[%%Date%% %%Time:~,8%%]
  16. :: Периодичность проверки запроса на отключение и перезапуска процессов при падении, секунды
  17. Set WatcherTimeout=10
  18.  
  19.  
  20. :: Обрабатываем команду на выключение
  21. If /I "%~1"=="shutdown" (
  22.     If Exist "%~dp0.loader.lock" (
  23.         Call :Log Received termination signal, shutting down
  24.         Del "%~dp0.loader.lock" 2>nul
  25.     ) Else (
  26.         Call :Log [WARNING] Received termination signal, server not started
  27.     )
  28.     Exit /B
  29. )
  30.  
  31. :: Обрабатываем запуск сервиса
  32. If /I "%~1"=="service" (
  33.     Call Echo.>>"%LogFile%"
  34.     Call :Log Loader started as service
  35.     GoTo :service
  36. )
  37.  
  38. :: Перезапускаем себя как скрытый процесс, если запущено без аргументов
  39. If "%~1"=="" (
  40.     Start "" "%~dp0tools\hidcon" %~nx0 restart_hidden
  41.     Call Echo.>>"%LogFile%"
  42.     Call :Log Loader started
  43.     Exit
  44. )
  45.  
  46. :service
  47.  
  48. :: ДЛЯ ОТЛАДКИ! УБРАТЬ ИЗ ПРОДАКШЕНА
  49. :: Set Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem
  50.  
  51. :: Сохраняем оригинальный path
  52. Set OSPath=%Path%
  53. :: Добавляем пути к бинарникам в системный path для этого скрипта и дочерних процессов
  54. Set Path=%!!%~dp0nginx;%!!%~dp0mysql\bin
  55. :: Добавляем модули
  56. ::  FFMpeg 4.1.3
  57. ::Set Path=%Path%;%~dp0modules\ffmpeg
  58. ::  ImageMagick 6.9.3 (php5)
  59. ::Set Path=%Path%;%~dp0modules\imagick-php5\ImageMagick
  60. ::Set LOCALAPPDATA=%~dp0modules\imagick-php5
  61. :: Меняем системный temp на наш
  62. Set Temp=%~dp0\tmp
  63. :: Добавляем системный path с низшим приоритетом
  64. Set Path=%Path%;%OSPath%
  65.  
  66. :: Обрабатываем запуск консоли
  67. If /I "%~1"=="console" (
  68.     PushD nginx\wwwroot
  69.     Start cmd
  70.     PopD
  71.     Exit /B 0
  72. )
  73.  
  74.  
  75. :: Запускаем каждый процесс из его рабочей директории
  76.  
  77. :: MySQL
  78. Call :Log Starting MySQL...
  79. :start-mysql
  80. PushD .\mysql\
  81. Start bin\mysqld --defaults-file="my.ini" --user=root --standalone||Call :Log [ERROR] Can't start MySQL
  82. PopD
  83. If "%1"=="restart" (
  84.     Call :Log [WARNING] MySQL crashed, restarting
  85.     Exit /B
  86. )
  87.  
  88. :: PHP
  89. Call :Log Starting PHP...
  90. :start-php
  91. PushD .\php
  92. :: меняя что-то тут, не забываем изменить в nginx\conf\nginx.conf, секция upstream backend
  93. Set PHP_Pool[]="9123","9124","9125"
  94. For %%A In (%PHP_Pool[]%) Do (
  95.     If Not Defined _PHP_Worker_%%~A Set _PHP_Worker_%%~A=false
  96.     TaskList /FI "PID eq !_PHP_Worker_%%~A!" /FO:CSV /NH|FindStr /C:"!_PHP_Worker_%%~A!"||(
  97.         For /F "delims=" %%P In ('easy_spawner "php-cgi.exe" "-b 127.0.0.1:%%~A -c .\php.ini"') Do (
  98.             Call :Log New PHP worker on port :%%~A with PID %%P
  99.             Set _PHP_Worker_%%~A=%%P
  100.         )
  101.     )
  102. )
  103. PopD
  104. If "%1"=="check_workers" (
  105.     Exit /B
  106. )
  107.  
  108.  
  109. :: nginx
  110. Call :Log Starting NginX...
  111. :start-nginx
  112. PushD .\nginx
  113. Start nginx||Call :Log [ERROR] Can't start NginX
  114. PopD
  115. If "%1"=="restart" (
  116.     Call :Log [WARNING] NginX crashed, restarting
  117.     Exit /B
  118. )
  119.  
  120. :: Убиваем уже не нужные процессы hidcon
  121. TaskKill /F /IM "hidcon.exe"
  122.  
  123. :: Повышаем приоритет для запущенных процессов
  124. For %%A In ("mysqld.exe", "php-cgi.exe", "nginx.exe") Do (
  125.     wmic process where name="%%~A" CALL setpriority "high priority"
  126. )
  127.  
  128. :: Создаём lock-файл и следим за его наличием
  129. Set LockFile=.\.%~n0.lock
  130. Echo.>"%LockFile%"
  131. :Watcher
  132. Ping -n %WatcherTimeout% 127.0.0.1>nul 2>nul
  133. :: Проверяем наличие процессов и перезапускаем в случае падения
  134. ::TaskList /FI "imagename EQ php-cgi.exe" /FO:CSV|FindStr /I /C:"php-cgi.exe">nul||Call :start-php restart
  135. Call :start-php check_workers
  136. :: Запускаем процесс выключения, если файл удалён
  137. If Not Exist "%LockFile%" (
  138.     Call :Log Lockfile not found, killing child processes
  139.  
  140.     rem Останавливаем nginx
  141.     PushD .\nginx
  142.     nginx -s stop
  143.     PopD
  144.  
  145.     rem Останавливаем MySQL
  146.     mysqladmin -u root -p%$_DB_PASS% shutdown
  147.  
  148.     rem Останавливаем PHP-CGI
  149.     rem эта дрянь не поддерживает корректное отключение
  150.     rem поэтому просто дергаем TerminateProcess() aka SIGKILL
  151.     TaskKill /F /T /IM php-cgi.exe
  152.  
  153.     Call :Log Loader stopped
  154.     Exit
  155. )
  156. GoTo :Watcher
  157.  
  158. :Log
  159.     Call Echo %TimestampFormat% %*>>"%LogFile%"
  160. Exit /B
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement