sudo -i apt-get update apt-get install -y git bison autoconf build-essential pkg-config gitcore libltdl-dev libbz2-dev libxml2-dev libxslt1-dev libssl-dev libicu-dev libpspell-dev libenchant-dev libmcrypt-dev libpng-dev libjpeg8-dev libfreetype6-dev libMysqLclient-dev libreadline-dev libcurl4-openssl-dev mkdir /etc/PHP7 mkdir /etc/PHP7/cli cd /usr/local/src git clone https://github.com/PHP/PHP-src.git --depth=1 cd PHP-src/ext git clone https://github.com/krakjoe/pthreads -b master pthreads cd .. ./buildconf --force PHP_configure_args="--prefix=/etc/PHP7 --with-config-file-path=/etc/PHP7/cli --with-config-file-scan-dir=/etc/PHP7/cli/conf.d --with-bz2 --with-zlib --enable-zip --with-mcrypt --with-openssl --with-curl --enable-ftp --with-MysqLi --enable-sockets --enable-pcntl --with-pspell --with-enchant --with-gettext --with-gd --enable-exif --with-jpeg-dir --with-png-dir --with-freetype-dir --with-xsl --enable-bcmath --enable-mbstring --enable-calendar --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-maintainer-zts --enable-debug --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --enable-cli --enable-pthreads=shared --with-tsrm-pthreads" ./configure $PHP_configure_args make && make install cd /usr/local/src/PHP-src/ext/intl* chmod a+x /etc/PHP7/bin/PHP-config chmod a+x /etc/PHP7/bin/PHPize /etc/PHP7/bin/PHPize ./configure --enable-intl --with-icu-dir=/usr --prefix='/etc/PHP7' --with-libdir='/lib/x86_64-linux-gnu' --with-PHP-config='/etc/PHP7/bin/PHP-config' make && make install cp /usr/local/src/PHP-src/PHP.ini-production /etc/PHP7/cli/PHP.ini ln --symbolic /etc/PHP7/bin/PHP /usr/bin/PHP ln --symbolic /etc/PHP7/sbin/PHP-fpm /usr/sbin/PHP7-fpm echo 'zend_extension=opcache.so' >> /etc/PHP7/cli/PHP.ini echo 'extension=pthreads.so' >> /etc/PHP7/cli/PHP-cli.ini echo "extension=intl.so" >> /etc/PHP7/cli/PHP.ini
FPM配置. 1)/etc/init.d/PHP7-fpm
#!/bin/sh ### BEGIN INIT INFO # Provides: PHP-fpm PHP7-fpm # required-Start: $remote_fs $network # required-Stop: $remote_fs $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: starts PHP7-fpm # Description: Starts The PHP FastCGI Process Manager Daemon ### END INIT INFO # Author: Ondrej Sury <ondrej@debian.org> # Adapted to PHP7-fpm by @bjornjohansen PATH=/usr/sbin DESC="PHP7 FastCGI Process Manager" NAME=PHP7-fpm DAEMON=/usr/sbin/$NAME DAEMON_ARGS="--daemonize --fpm-config /etc/PHP7/etc/PHP-fpm.conf" PIDFILE=/var/run/PHP7-fpm.pid TIMEOUT=30 SCRIPTNAME=/etc/init.d/$NAME # Exit if the package is not installed [ -x "$DAEMON" ] || exit 0 # Read configuration variable file if it is present [ -r /etc/default/$NAME ] && . /etc/default/$NAME # Load the VERBOSE setting and other rcS variables . /lib/init/vars.sh # Define LSB log_* functions. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. . /lib/lsb/init-functions # Don't run if we are running upstart if init_is_upstart; then exit 1 fi # # Function to check the correctness of the config file # do_check() { /usr/local/lib/PHP7-fpm-checkconf || return 1 return 0 } # # Function that starts the daemon/service # do_start() { # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ || return 1 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ $DAEMON_ARGS 2>/dev/null \ || return 2 # Add code here,if necessary,that waits for the process to be ready # to handle requests from services started subsequently which depend # on this one. As a last resort,sleep for some time. } # # Function that stops the daemon/service # do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred start-stop-daemon --stop --quiet --retry=QUIT/$TIMEOUT/TERM/5/KILL/5 --pidfile $PIDFILE --name $NAME RETVAL="$?" [ "$RETVAL" = 2 ] && return 2 # Wait for children to finish too if this is a daemon that forks # and if the daemon is only ever run from this initscript. # If the above conditions are not satisfied then add some other code # that waits for the process to drop all resources that could be # needed by services started subsequently. A last resort is to # sleep for some time. start-stop-daemon --stop --quiet --oknodo -- retry=0/30/TERM/5/KILL/5 --exec $DAEMON [ "$?" = 2 ] && return 2 # Many daemons don't delete their pidfiles when they exit. rm -f $PIDFILE return "$RETVAL" } # # Function that sends a SIGHUP to the daemon/service # do_reload() { # # If the daemon can reload its configuration without # restarting (for example,when it is sent a SIGHUP),# then implement that here. # start-stop-daemon --stop --signal USR2 --quiet --pidfile $PIDFILE --name $NAME return 0 } case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" do_check $VERBOSE case "$?" in 0) do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; 1) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; status) status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? ;; check) do_check yes ;; reload|force-reload) log_daemon_msg "Reloading $DESC" "$NAME" do_reload log_end_msg $? ;; reopen-logs) log_daemon_msg "Reopening $DESC logs" $NAME if start-stop-daemon --stop --signal USR1 --oknodo --quiet \ --pidfile $PIDFILE --exec $DAEMON then log_end_msg 0 else log_end_msg 1 fi ;; restart) log_daemon_msg "Restarting $DESC" "$NAME" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload|force- reload}" >&2 exit 1 ;; esac
chmod a x /etc/init.d/PHP7-fpm
2)/etc/init/PHP7-fpm.conf
# PHP7-fpm - The PHP FastCGI Process Manager # Original script by Ondřej Surý. Adapted to PHP7-fpm by @bjornjohansen description "The PHP FastCGI Process Manager" author "Ondřej Surý <ondrej@debian.org>" start on runlevel [2345] stop on runlevel [016] # Precise upstart does not support reload signal,and thus rejects the # job. We'd rather start the daemon,instead of forcing users to # reboot https://bugs.launchpad.net/ubuntu/+source/PHP5/+bug/1272788 # # reload signal USR2 pre-start exec /usr/local/lib/PHP7-fpm-checkconf respawn exec /usr/sbin/PHP7-fpm --nodaemonize --fpm-config /etc/PHP7/etc/PHP-fpm.conf
3)/usr/local / lib / PHP7 -fpm-checkconf
#!/bin/sh set -e errors=$(/usr/sbin/PHP7-fpm --fpm-config /etc/PHP7/etc/PHP-fpm.conf -t 2>&1 | grep "\[ERROR\]" || $ if [ -n "$errors" ]; then echo "Please fix your configuration file..." echo $errors exit 1 fi exit 0
chmod a x /usr/local / lib / PHP7 -fpm-checkconf
cp /etc/PHP7/etc/PHP-fpm.conf.default /etc/PHP7/etc/PHP-fpm.conf cp /etc/PHP7/etc/PHP-fpm.d/www.conf.default /etc/PHP7/etc/PHP-fpm.d/www.conf update-rc.d -f PHP7-fpm defaults
service PHP7-fpm start
apt-get update apt-get install -y bison autoconf build-essential pkg-config git-core libltdl-dev libbz2-dev libxml2-dev libxslt1-dev libssl-dev libicu-dev libpspell-dev libenchant-dev libmcrypt-dev libpng-dev libjpeg8-dev libfreetype6-dev libMysqLclient-dev libreadline-dev libcurl4-openssl-dev
rm -rf /etc/PHP7 mkdir -p /etc/PHP7 mkdir -p /etc/PHP7/cli mkdir -p /etc/PHP7/etc
删除当前工作目录中的所有PHP-src文件夹,然后从git branch重新安装
rm -rf PHP-src git clone https://github.com/PHP/PHP-src.git --depth=1
将目录更改为ext以从git下载pthreads
cd PHP-src/ext git clone https://github.com/krakjoe/pthreads -b master pthreads
回到PHP-src作为当前的工作目录
cd ..
构建PHP-src
./buildconf --force
设置适用于您自己案例的配置选项,启用zts,fpm和其他扩展
CONFIGURE_STRING="--prefix=/etc/PHP7 --with-bz2 --with-zlib --enable-zip --disable-cgi \ --enable-soap --enable-intl --with-mcrypt --with-openssl --with-readline --with-curl \ --enable-ftp --enable-MysqLnd --with-MysqLi=MysqLnd --with-pdo-MysqL=MysqLnd \ --enable-sockets --enable-pcntl --with-pspell --with-enchant --with-gettext \ --with-gd --enable-exif --with-jpeg-dir --with-png-dir --with-freetype-dir --with-xsl \ --enable-bcmath --enable-mbstring --enable-calendar --enable-simplexml --enable-json \ --enable-hash --enable-session --enable-xml --enable-wddx --enable-opcache \ --with-pcre-regex --with-config-file-path=/etc/PHP7/cli \ --with-config-file-scan-dir=/etc/PHP7/etc --enable-cli --enable-maintainer-zts \ --with-tsrm-pthreads --enable-debug --enable-fpm \ --with-fpm-user=www-data --with-fpm-group=www-data"
运行configure脚本并安装
./configure $CONFIGURE_STRING make && make install
使以下帮助程序可执行
chmod o+x /etc/PHP7/bin/PHPize chmod o+x /etc/PHP7/bin/PHP-config
现在将目录更改为pthreads并运行PHPize
cd ext/pthreads* /etc/PHP7/bin/PHPize
设置pthreads的配置选项,但要确保enable-pthreads = shared,这是配置的主要方面
./configure --prefix='/etc/PHP7' --with-libdir='/lib/x86_64-linux-gnu' \ --enable-pthreads=shared --with-PHP-config='/etc/PHP7/bin/PHP-config' make && make install
FPM安装涉及将配置文件复制到适当的位置,并在必要时进行更改.
#back to current working directory PHP-src cd ../../ #PHP.ini to be used by fpm-fcgi cp -r PHP.ini-production /etc/PHP7/cli/PHP.ini sed -i 's/;date.timezone =.*/date.timezone = Africa\/Lagos/' /etc/PHP7/cli/PHP.ini cp /etc/PHP7/etc/PHP-fpm.conf.default /etc/PHP7/etc/PHP-fpm.conf cp /etc/PHP7/etc/PHP-fpm.d/www.conf.default /etc/PHP7/etc/PHP-fpm.d/www.conf cp sapi/fpm/init.d.PHP-fpm /etc/init.d/PHP7-fpm sed -i 's/Provides: PHP-fpm/Provides: PHP7-fpm/' /etc/init.d/PHP7-fpm sed -i 's#^PHP_fpm_BIN=.*#PHP_fpm_BIN=/usr/sbin/PHP7-fpm#' /etc/init.d/PHP7-fpm sed -i 's#^PHP_fpm_CONF=.*#PHP_fpm_CONF=/etc/PHP7/etc/PHP-fpm.conf#' /etc/init.d/PHP7-fpm sed -i 's#^PHP_fpm_PID=.*#PHP_fpm_PID=/var/run/PHP7-fpm.pid#' /etc/init.d/PHP7-fpm
将pthreads.so添加到PHP-cli.ini,这将由命令行界面(CLI)使用
cp PHP.ini-production /etc/PHP7/cli/PHP-cli.ini echo "extension=pthreads.so" > /etc/PHP7/cli/PHP-cli.ini
echo "zend_extension=opcache.so" >> /etc/PHP7/cli/PHP.ini ln --symbolic /etc/PHP7/bin/PHP /usr/bin/PHP ln --symbolic /etc/PHP7/sbin/PHP-fpm /usr/sbin/PHP7-fpm chmod +x /etc/init.d/PHP7-fpm update-rc.d PHP7-fpm defaults service PHP7-fpm start
确保以下内容与/etc/PHP7/etc/PHP-fpm.conf中的相同
pid = /var/run/PHP7-fpm.pid error_log = /var/log/PHP7-fpm.log include=/etc/PHP7/etc/PHP-fpm.d/*.conf
确保以下内容与/etc/PHP7/etc/PHP-fpm.d/www.conf中的相同
user = www-data group = www-data listen = /var/run/PHP7-fpm.sock listen.owner = www-data listen.group = www-data listen.mode = 0660 listen.allowed_clients = 127.0.0.1 security.limit_extensions = .PHP .PHP3 .PHP4 .PHP5 .PHP7
确保以下内容与/etc/PHP7/cli/PHP.ini中的相同
cgi.fix_pathinfo=1
要与Nginx一起使用,请在Nginx / sites-available / default中执行以下操作
upstream PHP7-fpm { server unix:/var/run/PHP7-fpm.sock; } server { listen 80 default_server; listen [::]:80 default_server; root /usr/share/Nginx/html; # Add index.PHP to the list if you are using PHP index index.html index.htm; server_name localhost; location / { try_files $uri $uri/ =404; } location ~ [^/]\.PHP(/|$) { try_files $uri =404; fastcgi_split_path_info ^(.+\.PHP)(/.+)$; fastcgi_pass PHP7-fpm; fastcgi_index index.PHP; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } service Nginx restart
要使用pthread,请记住它通过命令行界面工作.假设thread.PHP是你的并行编程代码,你不能通过在浏览器中使用localhost / path / to / thread.PHP在sapi / fpm模式下运行它
<?PHP //thread.PHP class Part extends Threaded{ public function run(){} } $parts = new Part(); for($i=0;$i<4;$i++) $parts[] = $i; ?>
而是通过命令行方法(如“system”)创建一个文件来执行代码thread.PHP
<?PHP system("PHP /path/to/thread.PHP"); ?>