Ubuntu 編譯安裝 PHP7.2 + 編譯 pthreads

編譯環境 Ubuntu 18.04 LTS Server (16.04 Desktop 也編譯過)版本,使用 sudo lsb_release -a 查看
編譯的 PHP 版本爲 7.2.6

Apache 安裝

sudo apt install apache2 apache2-dev

構建環境

sudo apt install build-essential

獲取源碼

去 PHP 官網 http://php.net/downloads.php 下載源碼(能夠選擇離本身近的鏡像),這裏選擇的是 *.xz 版本,體積更小php

wget http://hk2.php.net/get/php-7.2.6.tar.xz/from/this/mirror -O "php-7.2.6.tar.xz"

解壓:html

xz -d php-7.2.6.tar.xz
tar -xvf php-7.2.6.tar

這個時候能夠獲得源碼的目錄 php-7.2.6/mysql

額外的依賴包

sudo apt install libxml2-dev \
libcurl4-openssl-dev \
pkg-config \
libssl-dev \
libtidy-dev \
libxslt1-dev \
libreadline-dev
可能不一樣的機器、啓用不一樣的 PHP 模塊須要的依賴是不同的,能夠按照拋出的錯誤進行安裝(也能夠 Google 錯誤再安裝),缺啥裝啥!

構建

準備編譯 PHP,這裏須要注意的是,CLI 須要多線程功能 pthreads,而 pthreads 是不支持 CGI 的(見項目說明 https://github.com/krakjoe/pthreads#sapi-support);因此要分開編譯,
分別指定不一樣的 php.ini 路徑從而實現 CLI 單獨配置 pthreads CGI 不須要git

開始踩了坑一塊兒編譯,使用統一的配置,致使 Apache 沒法啓動,查看 Apache 的配置卻沒有問題,最後看 /var/log/apache2/error.log 才知道是加載 PHP 模塊的時候出錯了(看文檔要仔細!!!)

編譯 PHP CGI

configure

編譯參數和 CLI 的會有一點點區別,後面會給出相關的解釋github

# CGI 不須要線程安全

./configure --prefix=/opt/php \
--enable-calendar \
--with-curl \
--enable-exif \
--enable-ftp \
--with-gettext \
--enable-mbstring \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-oci8=instantclient,/opt/oracle/instantclient_12_1 \
--with-pdo-oci=instantclient,/opt/oracle/instantclient_12_1,12.1 \
--with-openssl \
--enable-pcntl \
--with-readline \
--enable-shmop \
--enable-sockets \
--with-tidy \
--enable-wddx \
--with-xsl \
--with-xmlrpc \
--enable-zip \
--with-zlib \
--with-config-file-scan-dir=/opt/php/etc \
--with-apxs2=/usr/bin/apxs2 \
--with-config-file-path=/opt/php/cgi \
--disable-cli
若是本身輸入模塊請檢查 ./configure 運行完成以後有沒有 Warnings 頗有可能會拼寫錯誤或者配置名字已經改變

使用將幫助信息 ./configure --help > youfile.txt 來進行對照查看比較方便sql

須要注意的是,這裏配置了的模塊是不須要再在 php.ini 配置的,至關於把這些模塊打包進了 PHP 而不是從外部加載,若是強行配置可能會致使警告說在共享模塊中找不到該模塊apache

apxs2 這個是 apxs - APache eXtenSion tool (使用 man apxs2 獲得)能夠經過 whereis apxs2 找到位置vim

指定 --prefixnix 是一個好習慣,方便卸載(nix 和 Windows 在應用方面架構的差距!)api

make

直接執行安全

make

通常來講參數填寫對了執行就不會有錯誤,看到最後出現了 Build Complete 就運行完了

執行 make 的時候須要很長的時間等待使用 htop 查看資源使用狀況;發現是單核跑的,通過查詢 make 是能夠實現多進程運行的,這樣時間能夠大大減小。

使用 make -j8 (編譯的機器 CPU 是 Core-i7 有 8 個邏輯核心因此使用 8 個進程,根據各自狀況應該設置合適的數字)

若是是第二次或者屢次運行 make 的時候,應該在運行 make 以前運行 make clean;不然可能會出現一些奇奇怪怪的錯誤

make install

make 執行完成以後,執行

sudo make install

通常從輸出的信息中咱們能夠知道安裝到了 /opt/php

若是沒有指定 --prefix ,能夠在這裏把輸出重定向到一個文件,未來要完全刪除的時候有用

配置 php.ini

咱們在配置裏寫了 --with-config-file-path=/opt/php/cgi 因此把源碼目錄下的 php.ini-development (也能夠拷貝生產環境的) 拷貝到 /opt/php/cgi/php.ini

配置 PHP 到 Apache

因爲咱們配置了 --with-apxs2=/usr/bin/apxs2 Apache 須要的模塊已經自動放好了,經過命令能夠啓用 PHP7 模塊

sudo a2enmod php7

重啓 Apache 這個時候發現,HTML 解析正常 PHP 卻輸出了源碼,這表示 PHP 並無被正確的解析。這個時候去 /etc/apache2/mods-available/
看發現只有 php7.load 沒有發現 php7.conf (這裏是經過對比個人 Ubuntu Desktop 發現的,上面是經過 apt 安裝的);
固然通過搜索也有人在 Gist 中說了這個問題 https://gist.github.com/m1st0/1c41b8d0eb42169ce71a
因此在目錄下建立文件 php7.conf

sudo vim /etc/apache2/mods-available/php7.conf

# 從 Ubuntu Desktop 的文件複製了以下內容
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch ".+\.phps$">
    SetHandler application/x-httpd-php-source
    # Deny access to raw php sources by default
    # To re-enable it's recommended to enable access to the files
    # only in specific virtual host or directory
    Require all denied
</FilesMatch>
# Deny access to files without filename (e.g. '.php')
<FilesMatch "^\.ph(p[3457]?|t|tml|ps)$">
    Require all denied
</FilesMatch>

# Running PHP scripts in user directories is disabled by default
# 
# To re-enable PHP in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
<IfModule mod_userdir.c>
    <Directory /home/*/public_html>
        php_admin_flag engine Off
    </Directory>
</IfModule>

從新開啓一下 PHP 擴展 sudo a2enmod php7 重啓 Apache 發現 PHP 已經能夠正常解析;到此 PHP CGI 編譯完成!

編譯 PHP CLI

這裏咱們須要 pthreads 多線程支持(其實配置和 CGI 幾乎能夠通用,只要改動一下配置文件的位置參數)

# CLI 須要線程安全,要使用 pthreads,而且不須要 Apache 配置

./configure --prefix=/opt/php \
--enable-calendar \
--with-curl \
--enable-exif \
--enable-ftp \
--with-gettext \
--enable-mbstring \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-oci8=instantclient,/opt/oracle/instantclient_12_1 \
--with-pdo-oci=instantclient,/opt/oracle/instantclient_12_1,12.1 \
--with-openssl \
--enable-pcntl \
--with-readline \
--enable-shmop \
--enable-sockets \
--with-tidy \
--enable-wddx \
--with-xsl \
--with-xmlrpc \
--enable-zip \
--with-zlib \
--with-config-file-scan-dir=/opt/php/etc \
--with-config-file-path=/opt/php/cli \
--enable-maintainer-zts \
--disable-cgi
  • 去掉了 Apache 相關的配置 apxs2
  • 禁用 cli 改爲了 cgi
  • 配置文件的路徑改成 /opt/php/cli

其餘的配置均保持一致,後面的步驟和上面一致,直到 sudo make install 完成,PHP CLI 部分也已經編譯完成,不要忘了將 php.ini 拷貝一份到 cli 目錄。

創建符號連接

使用符號鏈接咱們能夠直接在命令行中使用 php

sudo ln --symbolic /opt/php/bin/php /usr/bin/php

固然這裏也能夠把 bin 目錄下的其餘可執行文件進行設置,看我的需求

到這裏基本上 PHP 已經編譯好了並能夠在命令行中使用了。

編譯 pthreads

PHP 的多線程特性不是官方實現的,這個項目在 Github

從頁面上找到 master 分支的 zip 下載連接(clone 也能夠)

# 下載
wget https://github.com/krakjoe/pthreads/archive/master.zip -O pthreads-master.zip
# 解壓
unzip pthreads-master.zip
# 複製到 ext 目錄下
mv pthreads-master ext/pthreads
# 進入 pthreads 的目錄
cd ext/pthreads/

接下來運行 phpize 生成 configure

/opt/php/bin/phpize

運行 configure

./configure --with-php-config=/opt/php/bin/php-config --prefix=/opt/php

運行完成以後和上面同樣的運行 make && make install,這個時候應該會生成文件 /opt/php/lib/php/extensions/no-debug-zts-20170718/pthreads.so

加載 pthreads 模塊到 PHP,編輯 php.ini

sudo vim /opt/php/conf.d/php.ini

# 加入以下的行
extension=pthread

檢查 PHP 已經加載的模塊,使用 php -m 查看已經加載的模塊列表,應該 pthreads 已經出如今列表中了

到此基本上全部的安裝都完成了

相關文章
相關標籤/搜索