Autor Zpráva
xlifer
Profil
Potřebuji jednoduše spravovatelné prostředí na tvorbu webů, kde budu mít možnost přepínat verze PHP, zřizovat virtual hosty, atd. Padl mi do oka nástroj MAMP, ale asi bude potřeba placená verze Pro. Za cenu 49 USD, což není zase tak strašná suma za něco co výrazně usnadní práci. Nicméně by mě zajímal váš názor a případné zkušenosti s placenou verzi MAMP, zda opravdu funguje dobře a splňuje funkčnost, kterou slibují. Aktuálně používám XAMPP, není s tím žádný problém, ale neumožňuje přepínat verze PHP a další věci, které nabízí právě MAMP Pro. Jasně, v XAMPPu jde řešit ručně přepisováním configu, ale to je otravné a nepohodlné. Děkuji za vaše názory a případné doporučení.
Keeehi
Profil
Na co potřebuješ přepínat verze? Jestli kvůli otestování funkčnosti, tak na to jsou lepší věci.
xlifer
Profil
Protože v některých projektech jsou funkce PHP, která jsou již v nových verzích zrušené, např. mysql_connect, apod. Vím, že jsou to starodávné funkce, které už nikdo nepoužívá, ale bohužel takové projekty stále běží na serverech a když si chci takový web spustit lokálně, tak potřebuji pro starší projekty podporu dané verze PHP, např. 5.3. Jasně, skripty se dají přepsat a nahradit mysql_connect, mysql_query, ale to neřešme, zkrátka přepnu verzi a beží to jako na serveru, jak to bylo kdysi napsané, to je co řeším.
M4n
Profil *
Rozhodni se sám. Pokud jde o odlišné verze PHP, tak to je otázka přidání jednoho řádku do konfigurace virtualhostu.
xlifer
Profil
M4n:
Ano, jde mi pouze o odlišené verze PHP. Pokud by to takto fungovalo, tak by to bylo skvělé. A můžeš mě odkázat na nějaký konkretní příklad? Protože já jsem našel tedy celkem složité postupy a rozhodně nešlo o změnu jednoho řádku ve virtualhostu.
Keeehi
Profil
Záleží, co si nastavíš jako program pro zpracování. Já používám nginx jako server a tam celá konfigurace týkající se php vypadá takto:
location ~ \.php$ {
    include /etc/nginx/snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php7.1-fpm.sock;
    break;
}

Pro apache to bude nejspíše vypadat takto:
<FilesMatch \.php$>
    SetHandler proxy:unix:/run/php/php7.1-fpm.sock
</FilesMatch>
Pracuji na Linuxu, takže ta konfigurace může vypadat jinak na Windows. Na macOS možná nějak podobně, jelikož je to taky unix systém.

Taky vůbec nepíšeš, pro jaký operační systém problém řešíš. XAMPP i MAMP mohou běžet jak na Windows tak na macOS. Základní myšlenka je ale stejná. Nainstaluješ více verzí php a v konfiguraci apache budeš přepínat, které verzi PHP se má požadavek předávat. Navíc FilesMatch s SetHandler můžeš mít v konfiguracích virtualhostů, takže ti může běžet vedle sebe více PHP procesů a jednotlivé projekty se budou posílat na správnou verzi, podle toho, co zrovna budou mít uvedeno v konfiguraci svého virtualhostu.
xlifer
Profil
Keeehi:
Reším to na OS Windows, což XAMPP i nově MAMP jsou dostupné pro Windows.

Našel jsem tento návod:
www.kutac.cz/blog/weby-a-vse-okolo/vice-verzi-php-pod-jednim-apache-serverem

Kde postupem vychází s instalace XAMPPu a pro použití více rozdílných verzí se musí tedy přejít na FastCGI? Takže jsem od změny jednoho řádku, trochu jinde.

A pokud bych chtěl jít historicky ještě pod verzi PHP 5.5, tak není podporován Apache 2.4, ale pouze 2.3, 2.2 a nižší, což ale neumí řešit ani MAMP Pro.

Takže pokud se odrazím od instalace XAMPPu s verzí PHP 7.2.1, tak se mi asi stejně nepodaří rozběhnout např. PHP 5.2.17?
Keeehi
Profil
xlifer:
Takže jsem od změny jednoho řádku, trochu jinde.
Tak při instalaci to dá samozřejmě více práce. Samotné měnění verzí už je pak ale jednoduché. Jinak ten článek je přesně o tom co jsem měl na mysli.

A pokud bych chtěl jít historicky ještě pod verzi PHP 5.5, tak není podporován Apache 2.4
Nedaří se mi nikde takovou informaci najít.

Takže pokud se odrazím od instalace XAMPPu s verzí PHP 7.2.1, tak se mi asi stejně nepodaří rozběhnout např. PHP 5.2.17?
Kód co funguje na 5.2.17 by měl fungovat i na verzi 5.6. Nové verze PHP, které však nemění major verzi (první číslo) by měly být zpětně kompatibilní. Jediné, v čem by se měly lišit je Deprecated chybová hláška, která upozorňuje na to, že daná funkcionalita bude v nové major verzi odstraněna. Tento typ hlášek se dá ale v konfiguraci PHP potlačit a pak by se kód měl chovat stejně jak na 5.2 tak i na 5.6.

Pokud ti tedy jde jen o spouštění aplikací, pak v důsledku by ti mělo stačit mít jen dvě nejnovější verze. Jednu 5 a druhou 7.
xlifer
Profil
Keeehi:
Děkuji za info a ještě bych se chtěl zeptat, v čem je podle tebe lepší, resp. proč jsi si vybral právě Nginx namísto XAMPPu, MAMPu a podobných? Mě ješte mile překvapil AMPPS, který jsem teď zkoušel, je zdarma a má pěkné možnosti nastavení, je tedy velmi blízkou alternativnou MAMP Pro.
Keeehi
Profil
xlifer:
To o čem píšeš, (XAMPP, MAMP, AMPPS) nepatří do samé skupiny jako Nginx. To tvoje jsou "programy" které ti nainstalují balíček programů. Počáteční písmena těchto programů pak vytváří název toho balíčku programů. Oproti tomu Nginx je jen obyčejný HTTP server. V případě těch balíčků je HTTP serverem Apache. Takže porovnávat se dá Apache a Nginx. A proč používám Nginx? Mám stejné prostředí jako používáme na produkci. Na lokální vývoj je ale asi uplně jedno, zda máš na počítači Apache nebo Nginx.
M4n
Profil *
xlifer:
pro použití více rozdílných verzí se musí tedy přejít na FastCGI?
Nebo jen na obyčejné CGI. Na testovacím serveru to nebude vadit, navíc všechny ty verze PHP zbytečně nepoběží na pozadí.

V konfiguraci Apache je to pak už jen otázka definování CGI akce pro určitý MIME typ v daném virtual-hostu.
Action application/x-httpd-php /local-bin/php70-cgi
xlifer
Profil
Keeehi:
Děkuji za upřesnění. Po přečtení všech dostupných informací a diskuzí o Nginxu jsem měl dojem, že je to něco, co začíná být teď poslední dobou stále více "in" a budoucnost Apache je na ústupu, ale asi to tak úplně nebude. Navíc v případě, že projekty využívají "oblíbený" htaccess, tak je Nginx nepoužitelný, resp. musí se htaccess přepsat do pravidel Nginxu, existuje už i nějaký konvertor na převod htaccess do pravidel Nginxu, ale stejně spousta věcí z původního htaccessu nebude fungovat, musí se řešit jinak. Zkrátka to není pouze rozchodit Nginx a nahrát tam projekt (jak jsem si původně myslel), který běžel na Apache. Ještě by mě zajímalo, jak se řeší na Nginxu více projektů, když na Apache serveru může mít každý svůj htaccess, který pohodlně nahraji do složky projektu. V Nginxu to asi pravděpodobně musí být pro všechny projekty v jednom conf souboru Nginxu, což není úplně přehledné, ale to teď pouze tipuji, protože Nginx neznám.
Keeehi
Profil
xlifer:
Ano, htaccess je oblíbený, protože se hodí začátečníkům a na webhostingy. To jsou takové ty případy minivěcí, kde je to strašně pohodlné. Trochu tím trpí výkon, protože apache pak musí pro každý požadavek projít několik adresářů a podívat se, jestli tam náhodou není htaccess a pokud je, tak ho musí i zpracovat. Když si vezmeš, že jedno načtení stránky v průměru pošle tak desítky požadavků na server, tak se to už lehce nastřádá. Tohle všechno nginx dělat nemusí. Nejen kvůli tomu je považován za výkonnější. Což je to, co firmy zajímá. A že to nemůže mít konfigurační soubor v každé složce? U firem to je jedno. Stejně mají většinou jen jeden projekt na jednom serveru. Ty větší mají farmu serverů a člověka (či tým) co se o ty servery stará a tak. A ti by určitě nebyli šťastní z konfigruačních souborů, které by se jim mohli objevit kdekoli v projektu.
Jak už jsem psal, mně osobně nejde o výkon, já ho mám kvůli tomu, že ho máme v práci a proto, že jsem se s ním chtěl naučit pracovat. To že nemám htaccess mi vůbec nevadí. To, proč ho lidi potřebují jsou v 99 % případů hezké adresy. No a jelikož to všechny projekty prakticky vždy dělají stejně (pokud je požadavek na reálný soubor, tak ho vrať, pokud takový soubor neexistuje, podstrč index.php) tak nebylo problém nakonfigurovat nginx obecně pro všechny moje projekty. Dokonce mi to konfiguraci i usnadnilo. U apache jsem musel pro každý projekt vždy vytvořit virtualhost. V konfiguraci nginx se dají používat proměnné, takže mi stačí jeden univerzální virtualhost, který podle url mění cestu k projektu. Když tedy vytvořím nový projekt, nemusím nikde nic měnit, ani nic přidávat.
xlifer
Profil
Keeehi:
Rozumím, souhlasím a rád bych také začal používat Nginx. Je pravda, že Apache používám (a určitě ne jenom já) hlavně proto, že tam mám projekty, které mají nastavené htaccessy hlavně kvůli hezkým URL adresám. Pokud lze nastavit v Nginx pravidlo jak píšeš "pokud je požadavek na reálný soubor, tak ho vrať, pokud takový soubor neexistuje, podstrč index.php", tak pak bych s tím neměl problém, protože hezké URL řeším (rozeberu) pak už přímo v PHP. Můžeš mě prosím ukázat jak takové pravidlo do Nginxu napsat?
Keeehi
Profil
Tady máš celou konfiguraci ("virtualhostu") co používám. Ono to není úplně jedno pravidlo, ale je to snad myslím pochopitelné. To testování na existenci dělají řádky try_files.

server {
    listen 127.0.0.1:80;
    server_name ~(?<domain>[^.]+)\.my$;

    root /var/www/projects/$domain;
    index index.php index.html;

    # Deny hidden files.
    location ~ /\.  {
        deny all;
        break;
    }

    # Hide this files from users.
    location ~* .*\.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$ {
        return 304;
        break;
    }

    location ~* .*\.(avi|mkv|scss|css|js|htc|html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|otf|odb|odc|odf|odg|odp|ods|odt|ogg|otf|pdf|png|pot|pps|ppt|pptx|ra|ram|svg|svgz|swf|tar|tif|tiff|ttf|ttc|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$ {
        tcp_nodelay off;
        access_log off;
        log_not_found off;
        expires   14d;
   
        # This is cool because no php is touched for static content
        try_files $uri @rewrite;
    }

    location / {
        # This is cool because no php is touched for static content
        try_files $uri $uri/ @rewrite;
    }

    location @rewrite {
        # Some modules enforce no slash (/) at the end of the URL
        # Else this rewrite block wouldn't be needed (GlobalRedirect)
        rewrite ^/(.*)$ /index.php?q=$1;
    }

    location ~ \.php$ {
        include /etc/nginx/snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.1-fpm.sock;
        break;
    }
}

/etc/nginx/snippets/fastcgi-php.conf
# regex to split $uri to $fastcgi_script_name and $fastcgi_path
#fastcgi_split_path_info ^(.+\.php)(/.+)$;
#
# Check that the PHP script exists before passing it
#try_files $fastcgi_script_name =404;
#
# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
#set $path_info $fastcgi_path_info;
#fastcgi_param PATH_INFO $path_info;
#
#fastcgi_index index.php;
#include fastcgi.conf;


include php-fpm-params.inc;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
fastcgi_intercept_errors on;
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
#fastcgi_pass 127.0.0.1:9000;

/etc/nginx/php-fpm-params.inc
#fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
#fastcgi_param  QUERY_STRING       $query_string;
#fastcgi_param  REQUEST_METHOD     $request_method;
#fastcgi_param  CONTENT_TYPE       $content_type;
#fastcgi_param  CONTENT_LENGTH     $content_length;
#
#fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
#fastcgi_param  REQUEST_URI        $request_uri;
#fastcgi_param  DOCUMENT_URI       $document_uri;
#fastcgi_param  DOCUMENT_ROOT      $document_root;
#fastcgi_param  SERVER_PROTOCOL    $server_protocol;
#fastcgi_param  REQUEST_SCHEME     $scheme;
#fastcgi_param  HTTPS              $https if_not_empty;
#
#fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
#fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
#
#fastcgi_param  REMOTE_ADDR        $remote_addr;
#fastcgi_param  REMOTE_PORT        $remote_port;
#fastcgi_param  SERVER_ADDR        $server_addr;
#fastcgi_param  SERVER_PORT        $server_port;
#fastcgi_param  SERVER_NAME        $server_name;
#
# PHP only, required if PHP was built with --enable-force-cgi-redirect
#fastcgi_param  REDIRECT_STATUS    200;



fastcgi_param  HTTP_COOKIE        "${http_x_cookie}; ${http_cookie}";
fastcgi_param  SCRIPT_FILENAME    $realpath_root$fastcgi_script_name;
fastcgi_param  SERVER_PORT        80;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  HTTPS              $https if_not_empty;
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
xlifer
Profil
Keeehi:
Moc díky. Pokusím se tím nějak prokousat...

Vaše odpověď

Mohlo by se hodit

Pokuste se již v titulku uvést název programu související s tématem.

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: