Kod PHP nie jest wykonywany, zamiast tego kod wyświetla się na stronie

319

Próbuję wykonać kod PHP w projekcie (używając Dreamweaver), ale kod nie jest uruchamiany.

Kiedy sprawdzam kod źródłowy, kod PHP pojawia się jako tagi HTML (widzę go w kodzie źródłowym). Apache działa poprawnie (pracuję z XAMPP), strony PHP są otwierane poprawnie, ale kod PHP nie jest wykonywany.

Czy ktoś ma sugestie na temat tego, co się dzieje?

Uwaga: plik ma już nazwę jakofilename.php

Edycja: Kod ..:

<?
include_once("/code/configs.php");
?>

Wydruk

Gui
źródło
44
Czy używasz krótkich tagów <?zamiast <?php?
Dan Grossman
28
Nigdy nie używaj krótkich tagów. ( <?). Są przestarzałe, tak naprawdę nie działają w wielu miejscach, a poza tym są zupełnie niepotrzebne. Zapisanie trzech naciśnięć klawiszy nie jest prawidłowym powodem, aby pozwolić na awarię kodu na prawdopodobnie połowie serwerów, na których może on działać.
mopsyd
10
@mopsyd Gdzie to znaczy, że krótkie tagi są przestarzałe? Pamiętaj, że krótkie tagi nie są takie same jak krótkie tagi echa , a krótkie tagi echa są domyślnie obsługiwane od PHP 5.4, niezależnie od short_open_tagustawienia.
Kyle Anderson
5
Wiem, że krótkie znaczniki nie są krótkimi znacznikami echa, dlatego w komentarzu określiłem, o czym mówiłem. W momencie pisania tego artykułu krótkie znaczniki zostały oznaczone jako przestarzałe w wydaniu php 6, choć od tamtej pory najwyraźniej to się zmieniło. Nadal istnieje problem polegający na tym, że wiele serwerów ma je wyłączone, co znacznie zmniejsza przenośność kodu. Nie dotyczy to krótkich znaczników echa ( <?=), które powinny działać poprawnie na php 5.4+ bez względu na ustawienia serwera.
mopsyd
3
głupie gadanie o krótkich tagach. Długie metki są do bani i są brzydkie. Nigdy nie miałem problemu przez 10 lat programowania php. Prawie nigdy nie stanowią problemu
Danial,

Odpowiedzi:

417

Wygląda na to, że coś jest nie tak z konfiguracją, oto kilka rzeczy, które możesz sprawdzić:

  1. Upewnij się, że PHP jest zainstalowany i działa poprawnie. Może to zabrzmieć głupio, ale nigdy nie wiadomo. Łatwym sposobem sprawdzenia jest uruchomienie php -vz wiersza poleceń i sprawdzenie, czy zwraca informacje o wersji lub błędy.

  2. Upewnij się, że moduł PHP znajduje się na liście i nie ma komentarza w httpd.conf twojego Apache. Powinno to być coś LoadModule php5_module "c:/php/php5apache2_2.dll"w stylu pliku. Wyszukaj LoadModule phpi upewnij się, że nie ma ;przed nim komentarza ( ).

  3. Upewnij się, że plik httpd.conf Apache ma w nim typ PHP MIME. Tak powinno być AddType application/x-httpd-php .php. To mówi Apache, aby uruchamiał .phppliki jako PHP. Wyszukaj AddType, a następnie upewnij się, że jest wpis dla PHP i że nie jest on komentowany .

  4. Upewnij się, że plik ma .phprozszerzenie lub dowolne rozszerzenie określone w definicji MIME w punkcie # 3, w przeciwnym razie nie zostanie wykonane jako PHP.

  5. Upewnij się, że nie używasz krótkich tagów w pliku PHP ( <?), nieone domyślnie włączone na wszystkich serwerach i ich użycie jest odradzane. Użyj <?phpzamiast (lub włączyć krótkie znaczniki w pliku php.ini ze short_open_tag=Onjeśli masz kod, który opiera się na nich).

  6. Upewnij się, że uzyskujesz dostęp do swojego pliku przez serwer sieciowy, używając adresu URL takiego jak http://localhost/file.phpnie poprzez dostęp lokalnyfile://localhost/www/file.php

Na koniec sprawdź instrukcję PHP, aby uzyskać dalsze wskazówki dotyczące instalacji .

Shmeeps
źródło
14
Nie wiem dlaczego, ale instalator PHP 5.3.15 nie dodaje wiersza AddType application/x-httpd-php .php. Wielkie dzięki!!
MatuDuke,
7
@shmeeps: Gdzie widziałeś, że krótkie tagi są przestarzałe? Przeprowadziłem pewne poszukiwania i mogę znaleźć tylko rekomendacje przeciwko nim, nic na temat deprecjacji. Przyznane aplikacjom, które mają być dystrybuowane, lepiej jest używać <? Php w przypadku, gdy serwer hostingowy nie ma ich włączonych, ale w przypadku aplikacji, w których masz pełną kontrolę nad serwerem, na którym będą one uruchomione, ja nie zobacz powód, aby ich nie używać.
ClarkeyBoy,
3
punkt nr 6 działał dla mnie .. dostęp lokalny nie korzysta z serwera apache
KawaiKx
6
punkt 2 działał dla mnie w bezpieczny sposób -apt-get purge apache2; apt-get install apache2 libapache-mod-php5
ulkas
1
@full_prog_full Spróbuj załadować plik z .phprozszerzeniem z zawartością <?php echo("Success"); ?>i sprawdź, czy dostęp do pliku przez przeglądarkę internetową powoduje wyświetlenie „Sukcesu” bez powiązanego kodu PHP.
shmeeps 18.04.16
61

php7:

sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php7.0-fpm
sudo service apache2 restart
sj59
źródło
24
Chociaż ten fragment kodu może rozwiązać pytanie, w tym wyjaśnienie, w jaki sposób i dlaczego to rozwiązuje, problem naprawdę pomógłby poprawić jakość twojego postu. Pamiętaj, że odpowiadasz na pytanie czytelników w przyszłości, a nie tylko osoby, która zadaje teraz pytanie! Proszę edytować swoje odpowiedzi, aby dodać wyjaśnienie, i dać wskazówkę co zastosować ograniczenia i założenia.
Toby Speight
4
Ta odpowiedź jest związana z linuksem, ponieważ sekcja tematów wyraźnie korzysta z systemu Windows.
Raymond Nijland
3
@ RaymondNijland prawda, ale to kanoniczne i znalazłem to pytanie i uratowało mnie to po ponad godzinie rozwiązywania problemów.
Goose
Jak i dlaczego: Dzieje się tak, gdy PHP7 nie konfiguruje domyślnej usługi szybkiego CGI w skrypcie make. sudo a2enmod proxy_fcgi setenviftworzy trzy nowe mody /mods-available/proxy.conf proxy_fcgi.load proxy.loadPodobnie, sudo a2enconf php7.0-fpmtworzy plik konfiguracyjny /conf-available/php7.0-fpm.confPo zakończeniu tej czynności Apache2 może następnie uruchomić moduł PHP7 jako usługę szybkiego CGI.
Talvi Watia
33

Używam Apache na Ubuntu i moim problemem było to, że w /etc/apache2/mods-available/php5.confpliku brakuje tego:

<FilesMatch ".+\.ph(p[345]?|t|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>

Dodałem go z powrotem i php poprawnie analizował pliki php.

Matt McDonald
źródło
31

uwaga dla użytkowników php 7, dodaj to do pliku httpd.conf:

# PHP 7 specific configuration
<IfModule php7_module>
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
    <IfModule dir_module>
        DirectoryIndex index.html index.php
    </IfModule>
</IfModule>
EdC
źródło
4
Tylko po to, aby pomóc innym ludziom w tym problemie. httpd.confPlik znajduje się w /etc/apache2/httpd.confJeśli używasz Ubuntu, byłoby apache2.confw tym samym katalogu, który musi zostać zmodyfikowany do PHP7.
Ahmed Sagarwala
23

Znalazłem inny problem powodujący ten problem i już go rozwiązałem. Przypadkowo zapisałem swój skrypt w UTF-16kodowaniu. Wygląda na to, że PHP5 <?phpdomyślnie nie rozpoznaje tagu w kodowaniu 16-bitowym.

Arrvi
źródło
18

Publikuję tę odpowiedź, ponieważ mój interfejs administracyjny Virtualmin / Webmin uznał, że dobrym pomysłem jest wyłączenie mojego silnika PHP. Znalezienie rozwiązania zajęło mi trochę czasu, więc pomyślałem, że podzielę się tym z wami:

Upewnij się również, że żaden plik konfiguracyjny Twojej witryny związany z tym konkretnym hostem lub wirtualnym hostem nie zawiera żadnych wartości php_admin_value, które wyłączają PHP, jak poniżej:

php_admin_value engine Off

W razie wątpliwości skomentuj to ...

# php_admin_value engine Off

I uruchom ponownie serwer WWW.

Henry van Megen
źródło
1
Gdzie dokładnie są te ustawienia konfiguracji?
cronoklee
2
@cronoklee W ustawieniach vHost httpd.conf. W przypadku istniejących hostów musisz edytować konfigurację apache w webmin. W przypadku przyszłych hostów przejdź do virtualmin> szablon serwera> witryna apache. W każdym razie nie jest to tak bezpieczne jak fastcgi - domyślna opcja virtualmin. Tak więc poprawnym podejściem powinno być rozwiązanie problemu, dlaczego fcgi nie działa, na przykład może to być spowodowane uprawnieniami do plików.
Sheepy
Jeśli używasz wersji Apache, która nie ma httpd.conf, zajrzyj do /etc/apache2/mods-enabled/php7.conflubphp5.conf
Sam Malayek,
W razie wątpliwości co do lokalizacji określonego ustawienia konfiguracji, zawsze możesz użyć grep, aby znaleźć to, czego szukasz, (na przykład w tym przypadku), wpisując:sudo grep php_admin_value /etc/* -R
Henry van Megen
16

Właśnie otwierasz plik php w przeglądarce. Musisz go otworzyć, używając adresu localhost. jeśli otworzysz plik bezpośrednio ze swojego katalogu, w żadnym wypadku nie wykona on kodu php.

użyj: http://locahost/index.phplubhttp:127.0.0.1/index.php

Włącz krótki kod php. W twoim przypadku używasz <?krótkiego kodu php <?php. Domyślnie krótkie kody php są wyłączone.

Użyj także: sudo apt-get install php5 libapache2-mod-php5 php5-mcryptjeśli jesteś użytkownikiem Ubuntu.

Hasan Baig
źródło
1
Dlaczego mcrypt jest wymagany, gdy tylko dołączam plik? Powinieneś zauważyć, że to pytanie jest stare, a kwestia krótkich tagów była wspomniana 16 razy, również w głównym komentarzu do mojego pytania.
Gui,
1
Po prostu udostępniam swoje rozwiązanie, miałem również ten sam błąd i po wykonaniu polecenia mcrypt mój problem został rozwiązany. możesz także spróbować.
Hasan Baig,
domyślnie krótkie kody php są włączone. short_open_tag = On (wartość domyślna = ON) w php 5.6
zond
To był mój problem, moja konfiguracja virtualmin / apache dotyczyła 127.0.0.2, ale umieszczałam mój zewnętrzny adres IP w przeglądarce, właśnie zaktualizowałam konfigurację v / a i teraz działa
Hayden Thring
Właśnie brakowało mi libapache2-mod-php7.3.
dxvargas,
8

Wiem, że to powinno zabrzmieć głupio ... ale rzadko się zdarza.

Sprawdź, czy próbujesz wykonać php z

**http://localhost/info.php**

i nie z

file:///var/www/info.php

ps> możesz zauważyć, że jeśli piszesz z powłoki

php info.php 

odpowiada kodem (oznacza to funkcje php) ..

użytkownik3257072
źródło
PHP działa dobrze (sprawdzane za pomocą wiersza poleceń). ale kiedy uzyskuję dostęp do pliku za pomocą adresu URL, pokazuje kod PHP.
muaaz
8

Zdarzyło mi się to ponownie, wraz z serwerem pobierającym pliki HTML zamiast przetwarzać. Przez pewien czas nie korzystałem z apache serwera WWW i tymczasem Ubuntu zaktualizowało się o dwie kolejne wersje z oryginalnie zainstalowanego LTS. Teraz jest

$ cat /etc/issue
Ubuntu 16.04 LTS

Więc php działał tak:

$ sudo apt-get install lamp-server^
$ sudo a2enmod php7.0
$ sudo service apache2 restart 

Serwer WWW teraz analizował php. Może teraz muszę zaktualizować niektóre strony, ponieważ php7.0 działa teraz tak, jak było przed uruchomieniem php5. No cóż.

ndasusers
źródło
5

Rozwiązałem to, odinstalowując XAMPP i instalując WAMP. Dzięki za pomoc.

Gui
źródło
Jestem Xampp, ale działa dobrze. dowiedziałeś się, dlaczego wyświetlał kod php @Gui
Pie
5

Napotkałem ten problem na php 7.1, który jest dostarczany z High Sierra (OS X 10.13.5), edycja /etc/apache2/httpd.confz następującymi zmianami pomogła:

  1. Odkomentuj tę linię

    LoadModule php7_module libexec/apache2/libphp7.so
  2. Wklej następujące na końcu

    <IfModule php7_module>
        AddType application/x-httpd-php .php
        AddType application/x-httpd-php-source .phps
    
        <IfModule dir_module>
            DirectoryIndex index.html index.php
        </IfModule>
    </IfModule>
AamirR
źródło
Podobnie jak ty możesz sugerować ten sam błąd wersji Wamp 3. W wamp 3. nie ma ścieżki folderu /etc/apache2/httpd.conf. @AamirR
Gem
To działało dla mnie !!! Mój był bardziej dziwnym problemem. Niektóre pliki renderowały PHP, a inne nie, tylko wyświetlały kod.
sjw0525,
4

na mojej instalacji Ubuntu 14.04, apache 2.4, php 5.5.9, próbowałem z sample.php na / var / www / html (domyślny katalog główny dokumentu) i działało dobrze. Problem dotyczył mojej konfiguracji serwerów wirtualnych. Rozwiązaniem było włączenie w katalogu def zawierającym plik .php tej linii:

    php_admin_flag engine on
Rogelio Triviño
źródło
i gdzie powinienem dodać tę linię w pliku Apache w httpd.conf mojego wirtualnego serwera? i używam Webmina
suresh pareek
3

miałem podobny problem, ale w moim przypadku rozwiązanie było inne. mój plik zawierający kod php nazywał się „somename.html”, zmieniłem go na „somename.php” działał dobrze

Netrus
źródło
To również rozwiązało dla mnie. Czy ktoś wie, czy serwer uruchomi php w pliku .html, czy też koniec pliku musi zawsze zostać zmieniony na .php, gdy istnieje linia php do wykonania?
full_prog_full
zależy od ustawień serwera, w większości przypadków zostanie wykonany kod php istniejący w pliku anyfile.html. a jeśli nie, można to zmienić, chociaż idk jak: P
Netrus
3

Aby świeżo skonfigurować LAMP z uruchomionym php 7, edytuj plik /etc/httpd/conf/httpd.conf Uwaga: upewnij się, że wykonałeś kopię zapasową przed zmianą.

Wklej to na samym dole pliku:

<IfModule php7_module>
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

Następnie wyszukaj LoadModule i wklej następujący wiersz:

LoadModule php7_module modules/libphp7.so

Ta linia po prostu poprosi httpd o załadowanie modułu php 7

Następnie uruchom ponownie httpd

Eric Libay
źródło
3

Sprawdź wszystkie zainstalowane pakiety php, używając:

yum list installed | grep remi

Zainstaluj wszystkie odpowiednie pakiety php , zwłaszcza php-devel na swoim komputerze.

Chaitanya Shivade
źródło
3

Upewnij się, że skrypt zawiera

<?php

przed kodem, który powinien zostać wykonany. Nie powinno być przestrzeń pomiędzy <?i phpw tym.

Barmar
źródło
2

To było w moim .htaccess

DirectoryIndex index.html index.htm

index.html zawierał kod PHP. Domyślnie PHP nie przetwarza plików o rozmiarach takich jak htm * jako kod PHP.

Możesz to zmienić, dodając do .htaccess:

<FilesMatch ".+\.html$">
    SetHandler application/x-httpd-php
</FilesMatch>
Jahmic
źródło
1

Myślę, że problem polega na tym, że wyświetla kod zamiast wyniku, ponieważ nie idzie do lokalnego hosta. sprawdź ponownie, pod jakim adresem jesteś. idziesz do lokalnego katalogu plików lub do lokalnego hosta.

ze zrzutu ekranu, który wysłałeś, będzie na twoim komputerze, a nie na localhost.

„file: ///” powinien być „localhost /”

Nav
źródło
1

Ponowna instalacja mcryptmodułu działała dla mnie.

$sudo apt-get install php5-mcrypt
$sudo php5enmod mcrypt
bg
źródło
Szczerze mówiąc, może dlatego, że nie skonfigurowałem poprawnie PHP w moim systemie, ale ponieważ pytanie, które zadałem w związku z tym samym problemem, zostało oznaczone jako duplikat tego pytania, mogłem tylko odpowiedzieć na to pytanie tutaj. Zastanawiam się, dlaczego głosowanie w dół.
bg
Ta odpowiedź jest związana z linuksem, ponieważ sekcja tematyczna wyraźnie korzysta z systemu Windows
Raymond Nijland 24.04.17
1

Miałem przypadek, że przypadkowo zacząłem odznaczać katalog plików w katalogu głównym. Dodał plik .htaccess z mojego folderu plików, który zablokowałby wszystkie php

# If we know how to do it safely, disable the PHP engine entirely.
<IfModule mod_php5.c>
  php_flag engine off
</IfModule>

Dolna linia sprawdź plik .htaccess w katalogu głównym.

albertski
źródło
1

Jeśli masz taką konfigurację:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot "/var/www/example.com"

    <FilesMatch "\.php$">
        SetHandler "proxy:fcgi://127.0.0.1:9000"
    </FilesMatch>
</VirtualHost>

Odkomentuj następne wiersze w pliku httpd.conf

LoadModule proxy_module lib/httpd/modules/mod_proxy.so
LoadModule proxy_fcgi_module lib/httpd/modules/mod_proxy_fcgi.so

Mi to pasuje

użytkownik3890355
źródło
1

Dodaj AddType application/x-httpd-php .phpdo pliku httpd.conf, jeśli używasz Apache 2.4

Ashahmali
źródło
1

Właśnie spędziłem godziny próbując uruchomić PHP 5 z Apache 2.4 na Windows 10 . Wreszcie dla mnie była to literówka w httpd.conf LoadModule . Zwrócił uwagę na pisanie i dokładną ścieżkę modułu przez ostatnią odpowiedź w tym wątku apachelounge z denny2018 . Dziękuję Ci!

Po dwóch nocach odkryłem ... Mój katalog został napisany c:(małe litery)

Miałem, LoadModule php5_module "c:/php/php5apache2.dll"ale poprawne dla Apache 2.4 jest:

LoadModule php5_module "C:/php/php5apache2_4.dll"

Więc też tęskniłem za _4wcześniej (dla apache 2.4 ). Pełny fragment kodu, który działał dla mnie:

# PHP
LoadModule php5_module "C:/php/php5apache2_4.dll"
AddHandler application/x-httpd-php .php
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

Właśnie wypróbowałem PHP 7 . Tam czyta LoadModulewiersz w httpd.conf dla Apache 2.4

LoadModule php7_module "C:/php/php7apache2_4.dll"

Obecnie php manual pokazuje, c:/php/php5apache2.dll które oczywiście należy dostosować.

chwiejąca się bańka
źródło
1

w moim przypadku (Apache / 2.4.34),

po odkomentowaniu konkretnego modułu

„LoadModule php7_module libexec / apache2 / libphp7.so”

od

„/etc/apache2/httpd.conf”

mój problem zniknął.

sh6210
źródło
1

Jeśli jesteśmy na tej samej stronie, wykonaj następujące czynności

sudo apt-get install php -y sudo apt-get install php-{bcmath,bz2,intl,gd,mbstring,mysql,zip,fpm} -y

Aby włączyć PHP 7.2 FPM w Apache2:

a2enmod proxy_fcgi setenvif

a2enconf php7.2-fpm

aktualizacja 2: Apache pobiera plik .php zamiast renderowania

Potem stanąłem przed powyższym problemem. Istnieją podobne pytania, takie jak ten .

Nie wiem dlaczego, ale stało się tak tylko w przypadku moich plików .php w /var/www/html/folderze głównym. wszystko było w porządku dla podkatalogów. (na przykład Wordpress i phpmyadmin działały dobrze)

Oto moje rozwiązanie. Zdecydowałem się włączyć moduł php. więc uruchomiłem polecenie:

a2enmod php7.2

ale dostałem te błędy:

Biorąc pod uwagę zależność mpm_prefork dla php7.2: Biorąc pod uwagę konflikt mpm_event dla mpm_prefork: BŁĄD: Moduł mpm_event jest włączony - nie można kontynuować z powodu konfliktów. Najpierw należy go wyłączyć! Biorąc pod uwagę konflikt mpm_worker dla mpm_prefork: BŁĄD: Nie można włączyć zależności mpm_prefork dla php7.2, przerywanie

więc postanowiłem wyłączyć mpm, uruchamiając następujące polecenia:

sudo a2dismod mpm_prefork
sudo a2dismod mpm_worker
sudo a2dismod mpm_event

następnie uruchom ponownie Apache:

systemctl restart apache2

następnie włącz php7.2 (moja zainstalowana wersja):

sudo a2enmod php7.2

i teraz wszystko działa dobrze.

AmirRezaM75
źródło
0

Inną możliwą przyczyną tego problemu może być to, że próbujesz uruchomić skrypt w „katalogu użytkownika” z UserDirmodułu. Uruchamianie skryptów PHP w katalogach użytkowników jest domyślnie wyłączone. Ten problem napotkasz, jeśli skrypt znajduje się w public_htmlkatalogu w folderze domowym i próbujesz uzyskać do niego dostęp http://localhost/~your_username.

Aby to naprawić, otwórz /etc/apache2/mods-enabled/php7.2.conf. Musisz skomentować lub usunąć blok znaczników na dole, który czyta

<IfModule mod_userdir.c>
    <Directory /home/*/public_html>
        php_admin_flag engine Off
    </Directory>
</IfModule>
mevers303
źródło
-1

plik, który umieścisz w / var / www / html / powinien mieć .php na przykład przykład.php, jeśli jest to przykład, nie działa, ale jeśli zmienisz go na example.php, to zadziała.

Yasin Lachini
źródło