標籤:adb product 系統 redis mcrypt cgi 錯誤提示 解決方案 提示
PHP7與PHP5共存於CentOS7
原文參考
原理
思路很簡單:PHP5是通過yum安裝的在/usr/,通訊端在/var/run/php-fpm.socket,PHP7自己編譯裝在/usr/local/php7,通訊端在/var/run/php7-fpm.socket,nignx根據應用需要跑的環境指定fastcgi_pass。
或者兩個不同的連接埠,一個使用預設的9000,一個使用9002
編譯並安裝PHP7
yum安裝編譯需要的各種依賴包
yum install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel gmp gmp-devel libmcrypt libmcrypt-devel readline readline-devel libxslt libxslt-devel -y
接著到官網下載最新的PHP源碼,解壓
cd ~ wget http://am1.php.net/distributions/php-7.1.8.tar.gz tar xvf php-7.1.8.tar.gz cd php-7.1.8
然後設定編譯參數,這裡有幾個事情要提一下:
- 為了減少後續因為許可權導致的問題,建議將nginx和php-fpm用相同的使用者和使用者組即(--with-fpm-user=nginx --with-fpm-group=nginx)
- 為了減少多網卡等複雜網路環境造成的問題,在不使用ipv6網路的情況下關閉ipv6的支援(--disable-ipv6)。 根據自己的情況選擇
- 開啟mysql資料庫的API擴充(--with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd )
- 開啟opcache擴充(--enable-opcache)
完整的編譯參數:
./configure --prefix=/usr/local/php7 --with-config-file-path=/usr/local/php7/etc --with-config-file-scan-dir=/usr/local/php7/etc/php.d/ --disable-ipv6 --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --enable-inline-optimization --disable-debug --disable-rpath --enable-shared --enable-soap --with-libxml-dir --with-xmlrpc --with-openssl --with-mcrypt --with-mhash --with-pcre-regex --with-sqlite3 --with-zlib --enable-bcmath --with-iconv --with-bz2 --enable-calendar --with-curl --with-cdb --enable-dom --enable-exif --enable-fileinfo --enable-filter --with-pcre-dir --enable-ftp --with-gd --with-openssl-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-freetype-dir --enable-gd-native-ttf --enable-gd-jis-conv --with-gettext --with-gmp --with-mhash --enable-json --enable-mbstring --enable-mbregex --enable-mbregex-backtrack --with-libmbfl --with-onig --enable-pdo --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-zlib-dir --with-pdo-sqlite --with-readline --enable-session --enable-shmop --enable-simplexml --enable-sockets --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-wddx --with-libxml-dir --with-xsl --enable-zip --enable-mysqlnd-compression-support --with-pear --enable-opcache
設定檢查通過之後就是喜聞樂見的make和make install了,有興趣的可以在make install之前make test一下。
PS: make test很耗費時間,但其實跟make install差不多,在make test後,直接make install很快
配置PHP7
cp php.ini-production /usr/local/php7/etc/php.ini cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf
修改相應的設定檔(根據需求修改),下面是配置時區
date.timezone ="Asia/Shanghai"
a.centos7版本開機檔案的修改
make install無錯安裝成功之後就開始進行配置,首先將預設配置複製到指定位置
cp -R ./sapi/fpm/php-fpm.service /usr/lib/systemd/system/php7-fpm.service
/usr/lib/systemd/system/php7-fpm.service
修改相應路徑就好了。。。我也沒有測試
b.centos6版本開機檔案的修改
cp -R ./sapi/fpm/init.d.php-fpm /etc/init.d/php7-fpm # 這樣啟動的時候名字不會衝突 chmod +x /etc/init.d/php7-fpm
修改啟動項名稱vi /etc/init.d/php7-fpm
prefix=/usr/local/php7 exec_prefix=${prefix} php_fpm_BIN=${exec_prefix}/sbin/php7-fpm php_fpm_CONF=${prefix}/etc/php7-fpm.conf php_fpm_PID=${prefix}/var/run/php7-fpm.pid
添加開機啟動,建立軟連
chkconfig --add php7-fpmchkconfig php7-fpm on # 這兩步根據需要選擇ln -s /usr/local/php7/bin/php /usr/bin/php
啟動php7-fpm
centos7
systemctl enable php7-fpm.service systemctl start php7-fpm.service
centos6
sudo /etc/init.d/php7-fpm restart
編譯報錯處理
# 找到類似的報錯libiconv_open,因為內容找不到了PHP7 編譯安裝時碰到 undefined reference to `libiconv_open‘ 問題解決方案 系統內容centos6.7make install 的時候遇到錯誤:ext/gd/libgd/.libs/gdkanji.o: In function `do_convert‘:/root/src/php-7.1.3/ext/gd/libgd/gdkanji.c:349: undefined reference to `libiconv_open‘/root/src/php-7.1.3/ext/gd/libgd/gdkanji.c:364: undefined reference to `libiconv‘/root/src/php-7.1.3/ext/gd/libgd/gdkanji.c:380: undefined reference to `libiconv_close‘ext/iconv/.libs/iconv.o: In function `php_iconv_stream_filter_dtor‘:/root/src/php-7.1.3/ext/iconv/iconv.c:2565: undefined reference to `libiconv_close‘ext/iconv/.libs/iconv.o: In function `php_iconv_stream_filter_ctor‘:/root/src/php-7.1.3/ext/iconv/iconv.c:2591: undefined reference to `libiconv_open‘ext/iconv/.libs/iconv.o: In function `_php_iconv_strlen‘:/root/src/php-7.1.3/ext/iconv/iconv.c:754: undefined reference to `libiconv_open‘/root/src/php-7.1.3/ext/iconv/iconv.c:778: undefined reference to `libiconv‘/root/src/php-7.1.3/ext/iconv/iconv.c:812: undefined reference to `libiconv_close‘解決方案:vim Makefile,添加"-liconv":結果如下所示:EXTRA_LIBS = -lcrypt -lresolv -lcrypt -lrt -lpng -lz -lcurl -lz -lrt -lm -ldl -lnsl -lxml2 -lz -lm -ldl -lcurl -lxml2 -lz -lm -ldl -lxml2 -lz -lm -ldl -lcrypt -lxml2 -lz -lm -ldl -lxml2 -lz -lm -ldl -lxml2 -lz -lm -ldl -lcrypt -liconv再次 make install 通過
安裝擴充模組mysql模組
由於PHP從5.x開始,PHP串連MYSQL無論使用哪種方式都是使用的mysqlnd驅動,且PHP7已經正式移除了mysql擴充,由於新特性的原因,PHP7針對資料庫主機地址為localhost和127.0.0.1時分別會採用unix domain socket和TCP/IP兩種不同的方式串連MySQL服務。
而採用unix domain socket方式時PHP7會使用預設的/tmp/mysql.sock作為通訊端,但是CentOS7預設MySQL服務MariaDB的通訊端位置為/var/lib/mysql/mysql.sock,於是即使是所有資料庫連接資訊都正確的情況下也會出現諸如“mysqli::real_connect(): (HY000/2002): No such file or directory ” 和 “Error establishing a database connection”之類的錯誤提示。
不過我們公司使用的是--with-pdo-mysql=mysqlnd 所以沒有出現mysql串連問題,這裡給遇到的同學一個連結php7_mysql擴充模組安裝
redis模組
1.git clone:
git clone https://github.com/phpredis/phpredis.git
官網:https://github.com/phpredis/phpredis
切換分支:
git checkout -b php7 origin/php7
2.檢查PHP擴充
/usr/local/php7/bin/phpize # 根據個人路徑來,如果是php5的擴充模組就不是這個結果了
3.建立編譯串連、安裝
./configure --with-php-config=/usr/local/php7/bin/php-configmakemake testmake install
4.檢查so檔案
cd /usr/local/php7/lib/php/extensions/no-debug-non-zts-20160303 # 這裡的家目錄不一樣,主要是還是最後一級目錄名稱ls
5.修改php.ini
vi /usr/local/php7/etc/php.ini添加:extension="redis.so"
6.檢查模組
php7 -m |grep redis# php -m是檢查擴充模組的
如果有redis則表示正常
7.重啟php-fpm
sudo /etc/init.d/php7-fpm restart
nginx 配置
對應的php啟動不同的連接埠,或者socket模式,
# fastcgi_pass unix:/var/run/php7-fpm.socket;fastcgi_pass fastcgi_pass 127.0.0.1:9002;
php5共存php7