树莓派Raspbian Jessie源码编译安装PHP7
这篇教程介绍如何在树莓派Raspbian Jessie系统上编译PHP7源码,创建Systemd service文件,使用Systemd管理php-fpm.service服务。第一代树莓派是单核CPU,编译MariaDB数据库和PHP7效率非常低。建议使用带二核CPU的Pi2或购买最新的带四核CPU的Pi3。
Raspbian Jessie编译PHP7源码
首先SSH登录树莓派。使用下面的wget命令从php.net下载PHP7源码。
wget http://php.net/distributions/php-7.0.4.tar.gz
下载完后,解压tar.gz文件。
tar xvf php-7.0.4.tar.gz
cd进入解压后生成的php目录。
cd php-7.0.4/
安装编译所需要的依赖工具包。
sudo apt-get install libkrb5-devlibc-client2007e libc-client2007e-dev libcurl4-openssl-dev libbz2-dev libjpeg-dev libmcrypt-dev libxslt1-dev libxslt1.1 libpq-dev build-essential git make
我们都知道,Linux系统编译源码之前需要运行一个名为configure的脚本。在运行configure脚本之前,我先列出我在configure时遇到的两个错误,以及如何解决这两个错误。
错误1
configure: error: Cannot find imap library (libc-client.a). Please check your c-client installation.
这是说找不到libc-client.a这个静态库文件。(.a是archive是缩写,全称为object code archive,即目标代码归档,属于静态库文件。)解决的方法是创建一个软链接。(英文名soft link,又叫做symbolic link。)
sudo mkdir /usr/c-client/ sudo ln -s /usr/lib/libc-client.a /usr/c-client/
错误2
error: Kerberos libraries not found. Check the path given to --with-kerberos (if no path is given, searches in /usr/kerberos, /usr/local and /usr )
这个是说找不到kerberos库文件。其实在安装依赖工包时kerberos的库文件已经安装好了,只是没有被发现。解决办法还是创建软链接。
sudo mkdir /usr/kerberos sudo ln -s /usr/lib/arm-linux-gnueabihf/mit-krb5/* /usr/kerberos
如果你要自己看看是否会出现以上两个错误,那么现在不必创建这两个软链接。如果你不想看见错误,那么现在运行上面四个命令,以避免出现错误。
好了,现在复制下面的configure命令。是的,这里有很多参数。把下面的所有代码一块复制,粘贴到树莓派的终端,再按Enter键运行configure。
./configure \ --prefix=/opt/php-7.0.4 \ --with-config-file-path=/opt/php-7.0.4/etc \ --with-zlib-dir \ --with-freetype-dir \ --enable-mbstring \ --with-libxml-dir=/usr \ --enable-soap \ --enable-calendar \ --with-curl \ --with-mcrypt \ --with-zlib \ --with-gd \ --disable-rpath \ --enable-inline-optimization \ --with-bz2 \ --with-zlib \ --enable-sockets \ --enable-sysvsem \ --enable-sysvshm \ --enable-pcntl \ --enable-mbregex \ --enable-exif \ --enable-bcmath \ --with-mhash \ --enable-zip \ --with-pcre-regex \ --with-pdo-mysql \ --with-mysqli \ --with-mysql-sock=/var/run/mysqld/mysqld.sock \ --with-jpeg-dir=/usr \ --with-png-dir=/usr \ --enable-gd-native-ttf \ --with-openssl \ --with-fpm-user=www-data \ --with-fpm-group=www-data \ --with-libdir=/usr/lib/arm-linux-gnueabihf \ --enable-ftp \ --with-imap \ --with-imap-ssl \ --with-kerberos \ --with-gettext \ --with-xmlrpc \ --with-xsl \ --enable-opcache \ --enable-fpm
configure完编译环境后,让我们来使用make命令来开始编译PHP7源码。
make
如果你的树莓派有4核CPU,那么可以使用-j4选项来并行编译,让4个CPU核心同时工作。
make -j4
我的第一代树莓派是单核的CPU,编译效率非常慢,用了5个小时才编译完成。Pi2和Pi3分别有两核CPU及4核CPU,编译效率会大大提高。
编译完成后,使用下面的命令将PHP7安装到Raspbian Jessie系统。
sudo make install
安装完成时,它会告诉你PHP7的文件都安装到了哪些目录。这是非常有用的信息。
从上面的截图可以发现,php-fpm可执行文件安装在/opt/php-7.0.4/sbin/目录下。 php-fpm的配置文件安装在/opt/php-7.0.4/etc/目录下。可以先尝试启动php-fpm进程。
/opt/php-7.0.4/sbin/php-fpm
出现错误,提示php-fpm.conf配置文件未找到。
我们需要重命名两个文件。
sudo mv /opt/php-7.0.4/etc/php-fpm.conf.default /opt/php-7.0.4/etc/php-fpm.conf sudo mv /opt/php-7.0.4/etc/php-fpm.d/www.conf.default /opt/php-7.0.4/etc/php-fpm.d/www.conf
然后,复制php.ini-production文件到php-fpm的配置目录下,并将它重命名为php.ini。
sudo cp /home/pi/php-7.0.4/php.ini-production /opt/php-7.0.4/etc/
现在就能启动php-fpm进程了。
sudo /opt/php-7.0.4/sbin/php-fpm
与Nginx搭配运行
我们可以使用sudo apt-get install nginx命令从Raspbian软件库中安装Nginx服务器。当然,如果你喜欢尝试编译最新版本的Nginx,可以查看下面的教程。
树莓派Raspbian Jessie源码编译安装Nginx网站服务器
安装Nginx后,打开nginx配置文件,将下面的指令添加到文件中。
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
我的网站根目录是/usr/share/nginx/html,如果你用的是其他目录,那么更改上面的root指令并保存文件。
重新加载Nginx。
sudo sysemctl reload nginx
然后在网站根目录创建一个test.php文件。
sudo nano /usr/share/nginx/html/test.php
将下面的PHP代码粘贴到文件中。
<?php phpinfo(); ?>
保存文件。然后在浏览器的地址栏输入:
ip-of-raspberrypi/test.php
将ip-of-raspberrypi替换成树莓派的真实IP。比如我输入的是192.168.1.102/test.php。如果看见了以下页面,说明php-fpm与Nginx在正常运行。在这里可以查看PHP的各类信息,比如可以发现PHP的版本是7.0.4。
PHP7的优化
启用日志文件
编辑php-fpm.conf文件。
sudo nano /opt/php-7.0.4/etc/php-fpm.conf
找到如下一行文字。
;error_log = log/php-fpm.log
去掉前面的注释符(;)。更改成如下。
error_log = /var/log/php-fpm.log
保存文件。
创建Systemd service文件
为php-fpm创建php-fpm.service文件。
sudo nano /etc/systemd/system/php-fpm.service
将下面的代码粘贴到php-fpm.service文件中。
[Unit] Description=The PHP FastCGI Process Manager After=syslog.target network.target [Service] Type=simple PIDFile=/var/run/php-fpm.pid ExecStart=/opt/php-7.0.4/sbin/php-fpm --nodaemonize --fpm-config /opt/php-7.0.4/etc/php-fpm.conf ExecReload=/bin/kill -USR2 $MAINPID [Install] WantedBy=multi-user.target
保存文件。然后杀死正在运行的php-fpm进程,再用systemctl启动php-fpm进程。
sudo pkill php-fpm sudo systemctl start php-fpm
查看php-fpm的状态。
sudo systemctl status php-fpm
让php-fpm随树莓派开机启动。
sudo systemctl enable php-fpm
编辑www.config文件
sudo nano /opt/php-7.0.4/etc/php-fpm.d/www.conf
找到下面三行文字。
;listen.owner = www-data ;listen.group = www-data ;listen.mode = 0660
去掉这三行前面的分号。再找到下面这一行。
listen = 127.0.0.1:9000
将它更改成:
listen = /var/run/php7-fpm.sock
保存文件。然后打开nginx的配置文件。将fastcgi_pass的值更改成/var/run/php7-fpm.sock。
location ~ \.php$ { root /usr/share/nginx/html; fastcgi_pass unix:/var/run/php7-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
保存文件后重启Nginx以及php-fpm进程。
sudo systemctl restart nginx sudo systemclt restart php-fpm
现在Nginx与php-fpm通过unix socket通信,而不是通过TCP通信。
好了!我们成功地在树莓派Raspbian Jessie系统上编译了PHP7源码,安装PHP7,并能使用Systemd来管理php-fpm服务,让Nginx与php-fpm通过unix socket通信,提高了通信效率。