我需要帮助完整安装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 "$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
如果有人能够纠正我的错误或提供完整安装的PHP7(ZTS)+ Pthreads,我将很高兴。
答案 0 :(得分:10)
更新并安装依赖项
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 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;
?>
而是通过命令行方法创建一个文件来执行代码thread.php,例如&#34; system&#34;
<?php
system("php /path/to/thread.php");
?>
答案 1 :(得分:4)
这是与PHP 5.6和Linux的共同安装。 PHP 7.0(zts与否)
我们推出旧版PHP5软件包并安装可共同安装的PHP 5.6&amp; PHP 7.0包
apt-get autoremove php5 php5-common
apache2现在应该抱怨,但没关系,我们会修复它
添加自定义repo(php包debian maintainer repo)
add-apt-repository ppa:ondrej/php
编辑源列表文件,很可能是/etc/apt/sources.list.d/ondrej-ubuntu-php-trusty.list
,并取消注释源行
然后:
apt-get update
从repo安装非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 install复制到包结构中,在错误消息中看到的位置。 现在重铸:
./debian/rules binary
应该成功。现在你可以安装除snmp软件包之外的所有软件包,我不知道为什么,但是f * ck一切都可以了。
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默认桥的内容:
/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&amp;更多:
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