如何在 Ubuntu 14.04 上安装 php7 (zts) + pthreads

how to install php7 (zts) + pthreads on Ubuntu 14.04

我需要帮助来完整安装 PHP7 (ZTS) + Pthreads。我尝试了以下安装,但无法正常工作。

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 "" 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

当我运行下面的时候我得到了错误信息"Job failed to start"

service php7-fpm start

如果有人可以纠正我的错误或提供 PHP7 (ZTS) + Pthreads 启用的完整安装,我将很高兴。

这是 co-install PHP 5.6 & PHP 7.0(zts 与否)

我们踢出旧版 PHP5 包并安装 co-installable PHP 5.6 和 PHP 7.0 包

apt-get autoremove php5 php5-common

apache2 目前应该会报错,但没关系,我们会修复它 添加自定义仓库(php 包 debian 维护者仓库)

add-apt-repository ppa:ondrej/php

编辑源列表文件,很可能是 /etc/apt/sources.list.d/ondrej-ubuntu-php-trusty.list,并取消注释源行 然后:

apt-get update

从存储库安装 non-zts 版本(我们稍后会替换它们)

apt-get install php5.6 php5.6-fpm php7.0 php7.0-fpm

现在开始编译!

apt-get build-dep php7.0
apt-get source php7.0
cd php7.0-*
nano debian/rules

编辑编译配置步骤以添加--enable-maintainer-zts 选项。 搜索 "dh_install" 并删除“--fail-missing”选项。

现在做:

./debian/rules binary

编译会走,打包会失败。但是现在我们有了包结构

查看错误信息,它会抱怨缺少默认配置文件。 将这些文件从 php non-zts 安装复制到包结构中,在错误消息中看到的位置。 现在重铸:

./debian/rules binary

它应该会成功。现在你可以安装除了 snmp 包之外的所有包,我不知道为什么,但是他妈的一切都搞定了。

rm php7.0-snmp*.deb
dpkg -i php7.0*.deb

你可以试试 :

php7.0 -r 'echo "Hello World";'

它应该有效:D 如果你也想要 ZTS,请用 5.6 版本再做一次。

现在让我们将其插入 apache。

a2dismod mpm_prefork
a2enmod mpm_event
a2enmod actions fastcgi proxy proxy_fcgi
a2dismod php5.6
a2dismod php7.0

现在我们通过创建 conf 文件在 apache2 收到的请求和 fpm'cgi 之间创建一个桥梁:

/etc/apache2/conf-available/php5.6-cgi.conf

AddHandler php5-fcgi .php
Action php5-fcgi /php5.6
Alias /php5.6 /usr/lib/cgi-bin/php5.6

FastCgiExternalServer /usr/lib/cgi-bin/php5.6 -appConnTimeout 10 -idle-timeout 9000 -socket 127.0.0.1:7056 -pass-header Authorization

PHP 7 相同:

/etc/apache2/conf-available/php7.0-cgi.conf

AddHandler php7-fcgi .php
Action php7-fcgi /php7.0
Alias /php7.0 /usr/lib/cgi-bin/php7.0

FastCgiExternalServer /usr/lib/cgi-bin/php7.0 -appConnTimeout 10 -idle-timeout 9000 -socket 127.0.0.1:7070 -pass-header Authorization

注释掉默认fastcgi的bridge的内容:

/etc/apache2/mods-available/fastcgi.conf

告诉 FPM 你要在哪里与他交谈:

/etc/php/5.6/fpm/pool.d/www.conf中找到listen参数(第2页)设置为

listen = 127.0.0.1:7056

再次 PHP 7.0

/etc/php/7.0/fpm/pool.d/www.conf

listen = 127.0.0.1:7070

通过告诉他们使用什么 FPM 来更新您的 vhost(在 vhost 内,在 外),这里 php 7.0 :

    <FilesMatch \.php$>
            SetHandler proxy:fcgi://127.0.0.1:7070
    </FilesMatch>

    <FilesMatch ".+\.phps$">
        SetHandler application/x-httpd-php-source
        Require all denied
    </FilesMatch>

    <FilesMatch "^\.ph(p[3457]?|t|tml|ps)$">
        Require all denied
    </FilesMatch>

现在它可以工作了,但是我们要添加一些额外的东西,php-mysql 以及更多:

apt-get install php{5.6,7.0}-{mysql,mcrypt} php-xdebug
phpenmod -v ALL -s ALL mysqli pdo_mysql readline xdebug

更新 xdebug 配置(下面是我的):

/etc/php/mods-available/xdebug.ini

zend_extension=xdebug.so

xdebug.overload_var_dump = 0
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 1
xdebug.remote_enable = 1

然后

systemctl enable php{5.6,7.0}-fpm

最终我们重启一切

systemctl restart apache2
systemctl restart php{5.6,7.0}-fpm

你应该完成了:D

更新并安装依赖项

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

删除任何现有的 php7 并重新创建 php7 和其他子目录

rm -rf /etc/php7

mkdir -p /etc/php7
mkdir -p /etc/php7/cli
mkdir -p /etc/php7/etc

删除当前工作目录中的任何 php-src 文件夹并从 git 分支重新安装

rm -rf php-src

git clone https://github.com/php/php-src.git --depth=1

将目录更改为 ext 以从 git

下载 pthread
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_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

添加其他扩展和 link 二进制文件

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

要使用 pthreads,请记住它是通过命令行界面工作的。假设 thread.php 是您的并行编程代码,您不能 运行 在 sapi/fpm 模式下通过使用浏览器 localhost/path/to/thread.php

<?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");
?>