Nejde spustit PHP 8.1 na Windows pod Apachem -jako modul

m.brecher
Generous Backer | 736
+
-1
-

Ahoj,

zkusil jsem nainstalovat na Windows PHP 8.1.10 pro Apache 2.4 na Windows – verzi VS16 x64 Thread Safe.

S předchozí verzí PHP 8.0 Apache funguje normálně, s verzí 8.1 nikoliv.

PHP 8.0 i 8.1 mám nainstalované jako modul Apache:

LoadModule php_module "
C:\Program Files\PHP81\php8apache2_4.dll"
PHPIniDir "C:\Program Files\PHP81"

Apache s PHP 8.1 funguje a statický index.html zobrazí. Při pokusu o zobrazení index.php server stránka vytuhne. V logu Apache je:

[mpm_winnt:notice] [pid 13276:tid 648] AH00455: Apache/2.4.39 (Win64) configured -- resuming normal operations
[mpm_winnt:notice] [pid 13276:tid 648] AH00456: Apache Lounge VS16 Server built: May 28 2019 17:12:51
[core:notice] [pid 13276:tid 648] AH00094: Command line: 'C:\\Program Files\\Apache24\\bin\\httpd.exe -d C:/Program Files/Apache24'
[mpm_winnt:notice] [pid 13276:tid 648] AH00418: Parent: Created child process 9556
[mpm_winnt:notice] [pid 9556:tid 620] AH00354: Child: Starting 64 worker threads.
[mpm_winnt:notice] [pid 13276:tid 648] AH00428: Parent: child process 9556 exited with status 255 -- Restarting.
[mpm_winnt:notice] [pid 13276:tid 648] AH00455: Apache/2.4.39 (Win64) configured -- resuming normal operations
[mpm_winnt:notice] [pid 13276:tid 648] AH00456: Apache Lounge VS16 Server built: May 28 2019 17:12:51
[core:notice] [pid 13276:tid 648] AH00094: Command line: 'C:\\Program Files\\Apache24\\bin\\httpd.exe -d C:/Program Files/Apache24'
[mpm_winnt:notice] [pid 13276:tid 648] AH00418: Parent: Created child process 8676
[mpm_winnt:notice] [pid 8676:tid 612] AH00354: Child: Starting 64 worker threads.

Kontrola syntaxe konfigurace Apache pomocí cmd dopadla OK:

C:\Program Files\Apache24\bin>httpd -t
Syntax OK

Při pokusu o spuštění ale vyjede chyba obsazení portu 80

C:\Program Files\Apache24\bin>httpd
(OS 10048)Normßlný je povoleno pouze jedno pou×itÝ ka×dÚ adresy (protokolu, sÝŁovÚ adresy, portu) soketu.  : AH00072: make_sock: could not bind to address 127.0.0.1:80
AH00451: no listening sockets available, shutting down
AH00015: Unable to open logs

Hláška make_sock: could not bind to address 127.0.0.1:80 ale asi nebude ten problém, protože bez PHP nebo s PHP 8.0 Apache funguje a přitom z cmd jsem dostal úplně stejnou chybovou hlášku.

Ve službách Windows Apache zaregistrovaný je a běží normálně.

Ve Windows Proměnné prostředí žádné cesty k PHP nemám, spouští se jako modul Apache.

Pokus o zprovoznění 32bitové verze PHP 8.1 dopadl ještě hůře:

C:\Program Files\Apache24\bin>httpd -t
httpd: Syntax error on line 38 of C:/Program Files/Apache24/conf/httpd.conf: Cannot load C:\\Program Files (x86)\\PHP81_86\\php8apache2_4.dll into server: %1 nen\xed platn\xe1 aplikace typu Win32.

Jaké máte s instalací PHP 8.1 zkušenosti Vy? Narazili jste na Windows na podobné chyby a podařilo se Vám to vyřešit?

nightfish
Člen | 472
+
0
-

m.brecher napsal(a):
Při pokusu o spuštění ale vyjede chyba obsazení portu 80

To znamená, že buď ti něco jiného zabralo port 80, nebo se pokoušíš spustit Apache 2× (jednou ti běží jako služba, podruhé jej spustíš přes httpd.exe v příkazovém řádku) – na tuto variantu by poukazovala i chyba „Unable to open logs“.

Dále jsem nepochopil, jestli chceš PHP 8.0 a PHP 8.1 provozovat současně – to při načítání přes LoadModule nejde. Na přepínání verzí používám PhpVersionSwitcher

A ještě jedna věc – pro provoz PHP na Windows bylo většinou potřeba, aby soubor php8ts.dll (a případně i pár dalších) byl nalezitelný v proměnné prostředí PATH – někteří to řeší kopírováním do apache/bin, jiní to vyřeší přidáním adresáře s PHP do PATH (což je ovšem problém při více verzích PHP – vezme se první soubor php8ts.dll, na který to narazí, což nutně nemusí být ten ze správné verze PHP). Je tedy možné, že sice v konfiguraci Apache načítáš modul pro PHP 8.1, nicméně při dohledávání php8ts.dll se ti najde knihovna pro PHP 8.0 a proto Apache při pokusu o načtení index.php spadne.

EDIT: Až teď mi došlo, že tohle je zcela mimo zaměření fóra, neboť to nesouvisí s Nette. Takže pokračovat bych doporučil buď na Diskuse Jak psát web nebo na StackOverflow.

Editoval nightfish (14. 9. 2022 7:26)

m.brecher
Generous Backer | 736
+
+1
-

Tak chyba nebyla v distribuci PHP 8.1.10 pro Windows64 Thread Safe, ale zřejmě v instalaci Apache jako služby Windows, nebo v staré verzi Apache.

Sice není instalace PHP 8.1 vyloženě téma Nette Frameworku, ale úzce s Nette Frameworkem souvisí, protože PHP 8.1 je základní platformou kterou budou budoucí verze Nette vyžadovat. Tak snad je možné toto téma které je na hraně tolerovat a když už jsem to vyřešil, třeba to někomu pomůže za rok, za dva.

Provedl jsem toto:

  • stáhnul poslední verzi Apache httpd-2.4.54-win64-VS16
  • odstranil jsem službu Windows pod kterou Apache byl nainstalovaný:
> httpd -k uninstall

Tento příkaz službu neodinstaloval, nechal ji běžet dál, pouze zakázal automatické spouštění služby – usuzuji, že služba Windows nebyla korektně nainstalovaná

Zkusil jsem tedy odstranit službu Windows pomocí OS Windows, je potřeba zadat skutečné jméno služby, které se zjistí když rozklikneme detail služby ve Službách Windows. Nejprve jsem zastavil běžící službu Apache24. Potom:

> sc delete Apache2.4

Sice to zahlásilo, že se službu nepodařilo odinstalovat, ale služba Apache24 zmizela, takže se to povedlo. Další signál, že předchozí instalace služby Apache24 zřejmě neproběhla korektně.

Přesunul jsem novou verzi Apache do C:/Program Files/Apache24, překopíroval a upravil jsem httpd.conf. PHP instaluji jako modul Apache – není pak potřeba se hrabat v Proměnných prostředí Windows, ale při změně verze PHP, což se občas hodí, stačí změnit dva řádky v httpd.conf a restartovat Apache:

# LoadModule php7_module "C:\Program Files\PHP7\php7apache2_4.dll"
# PHPIniDir "C:\Program Files\PHP7"

# LoadModule php_module "C:\Program Files\PHP80\php8apache2_4.dll"
# PHPIniDir "C:\Program Files\PHP80"

LoadModule php_module "C:\Program Files\PHP81\php8apache2_4.dll"
PHPIniDir "C:\Program Files\PHP81"

Ověříme v cmd, že Apache správně pracuje a spustíme Apache z příkazové řádky:

> C:\Program Files\Apache24\bin>httpd

a vyzkoušíme v prohlížeči

http://localhost/index.php

Apache funguje i s PHP 8.1

Zastavíme běh Apache v cmd okně pomocí Ctrl+C a instalujeme jako službu Windows příkazem cmd:

httpd -k install

Povedlo se, Apache běží i s PHP 8.1. Nette hlásí chybu:

Nette\Database\ConnectionException
could not find driver

To už se nějak pořeší, hlavní je, že nejnovější verze Apache s nejnovější verzí PHP 8.1 po odinstalování předchozích verzí a korektnímu odinstalování služby Windows pro Apache a nové instalaci běží bez problémů.

Chyba mohla vzniknout při předchozích upgrade verzí PHP 7.2 → 8.0, kdy se asi opomnělo korektně přeinstalovat službu Windows.

m.brecher
Generous Backer | 736
+
0
-

Ještě bylo potřeba provést toto:

aktualizovat cestu k rozšířením PHP v php.ini:

extension_dir = "C:\Program Files\PHP81\ext"

Aby fungovala knihovna intl je ještě potřeba překopírovat soubory icu*.dll (jsou v kořenovém adresáři php) do složky /bin Apache:

	icudt70.dll
	icuin70.dll
	icuio70.dll
	icuuc70.dll

PHP 8.1 běží včetně všech základních rozšíření.

Mysteria
Člen | 797
+
+5
-

Nechceš se radši místo řešení takových věcí podívat na Docker? Tam změna verze PHPka znamená přepsání jednoho řádku (pokud použiješ oficiální PHP image).