PHP

linux下安装单独用来跑命令行的php7或php8 以及编译时各种故障排除

字号+ 编辑: 呆头鹅甲 修订: 呆头鹅甲 来源: 原创 2018-04-03 16:03 我要说两句(0)

写爬虫的时候不想用和nginx已配置好的环境用php来跑命令行脚本, 需要安装一个和nginx apache之类的中间件没有瓜葛的独立php引擎, 专门用来跑脚本的。

首先从php.net下载一个php源码包, yum安装一下相关联的依赖:

yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libmcrypt-devel pcre-devel

7.3以前的版本, 使用以下命令来编译到/usr/local/php7下面:

./configure --prefix=/usr/local/php7 --exec-prefix=/usr/local/php7 --bindir=/usr/local/php7/bin --sbindir=/usr/local/php7/sbin --includedir=/usr/local/php7/include --libdir=/usr/local/php7/lib/php --mandir=/usr/local/php7/php/man --with-config-file-path=/usr/local/php7/etc --with-mysql-sock=/var/lib/mysql/mysql.sock --with-mcrypt=/usr/include --with-mhash --with-openssl --with-mysqli=shared,mysqlnd --with-pdo-mysql=shared,mysqlnd --with-gd --with-zlib --enable-zip --enable-inline-optimization --disable-debug --disable-rpath --enable-shared --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-mbregex --enable-mbstring --enable-ftp --enable-gd-native-ttf --enable-pcntl --enable-sockets --with-xmlrpc --enable-soap --without-pear --with-gettext --enable-session --with-curl --with-jpeg-dir --with-freetype-dir --enable-opcache --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --without-gdbm --enable-fileinfo

如果是php7.3或以上的版本(适用于php8)

configure时需请注意一下:

用configure --help参数看一下。有些--with的语法已经不管用了, 统统要变成--enable之类的

./configure  --prefix=/usr/local/php7.4 --with-config-file-path=/usr/local/php7.4/etc \
--enable-opcache \
--enable-inline-optimization \
--disable-debug \
--disable-rpath \
--enable-shared \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--enable-mysqlnd-compression-support \
--with-iconv-dir \
--with-zlib \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--with-curl \
--enable-mbregex \
--enable-mbstring \
--enable-intl \
--enable-ftp \
--enable-gd \
--enable-gd-jis-conv \
--with-jpeg   \
--with-freetype  \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--with-zip \
--enable-soap \
--with-gettext \
--disable-fileinfo \
--with-pear \
--enable-maintainer-zts \
--with-ldap=shared \
--without-gdbm

如果libiconv报错, 在make install之前添加一行

make ZEND_EXTRA_LIBS='-liconv'

安装php引擎

make && make install

PDO的配置

默认来讲, 官方包默认安装进来的php是没有pdo_mysql功能的, 如果使用针对mysql的pdo一定会报错, 怎么办呢?

首先回到安装源目录, 例如安装源你将其解压到了/root/php-7.0.29目录下, 那么pdo_mysql插件会搁置在/root/php-7.0.29/ext/pdo_mysql这个路径下

再回想你安装的php7路径在哪里? 例如安装到了/usr/local/php7这个路径下, 那么进入到/root/php-7.0.29/ext/pdo_mysql下面:

cd /root/php-7.0.29/ext/pdo_mysql
/usr/local/php7/bin/phpize
./configure --with-php-config=/usr/local/php7/bin/php-config --with-pdo-mysql=share

当然如果你当前系统里面安装了mysql服务, 你可以把上面的share改成mysql的安装路径, 注意, 不是说要你指向mysql的bin目录, 而是安装路径, 例如/usr/local/mysql这样子。

接下来,需要修改php7下面的php.ini文件, 找到下面这一行:

[Pdo_mysql]

在其下方增加一段:

extension=pdo_mysql.so

有的同学就会问了, php.ini在哪里找到的? 因为本例程的实现目标只是拿php7引擎跑脚本, 所以安装后, 官方的make包里肯定是不会给你现成的php.ini的, 随便找个地方拷一份对应版本的配置文件吧,QQ群2702237。

PHP-Redis的配置

见站内文章 https://www.wkwkk.com/articles/44b97536a7fa2d5e.html

遇到的问题以及如何解决

configure: error: iconv does not support errno

wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
tar -zxvf libiconv-1.14.tar.gz
cd libiconv-1.14
./configure --prefix=/usr/local/libiconv
make && make install

这里还有一个问题, 如果编译libiconv中途失败, 报错:

In file included from progname.c:26:
./stdio.h:1010:1: error: ‘gets’ undeclared here (not in a function); did you mean ‘fgets’?
 _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
 ^~~~~~~~~~~~~~~

则需要找到其中的一个文件libiconv-1.14/srclib/stdio.in.h这个文件并且编辑它

找到698行代码:

_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");

将之改为:

#if defined(__GLIBC__) && !defined(__UCLIBC__) && !__GLIBC_PREREQ(2, 16)
 _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
#endif

如果安装完了libiconv还是报错, 那就是检测不到libiconv的问题了。如何解决?

在执行configure命令之前先输入命令:

export LDFLAGS="$LDFLAGS -liconv"

参考原文: https://bugs.php.net/bug.php?id=80585

 [2021-01-04 15:06 UTC] tomas at rybarik dot comDescription:
------------
I'm unable to compile PHP 8.0.0 with enabled iconv.
This is output from configure command:
checking for iconv support... yes
checking for iconv... yes
checking if iconv is glibc's... yes
checking if iconv supports errno... no
configure: error: iconv does not support errno

I tried compile PHP 7.4.13 with the same version of iconv (1.16), there everything is OK.
checking for iconv support... yes
checking for iconv... yes
checking if iconv is glibc's... yes
checking if iconv supports errno... yes
checking if iconv supports //IGNORE... no


[2021-03-09 22:47 UTC] guillaume-php at outters dot euTomas, could you please tell us what error is logged in the config.log?

As suggested by cmg, this is a problem of detection; but in my case (FreeBSD 10.2, with "hand"-compiled GNU iconv 1.16 without pkgconfig), the detection program had no problem, rather it was its compile env that lacked a -liconv.

So this could be circumvented by running an:
export LDFLAGS="$LDFLAGS -liconv"
before the configure.

I _think_ that, like you, I had no problem compiling a PHP 7 in the same environment (so this detect failure would be a configure regression); but I cannot be certain.

2. No package ‘oniguruma’ found

yum install oniguruma-devel

3. No package ‘libzip’ found 或者 Requested ‘libzip >= 0.11’ but version of libzip is 0.10.1

checking for libzip >= 0.11 libzip != 1.3.1 libzip != 1.7.0... no
configure: error: Package requirements (libzip >= 0.11 libzip != 1.3.1 libzip != 1.7.0) were not met:
Requested 'libzip >= 0.11' but version of libzip is 0.10.1

这个报错提示非常明显,配置程序没有找到 libzip 库或者找到了但是版本低于 0.11,你用 yum 安装 libzip-devel 的话,安装的版本是 0.10,版本达不到要求。所以,我们需要卸载掉 yum 安装的 libzip 然后手动安装新版。

yum remove libzip libzip-develwget https://libzip.org/download/libzip-1.2.0.tar.gz
tar -zxvf libzip-1.2.0.tar.gz
cd libzip-1.2.0
./configure
make && make install

安装php7提示 configure: error: Cannot find OpenSSL's libraries

解决方法:

#find / -name "libssl.so"
#如果找到路径为/usr/lib/x86_64-linux-gnu/libssl.so 则输入以下命令
ln -s /usr/lib/x86_64-linux-gnu/libssl.so /usr/lib

error: off_t undefined; check your library configuration

vim /etc/ld.so.conf

添加如下几行

/usr/local/lib64
/usr/local/lib
/usr/lib
/usr/lib64

保存退出:wq

使之生效

ldconfig -v

提示 configure: error: Cannot find ldap libraries in /usr/lib

解决办法:

cp -frp /usr/lib64/libldap* /usr/lib/

提示Package 'oniguruma', required by 'virtual:world', not found

解决办法:

# 安装依赖
[root@lnmp ~]# yum install autoconf automake libtool -y
# 拉取github包
[root@lnmp ~]# wget https://github.com/kkos/oniguruma/archive/v6.9.4.tar.gz -O oniguruma-6.9.4.tar.gz
[root@lnmp ~]# tar xf oniguruma-6.9.4.tar.gz
[root@lnmp ~]# cd oniguruma-6.9.4/
[root@lnmp oniguruma-6.9.4]# ./autogen.sh && ./configure --prefix=/usr
[root@lnmp oniguruma-6.9.4]# make && make install

php7.3以上编译过程中内存不足

通过增加swap分区文件的方式解决1G内存小主机无法通过编译的问题:

1、检查当前的分区情况(使用free -m或cat /proc/swaps ):

[root@db2 root]# free -m
             total       used       free     shared    buffers     cached
Mem:          1006         84        922          0         11         38
-/+ buffers/cache:         35        971
Swap:            0          0          0

2、增加交换分区文件及大小:

检查没有swap,下面就需要增加:

判定新交换文件的大小,将大小乘以1024来判定块的大小。例如,大小为64MB的交换文件的块大小为65536,在 shell 提示下以根用户身份键入以下命令,其中的 count 等于想要的块大小。

[root@db2 root]# dd if=/dev/zero of=/home/swap bs=1024 count=1024000
1024000+0 records in
1024000+0 records out

使用以下命令来设置交换文件:

[root@db2 root]# mkswap /home/swap
Setting up swapspace version 1, size = 1023996 KiB
[root@db2 root]#

3、启用交换分区文件:

要立即启用交换文件而不是在引导时自动启用,使用以下命令:

[root@db2 root]# swapon /home/swap

检查增加后的交换情况:

[root@db2 root]# free -m
             total       used       free     shared    buffers     cached
Mem:          1006        994         12          0          4        929
-/+ buffers/cache:         60        946
Swap:          999          0        999
[root@db2 root]#

要在引导时启用,编辑 /etc/fstab 文件来包含以下行

(/home/swap               swap                    swap    defaults        0 0 ):

[root@db2 root]# vi /etc/fstab
LABEL=/                 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext2    defaults        1 2      /home/swap               swap                    swap    defaults        0 0
       none                    /dev/pts                devpts  gid=5,mode=620  0 0
       none                    /proc                   proc    defaults        0 0
       none                    /dev/shm                tmpfs   defaults        0 0
       LABEL=/usr              /usr                    ext3    defaults        1 2
       /dev/sda5               swap                    swap    defaults        0 0
       /dev/cdrom              /mnt/cdrom              iso9660 noauto,owner,kudzu,ro 0 0
       /dev/fd0                /mnt/floppy             auto    noauto,owner,kudzu 0 0
       /home/swap               swap                    swap    defaults        0 0

系统下次引导时,它就会启用新建的交换文件

再次检查添加后的情况:

[root@db2 oracledb]# free -m
                    total       used       free     shared    buffers     cached
       Mem:          1006        979         27          0          6        917
       -/+ buffers/cache:         54        952
       Swap:          999          0        999
[root@db2 oracledb]#


阅完此文,您的感想如何?
  • 鼓掌

    1

  • 鄙视

    0

  • 开心

    0

  • 愤怒

    0

  • 可怜

    0

1.如文章侵犯了您的版权,请发邮件通知本站,该文章将在24小时内删除;
2.本站标注原创的文章,转发时烦请注明来源;
3.交流群: PHP+JS聊天群

相关课文
  • 解决pecl安装swoole报错 error

  • php针对mysql的orm: 一个轻量级的pdo操作类

  • shell_exec() has been disabled for security reasons 解决方法

  • 鸟哥出品的高性能php框架YAF的安装和配置

我要说说
网上宾友点评
沙发已空
linux下安装单独用来跑命令行的php7或php8 以及编译时各种故障排除