PHP แสดงผลเป็นข้อความหลังจากอัพเกรด Ubuntu 16.04


20

Apache กำลังแสดงไฟล์ PHP เป็นข้อความหลังจากอัพเกรด Ubuntu 16.04

Apache ได้รับการติดตั้งและใช้งานแล้ว PHP7 ทำงานอยู่ เมื่อฉันรันคำสั่งต่อไปนี้ฉันได้รับผลลัพธ์ที่ถูกต้อง:

php -r 'echo "\n\nYour PHP installation is working fine.\n\n\n";'

อย่างไรก็ตามเมื่อฉันเข้าถึงhttp: //localhost/info.phpหรือไฟล์ php อื่น ๆ ฉันจะได้รับเนื้อหาไฟล์แทนหน้า

ความช่วยเหลือออนไลน์ส่วนใหญ่มีไว้สำหรับ Ubuntu และ PHP เวอร์ชันเก่าดังนั้นฉันไม่แน่ใจว่าเชื่อถือได้หรือไม่

UPDATE: Apache จะไม่เริ่มทำงานหลังจากติดตั้ง libapache2-mod-php7.0 และเปิดใช้งาน php7.0 ดูผลลัพธ์:

douglas@douglas-acer:~$ sudo service apache2 restart
douglas@douglas-acer:~$ sudo apt-get install libapache2-mod-php
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  libapache2-mod-php
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/2.960 B of archives.
After this operation, 15,4 kB of additional disk space will be used.
Selecting previously unselected package libapache2-mod-php.
(Reading database ... 263897 files and directories currently installed.)
Preparing to unpack .../libapache2-mod-php_1%3a7.0+35ubuntu6_all.deb ...
Unpacking libapache2-mod-php (1:7.0+35ubuntu6) ...
Setting up libapache2-mod-php (1:7.0+35ubuntu6) ...
douglas@douglas-acer:~$ sudo service apache2 restart
douglas@douglas-acer:~$ sudo a2enmod php7.0
Considering conflict php5 for php7.0:
Enabling module php7.0.
To activate the new configuration, you need to run:
  service apache2 restart
douglas@douglas-acer:~$ sudo service apache2 restart
Job for apache2.service failed because the control process exited with error code. See "systemctl status apache2.service" and "journalctl -xe" for details.
douglas@douglas-acer:~$ sudo apt-get purge php5
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package 'php5' is not installed, so not removed
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

ผลลัพธ์ของ systemctl status apache2.service:

● apache2.service - LSB: Apache2 web server
   Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled)
  Drop-In: /lib/systemd/system/apache2.service.d
           └─apache2-systemd.conf
   Active: failed (Result: exit-code) since Dom 2016-04-24 08:21:35 BRT; 14s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 9216 ExecStart=/etc/init.d/apache2 start (code=exited, status=1/FAILURE)

Abr 24 08:21:35 douglas-acer apache2[9216]:  * The apache2 configtest failed.
Abr 24 08:21:35 douglas-acer apache2[9216]: Output of config test was:
Abr 24 08:21:35 douglas-acer apache2[9216]: [Sun Apr 24 08:21:35.235583 2016] [:crit] [pid 9226:tid 140666367190912] Apache is running a threade
Abr 24 08:21:35 douglas-acer apache2[9216]: AH00013: Pre-configuration failed
Abr 24 08:21:35 douglas-acer apache2[9216]: Action 'configtest' failed.
Abr 24 08:21:35 douglas-acer apache2[9216]: The Apache error log may have more information.
Abr 24 08:21:35 douglas-acer systemd[1]: apache2.service: Control process exited, code=exited status=1
Abr 24 08:21:35 douglas-acer systemd[1]: Failed to start LSB: Apache2 web server.
Abr 24 08:21:35 douglas-acer systemd[1]: apache2.service: Unit entered failed state.
Abr 24 08:21:35 douglas-acer systemd[1]: apache2.service: Failed with result 'exit-code'.

ผลลัพธ์ของ journalctl -xe

-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit apache2.service has finished shutting down.
Abr 24 08:37:59 douglas-acer systemd[1]: Starting LSB: Apache2 web server...
-- Subject: Unit apache2.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit apache2.service has begun starting up.
Abr 24 08:37:59 douglas-acer apache2[10261]:  * Starting Apache httpd web server apache2
Abr 24 08:37:59 douglas-acer apache2[10261]:  *
Abr 24 08:37:59 douglas-acer apache2[10261]:  * The apache2 configtest failed.
Abr 24 08:37:59 douglas-acer apache2[10261]: Output of config test was:
Abr 24 08:37:59 douglas-acer apache2[10261]: [Sun Apr 24 08:37:59.748900 2016] [:crit] [pid 10271:tid 139911432607616] Apache is running a threa
Abr 24 08:37:59 douglas-acer apache2[10261]: AH00013: Pre-configuration failed
Abr 24 08:37:59 douglas-acer apache2[10261]: Action 'configtest' failed.
Abr 24 08:37:59 douglas-acer apache2[10261]: The Apache error log may have more information.
Abr 24 08:37:59 douglas-acer systemd[1]: apache2.service: Control process exited, code=exited status=1
Abr 24 08:37:59 douglas-acer systemd[1]: Failed to start LSB: Apache2 web server.
-- Subject: Unit apache2.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit apache2.service has failed.
-- 
-- The result is failed.
Abr 24 08:37:59 douglas-acer systemd[1]: apache2.service: Unit entered failed state.
Abr 24 08:37:59 douglas-acer systemd[1]: apache2.service: Failed with result 'exit-code'.
Abr 24 08:37:59 douglas-acer sudo[10258]: pam_unix(sudo:session): session closed for user root
Abr 24 08:38:02 douglas-acer sudo[10276]:  douglas : TTY=pts/18 ; PWD=/home/douglas ; USER=root ; COMMAND=/bin/journalctl -xe
Abr 24 08:38:02 douglas-acer sudo[10276]: pam_unix(sudo:session): session opened for user root by (uid=0)
Abr 24 08:38:38 douglas-acer sudo[10276]: pam_unix(sudo:session): session closed for user root
Abr 24 08:39:01 douglas-acer CRON[10297]: pam_unix(cron:session): session opened for user root by (uid=0)
Abr 24 08:39:01 douglas-acer CRON[10299]: (root) CMD (  [ -x /usr/lib/php5/sessionclean ] && /usr/lib/php5/sessionclean)
Abr 24 08:39:01 douglas-acer CRON[10297]: pam_unix(cron:session): session closed for user root
Abr 24 08:39:01 douglas-acer CRON[10298]: pam_unix(cron:session): session opened for user root by (uid=0)
Abr 24 08:39:01 douglas-acer CRON[10300]: (root) CMD (  [ -x /usr/lib/php/sessionclean ] && /usr/lib/php/sessionclean)
Abr 24 08:39:02 douglas-acer CRON[10298]: pam_unix(cron:session): session closed for user root
Abr 24 08:39:51 douglas-acer sudo[10122]: pam_unix(sudo:session): session closed for user root
Abr 24 08:39:53 douglas-acer sudo[10368]:  douglas : TTY=pts/5 ; PWD=/home/douglas ; USER=root ; COMMAND=/bin/journalctl -xe
Abr 24 08:39:53 douglas-acer sudo[10368]: pam_unix(sudo:session): session opened for user root by (uid=0) 

เกี่ยวกับข้อผิดพลาดApache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHPฉันพบความช่วยเหลือในhttps://wiki.archlinux.org/index.php/Apache_HTTP_Serverเกี่ยวกับปัญหานี้ แต่เส้นทางของไฟล์ไม่ตรงกับที่อยู่ใน Ubuntu ดังนั้นฉันจึงไม่พยายามใช้ การแก้ไขที่แนะนำ

คำตอบ:


27

phpคำสั่งที่ให้บริการโดยphp7.0-cliแพคเกจบน Ubuntu 16.04 การเรียกใช้ CLI นั้นเป็นมุมฉากของการกำหนดค่าเว็บเซิร์ฟเวอร์

คุณต้องติดตั้งและกำหนดค่าหนึ่งในเว็บ SAPIs - apache2, fpm หรือ cgi วิธีที่ง่ายที่สุดคือติดตั้ง apache2 SAPI

  1. ในการติดตั้ง apache2 SAPI ให้เรียกใช้apt-get install libapache2-mod-php(ซึ่งจะเป็นการดึงเวอร์ชัน PHP เริ่มต้นปัจจุบันlibapache2-mod-php7.0) แพ็คเกจควรเปิดใช้งานตัวเองและเปลี่ยนเป็น apache2 prefork MPM ที่รองรับ MPM เท่านั้น ถ้าไม่ใช่ให้ลองเรียกใช้a2enmod php7.0และค้นหาข้อผิดพลาด การติดตั้งควรเปลี่ยนจากเหตุการณ์ที่ MPM prefork MPM โดยอัตโนมัติ แต่ถ้ามันไม่ได้คุณสามารถเปลี่ยนได้ด้วยตนเองโดยการทำตามด้วยsudo a2dismod mpm_eventsudo a2enmod mpm_prefork

  2. การติดตั้ง FPM SAPI เรียกใช้apt-get install php-fpmและเปิดใช้งานแล้ว FPM a2enconf php7.0-fpmโดยการเรียกใช้ FPM SAPI มีความปลอดภัยมากกว่า แต่ยากกว่าในการกำหนดค่าอย่างถูกต้อง

  3. การติดตั้ง CGI SAPI วิ่งapt-get install php-cgiและเปิดใช้งานแล้ว CGI a2enconf php7.0-cgiโดยการเรียกใช้ โปรดอย่า CGI ไม่แนะนำวิธีการเรียกใช้ PHP แต่อาจมีประโยชน์ในการปรับใช้พิเศษ


ฉันได้แก้ไขคำถามของฉันเพื่อให้รายละเอียดเพิ่มเติม
machadoug

@machadoug แก้ไขคำตอบเพื่อรวมคำอธิบายวิธีการเปลี่ยน MPMs
oerdnj

คุณมีความคิดเกี่ยวกับวิธีการแก้ไขหรือไม่?
machadoug

1
@machadoug ใช่ฉันเพิ่ม "การติดตั้งควรเปลี่ยนจากเหตุการณ์ MPM เป็น prefork MPM โดยอัตโนมัติ แต่ถ้าไม่คุณสามารถสลับได้ด้วยตนเองโดยทำ sudo a2dismod mpm_event ตามด้วย sudo a2enmod mpm_prefork"
oerdnj

1
มีขั้นตอนที่หายไปจากตัวเลือก 2 หรือไม่? ฉันติดตั้ง apache2 และ php-fpm แล้วและเรียกใช้คำสั่ง a2enconf ประสบความสำเร็จทุกอย่างและบริการทั้งคู่กำลังทำงานอยู่ แต่ไฟล์ PHP ของฉันกำลังถูกส่งออกโดยตรงโดยไม่ต้องดำเนินการกับ PHP ไม่มีข้อผิดพลาดในบันทึกใด ๆ สำหรับ Apache หรือ PHP-FPM
Andrew Ensley


0

ฉันถูกกัดโดยปัญหานี้ในวิธีที่แตกต่าง:

โดยค่าเริ่มต้นสคริปต์ PHP จะไม่ทำงานในไดเรกทอรีผู้ใช้ ดังนั้นหากเซิร์ฟเวอร์ของคุณรองรับ public_html ในโฟลเดอร์บ้านของผู้ใช้และต้องการให้ผู้ใช้เรียกใช้ php คุณควรลบส่วนphp7.0.confที่ปิดใช้งาน


0

ใน Apache 2.0 ล่าสุดสำหรับ Ubuntu 16.04.2 ฉันพบว่า Apache ได้รับการกำหนดค่าล่วงหน้าด้วยการเปิดใช้งานเธรด แต่ PHP 7 เริ่มต้นไม่ได้ หาก PHP ไม่ได้รวบรวมกับ threadsafe คุณจะต้องเปลี่ยนไปใช้ prefork MPM ซึ่งไม่ได้ใช้เธรด

หากต้องการทำสิ่งนี้ก่อนอื่นให้ปิดการใช้งาน:

sudo a2dismod mpm_event 

จากนั้นเปิดใช้งาน:

sudo a2enmod mpm_prefork 

คุณต้องทำสิ่งนี้ตามลำดับที่ถูกต้องเนื่องจากไม่เกิดร่วมกัน

จากนั้นรีสตาร์ท Apache:

sudo service apache2 restart

คุณน่าจะดีโดยไม่มีปัญหาตอนนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.