Repository navigation
Expand file tree
/
Copy pathcheck_setup.ps1
More file actions
260 lines (241 loc) · 13 KB
/
Copy pathcheck_setup.ps1
File metadata and controls
260 lines (241 loc) · 13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
# check_setup.ps1 - проверяет и, где возможно, сам донастраивает компьютер
# для запуска IMSD (Windows). Ищет PHP не только в PATH, но и в типичных
# местах установки XAMPP/WAMP - PATH руками редактировать не нужно.
# Найденный путь к php.exe запоминается в php_path.txt рядом с этим файлом,
# start_imsd.bat читает его оттуда.
#
# Для тех, кто уже пользуется своим PHP (несколько версий, свой стек и т.п.):
# если php_path.txt уже создан и указывает на рабочий php.exe - скрипт его
# не трогает и не переопределяет автопоиском. Чтобы задать свой PHP вручную,
# просто впишите полный путь к php.exe одной строкой в php_path.txt.
#
# Если на машине несколько версий PHP, то, что "работает" при проверке, и
# то, что реально запускает start_imsd.bat, может быть разными бинарниками -
# отсюда кейс 2026-07-24: check_setup сказал "pdo_sqlite подключено", вход
# упал с "could not find driver". Поэтому: (а) проверка теперь не просто
# смотрит на список модулей, а реально открывает PDO-подключение к
# :memory: И к самому файлу базы; (б) предупреждает, если в PATH несколько
# РАЗНЫХ по версии php.exe.
$ErrorActionPreference = 'SilentlyContinue'
Set-Location -Path $PSScriptRoot
$fail = $false
$phpExe = $null
$phpPathFile = Join-Path $PSScriptRoot "php_path.txt"
Write-Host "=== Проверка компьютера для IMSD ===" -ForegroundColor Cyan
Write-Host ""
function Test-PhpExe($path) {
if (-not $path) { return $false }
if (-not (Test-Path $path)) { return $false }
$v = (& $path -r "echo PHP_VERSION;" 2>$null)
return [bool]$v
}
function Find-Php {
# 0) уже задан вручную (профи-пользователь) или запомнен с прошлого раза
if (Test-Path $phpPathFile) {
$saved = (Get-Content $phpPathFile -Raw).Trim()
if (Test-PhpExe $saved) { return @{ Path = $saved; Source = 'php_path.txt' } }
}
# 1) уже есть в PATH
$cmd = Get-Command php -ErrorAction SilentlyContinue
if ($cmd) { return @{ Path = $cmd.Source; Source = 'PATH' } }
# 2) типичные места установки XAMPP/WAMP/ручной установки
$candidates = @(
"C:\xampp\php\php.exe",
"C:\wamp64\bin\php\php*\php.exe",
"C:\wamp\bin\php\php*\php.exe",
"C:\Program Files\PHP\php.exe",
"C:\php\php.exe"
)
foreach ($pattern in $candidates) {
$found = Get-ChildItem -Path $pattern -ErrorAction SilentlyContinue | Select-Object -First 1
if ($found) { return @{ Path = $found.FullName; Source = 'авто-поиск' } }
}
return $null
}
# 1. PHP
Write-Host "1. PHP"
$found = Find-Php
if ($found) {
$phpExe = $found.Path
$version = (& $phpExe -r "echo PHP_VERSION;")
$major = (& $phpExe -r "echo PHP_MAJOR_VERSION;")
Write-Host " [OK] Найден: $phpExe (версия $version, источник: $($found.Source))" -ForegroundColor Green
if ([int]$major -lt 8) {
Write-Host " [--] Версия слишком старая, нужна 8.1 или новее" -ForegroundColor Red
$fail = $true
}
} else {
Write-Host " [--] PHP не найден" -ForegroundColor Red
Write-Host ""
Write-Host " Если у вас уже есть свой PHP (не в PATH и не в стандартных"
Write-Host " местах) - впишите полный путь к php.exe в файл php_path.txt"
Write-Host " рядом с этим скриптом и запустите проверку снова."
Write-Host ""
Write-Host " Если PHP на компьютере вообще нет - самый простой способ"
Write-Host " поставить XAMPP (в нём уже есть PHP, ничего отдельно"
Write-Host " настраивать не нужно):"
Write-Host ""
Write-Host " 1. Открыть: https://www.apachefriends.org/download.html"
Write-Host " 2. Скачать установщик для Windows, запустить."
Write-Host " 3. Далее -> Далее -> ... -> Готово (можно снять галки Apache/MySQL/"
Write-Host " прочее в списке компонентов - для IMSD нужен только PHP)."
Write-Host " 4. Запустить check_setup.bat ещё раз."
Write-Host ""
$answer = Read-Host " Открыть страницу загрузки XAMPP в браузере сейчас? (y/n)"
if ($answer -eq 'y' -or $answer -eq 'Y') {
Start-Process "https://www.apachefriends.org/download.html"
}
$fail = $true
}
# Несколько РАЗНЫХ по версии php.exe в PATH - источник именно того бага,
# который уже ловили. Не блокируем, только предупреждаем.
if ($phpExe) {
$allPhp = @(Get-Command php -All -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Source -Unique)
if ($allPhp.Count -gt 1) {
$versions = $allPhp | ForEach-Object { "$_ -> $((& $_ -r 'echo PHP_VERSION;'))" }
$uniqueVersions = ($allPhp | ForEach-Object { (& $_ -r 'echo PHP_VERSION;') }) | Select-Object -Unique
if ($uniqueVersions.Count -gt 1) {
Write-Host " [!!] На компьютере несколько РАЗНЫХ версий php.exe в PATH:" -ForegroundColor Yellow
$versions | ForEach-Object { Write-Host " $_" }
Write-Host " Используется: $phpExe."
}
}
}
Write-Host ""
# 2. pdo_sqlite
if ($phpExe) {
Write-Host "2. Расширение pdo_sqlite (нужно для базы данных)"
$pdoCheck = (& $phpExe -r "try { new PDO('sqlite::memory:'); echo 'OK'; } catch (Throwable `$e) { echo 'FAIL: ' . `$e->getMessage(); }" 2>&1)
if ($pdoCheck -eq 'OK') {
Write-Host " [OK] Подключено и работает" -ForegroundColor Green
} else {
Write-Host " [--] Не работает ($pdoCheck)" -ForegroundColor Red
$iniLine = (& $phpExe --ini) | Select-String "Loaded Configuration File"
$iniPath = $null
if ($iniLine) {
$iniPath = ($iniLine.ToString().Split(":", 2)[1]).Trim()
}
if ($iniPath -and (Test-Path $iniPath)) {
Write-Host " Найден php.ini: $iniPath"
Write-Host " Это общий файл настроек PHP - изменения затронут ВСЕ"
Write-Host " PHP-программы на этом компьютере, использующие этот PHP"
Write-Host " (не только IMSD)."
$ans2 = Read-Host " Включить в нём расширение pdo_sqlite? (y/n)"
if ($ans2 -eq 'y' -or $ans2 -eq 'Y') {
$content = Get-Content $iniPath
$newContent = $content -replace '^\s*;\s*extension\s*=\s*pdo_sqlite', 'extension=pdo_sqlite'
Set-Content -Path $iniPath -Value $newContent
$pdoCheck2 = (& $phpExe -r "try { new PDO('sqlite::memory:'); echo 'OK'; } catch (Throwable `$e) { echo 'FAIL'; }" 2>&1)
if ($pdoCheck2 -eq 'OK') {
Write-Host " [OK] Включено" -ForegroundColor Green
} else {
Write-Host " Не удалось включить автоматически." -ForegroundColor Yellow
Write-Host " Откройте $iniPath, найдите строку ';extension=pdo_sqlite',"
Write-Host " уберите ';' в начале, сохраните файл и запустите проверку снова."
$fail = $true
}
} else {
Write-Host " Пропущено по вашему выбору. Включите вручную в $iniPath,"
Write-Host " строка ';extension=pdo_sqlite' -> убрать ';' в начале."
$fail = $true
}
} else {
Write-Host " Не удалось найти php.ini автоматически." -ForegroundColor Yellow
Write-Host " Найдите файл php.ini рядом с php.exe, откройте его, найдите строку"
Write-Host " ';extension=pdo_sqlite', уберите ';' в начале, сохраните файл."
$fail = $true
}
}
Write-Host ""
}
# 3. mbstring
if ($phpExe) {
Write-Host "3. Расширение mbstring (нужно для корректной работы с текстом)"
$modules = (& $phpExe -m)
if ($modules -match '^mbstring$') {
Write-Host " [OK] Подключено" -ForegroundColor Green
} else {
Write-Host " [--] Не подключено" -ForegroundColor Red
Write-Host " Откройте php.ini, найдите ';extension=mbstring', уберите ';', сохраните."
$fail = $true
}
Write-Host ""
}
if ($phpExe) {
$pdoFinal = (& $phpExe -r "try { new PDO('sqlite::memory:'); echo 'OK'; } catch (Throwable `$e) { echo 'FAIL'; }" 2>&1)
if ($pdoFinal -eq 'OK') {
Set-Content -Path $phpPathFile -Value $phpExe -NoNewline
}
}
# 4. Database file
Write-Host "4. Файл базы данных - наличие, права на запись, тестовый запрос"
$dbFile = Join-Path $PSScriptRoot "src\data\ims.sqlite"
$dbDir = Join-Path $PSScriptRoot "src\data"
if (Test-Path $dbFile) {
Write-Host " [OK] src\data\ims.sqlite на месте" -ForegroundColor Green
$writeTestFile = Join-Path $dbDir "__write_test.tmp"
$canWrite = $true
try {
[IO.File]::WriteAllText($writeTestFile, "test")
Remove-Item $writeTestFile -ErrorAction SilentlyContinue
} catch {
$canWrite = $false
}
if ($canWrite) {
Write-Host " [OK] Права на запись в папку есть" -ForegroundColor Green
} else {
Write-Host " [--] Нет прав на запись в src\data - приложение не сможет сохранять данные" -ForegroundColor Red
$fail = $true
}
if ($phpExe) {
$dbFileEscaped = $dbFile -replace '\\', '\\\\'
$realDbCheck = (& $phpExe -r "try { `$p = new PDO('sqlite:$dbFileEscaped'); `$p->query('SELECT 1 FROM sqlite_master LIMIT 1'); echo 'OK'; } catch (Throwable `$e) { echo 'FAIL: ' . `$e->getMessage(); }" 2>&1)
if ($realDbCheck -eq 'OK') {
Write-Host " [OK] Тестовый запрос к самой базе прошёл успешно" -ForegroundColor Green
} else {
Write-Host " [--] Тестовый запрос к базе не прошёл: $realDbCheck" -ForegroundColor Red
$fail = $true
}
}
} else {
Write-Host " [--] src\data\ims.sqlite не найден - поставка повреждена" -ForegroundColor Red
$fail = $true
}
Write-Host ""
# 5. Port 8010
Write-Host "5. Порт 8010"
$portBusy = $false
try {
$test = New-Object System.Net.Sockets.TcpClient
$test.Connect("127.0.0.1", 8010)
$portBusy = $test.Connected
$test.Close()
} catch {}
if ($portBusy) {
Write-Host " [!!] Порт уже занят - возможно, IMSD уже запущен, или порт нужно сменить" -ForegroundColor Yellow
} else {
Write-Host " [OK] Свободен" -ForegroundColor Green
}
Write-Host ""
# 6. Disk space
Write-Host "6. Свободное место на диске"
try {
$drive = (Get-Item $PSScriptRoot).PSDrive
$freeMB = [math]::Round($drive.Free / 1MB)
if ($freeMB -lt 200) {
Write-Host " [--] Мало места: ${freeMB}МБ - нужно хотя бы 200МБ с запасом" -ForegroundColor Red
$fail = $true
} else {
Write-Host " [OK] ${freeMB}МБ свободно" -ForegroundColor Green
}
} catch {
Write-Host " Не удалось проверить - пропущено" -ForegroundColor Yellow
}
Write-Host ""
Write-Host "======================================"
if (-not $fail) {
Write-Host "Всё готово. Запускайте: start_imsd.bat" -ForegroundColor Green
} else {
Write-Host "Есть нерешённые пункты выше - исправьте их и запустите проверку ещё раз." -ForegroundColor Yellow
}
Read-Host "Нажмите Enter для выхода"