前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP编译安装

PHP编译安装

作者头像
Java架构师必看
发布2021-03-22 10:58:27
1.4K0
发布2021-03-22 10:58:27
举报
文章被收录于专栏:Java架构师必看

#wgethttp://museum.php.net/php5/php-5.2.6.tar.gzPHP

#wget http://museum.php.net/php5/php-5.2.6.tar.gz (下载php源码)

http://cn.php.net/releases/  可以找到

#tar zxvf php-5.2.6.tar.gz

#cd php-5.2.6

#./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-apxs2=/usr/local/apache/bin/apxs

#make

#make install

说明:with-mysql就是你的mysql安装路径

===================================================

总是有人反复问我这样一个菜鸟php在CentOS等Linux系统下的安装问题,甚至同是一个人,几个月内安装PHP数次竟问我几十个相关问题,但是我保证:他每一次问的问题都不重样。这让我不禁停下来思考“无数次”的原因是什么? 我初步总结两点:

引用

1.未对linux原理进行系统学习

2.Linux太灵活

由于安装php的人目的不同,我们不能要求每个人都如此这般精通Linux再去安装php,特别是有些php程序员仅仅是想搭建一个完整的Php环境,然后就要迅速转入编程工作,自然对linux环境不甚熟悉。所以本文的目的就是想从菜鸟理解问题的角度(特别是面向windows下的Php程序员)阐述linux下安装php环境遇到的种种问题的缘故和解决思路.(本文的安装也是基于一个Linux发行版: CentOS5.2)

开始之前,普及一些必要的Linux安装软件的知识,一般来说:

1.不管任何linux系统,只要代码开源, 都可以通过tar源码包方式安装软件,即源码编译运行。

2.如果你基于某个Linux发行版工作,那么现代版的Linux套件都提供便捷的工具来安装软件。如CentOS使用yum,Ubuntu使用apg-get.

回到php安装上来: php通常都是用来做web应用,所以安装php也意味着安装apache和mysql。

既然我们使用CentOS套件,不妨先体验一把CentOS的yum工具如何便捷地安装软件.

假设此时CentOS主机已经装好,能够SSH登录上去,那么开始安装Apache,PHP, Mysql(认为以下有些只是点初学者能容易通过其他渠道掌握的省略),安装不必顺序进行:

1). 安装Apache

sudo yum install httpd mod_ssl

2). 安装php

sudo yum install php php-common php-gd php-mcrypt php-pear php-pecl-memcache php-mhash php-mysql php-xml

3). 安装mysql

sudo yum install mysql-server

4). 启动mysql,

sudo service mysqld start

5). 启动apache

sudo service httpd start

在浏览器中访问http://youhost/,看看apache欢迎页是不是出来了.接下来写一个php脚本,链接数据操作,放到apache主目录下,看看能否访问.

一般来说,很多人都是可以做到的,即便遇到一点问题也都可以通过google找到资料解决,让人对Linux学习充满信心.

那么,真正的问题在于: 你无法安于yum工具默认为你做的设置,yum傻瓜式帮你把软件装好,一旦你需要任何对软件、特别是对服务器软件的定制时,你发现你都必须面对Yum下面的复杂性!

案例1: 我发现默认装好的php是5.1.6,但是我想升级到5.2.10,但是yum服务器没有提供package怎么办?

看看前面提到的源码tar包方式,现在是面对的时刻了,去网站下载php源代码,在本地编译.

tar包安装软件基本分三步走:

Shell代码

  1. 1. configure   
  2. 2. make   
  3. 3. make install  
代码语言:javascript
复制
1. configure
2. make
3. make install

注:这里的前提是apache, mysql已经安装在你的机器上了.那么升级之前是否要卸载当前的php5.1.6呢? 当然要删(不要手工删除,yum安装的就用yum删除),执行yum remove php即可.

现在解压缩php源码到 php-5.2.10目录,进入该目录执行

Shell代码

  1. ./configure --prefix=/my/php   
  2. make   
  3. make install  
代码语言:javascript
复制
./configure --prefix=/my/php
make
make install

这是一个最简化的安装步骤,如果不出意外,你的php所有相关的文件都被安装在/my/php目录下. 源码安装方式的有点在于,你能控制一个软件安装后所有的文件在一个相关目录下,缺点是你必须手工地配置它和apache与mysql的关联.

/my/php/bin/php 就是Php程序,在httpd.conf中配置其以CGI方式运行(google容易搜到不赘述).重新启动apache, 运行一个Php脚本,现在应该已经可以执行了.

运行一个数据库连接的php脚本,通过IE运行,结果如何? 很遗憾,他可能告诉你mysql_connect找不到. 想想这个结果蛮合理的,apache和php通过前面的设置绑定好了,但是好像从来没设置过php和mysql的绑定啊?

其实,这里我们可以引申出一个基本概念: php如何使用第三方软件!

本例是: php(mysql_connect()函数)使用mysql(第三方软件).

观察上图,php能使用大量的第三方非php库(典型性是C语言写库), 为了达到此目的,你必须具备两个条件:

Shell代码

  1. 条件I.  安装第三方库(软件)   
  2. 条件II. 安装了该软件的php扩展  
代码语言:javascript
复制
条件I.  安装第三方库(软件)
条件II. 安装了该软件的php扩展

前面的情况是: mysql装了,满足条件I,但是条件II不满足, 为了满足条件二, 我们需要了解php安装扩展的知识.

安装php, 大的方面还可以分为两种方式:

引用

方式1. 将扩展编译到php

方式2. 将扩展单独编译成动态连接库so文件

方式1的优点是运行速度快,但是为了一个扩展需要重新安装整个php;方式2灵活,但是运行速度稍慢. windows平台下的php程序员大多只熟悉方式2,因为方式2是windows下安装Php扩展的唯一方式.

这里,我想教大家熟悉一方式1. 因为之前不是安装php了吗? 如果没有删除php-5.2.10目录,重新进入该目录, 那么此时重新编译运行将采用增量方式,实际上比方式2还更方便些.仍然3步走:

Shell代码

  1. ./configure --prefix=/my/php --with-mysql   
  2. make   
  3. make install  
代码语言:javascript
复制
./configure --prefix=/my/php --with-mysql
make
make install

和第一次安装php有什么差别? 是不是仅仅多了一个--with-mysql? 没错,php源码包包括了大量的Php扩展,也包括mysql的php扩展,只要加一个--with-mysql指示符, 编译的Php就支持mysql访问了

不幸的是, 很多人加了--with-mysql参数后出项提示找不到头文件(*.h)文件,这是为什么呢?..h文件属于c语言知识范畴了, 不过,一个基本知识是: X软件的php扩展的源代码在编译时必然可能依赖X软件的某些东西,好比mysql的php扩展源代码编译时不仅仅要求你安装mysql sever, 而一定要它的开发包相关文件(.h文件). 因此一般的思路就是: 下载mysql开发包并安装. 不过不要担心, 不到非必要,我们都尽可能使用yum工具来安装所有能安装的东西.通常有个命名管理,就是x软件的开发包,往往相应的yum包名都是x-devel. 不例外地,安装mysql开发包的命令则是: yum install mysql-devel.一路yes安装完毕. 重新运行--with-mysql的configure, 现在应该顺利重装了php, 而且数据库连接也应该正常工作了.

有人质疑: 我安装mysql sdk,./configure命令一个--with-mysql就知道我安装的目录,还是有点神奇,难道他全硬盘搜索.h文件? 不是, 如果你用yum方式安装sdk,那么LD_LIBRARY_PATH系统变量就指示了该sdk相关信息 ,如果你使用源码(tar)安装mysql sdk,你的--with-mysql参数不得不像这样: --with-mysql=/your_mysql_sdk_dir/

案例2: (基于案例I)我发现5.2.10默认已经支持了很多扩展如果dom, iconv等,根据客户要求,现需要安装如下的扩展: curl, gettext, bz2, mysql,  calendar,pspell, shmop, ftp, openssl, zlib, exif,gmp,sysvmsg,sockets,wddx, gd, mysqli, pdo_mysql, mcrypt, mime_magic, xsl

正像案例1描述安装mysql扩展的过程一样, 这些扩展全都可参照依法炮制.configure配置命令如下:

Shell代码

  1. ./configure --prefix=/usr/local/php --with-curl --with-gettext --with-bz2 --with-mysql -enable-shmop --enable-calendar --with-openssl --with-pspell --enable-ftp --with-openssl --with-zlib --enable-exif --with-gmp --enable-sysvmsg --enable-sockets --enable-wddx --with-xsl --with-mcrypt --with-mysqli --with-mime_magic --with-pdo-mysql --with-gd --with-apxs2=/usr/local/apache/bin/apxs --without-sqlite --enable-so  
代码语言:javascript
复制
./configure --prefix=/usr/local/php --with-curl --with-gettext --with-bz2 --with-mysql -enable-shmop --enable-calendar --with-openssl --with-pspell --enable-ftp --with-openssl --with-zlib --enable-exif --with-gmp --enable-sysvmsg --enable-sockets --enable-wddx --with-xsl --with-mcrypt --with-mysqli --with-mime_magic --with-pdo-mysql --with-gd --with-apxs2=/usr/local/apache/bin/apxs --without-sqlite --enable-so

我怎么知道这些参数的含义? 打开./configure脚本,参照官方php文档学习这些参数的含义是正宗的方法.

特别注意--with-apxs2=/usr/local/apache/bin/apxs的用法,此参数假设了apache已经预先安装带有apxs,这样apache的php模块文件会自动添加到httpd.conf文件中,如果是通过yum方式安装的apxs(如:yum -y install httpd-devel),则--with-apxs2参数不要加=后面的路径。也请参考另篇文章 http://koda.iteye.com/blog/233412

安装过程中一定存在可能X软件还没安装,导致X软件的php扩展不可以通过configure检查.下面列出部分软件依赖性:

Linux代码

  1. # 安装apache, mysql-server   
  2. yum -y install httpd mod_ssl    
  3. yum -y install mysql-server   
  4. #和PHP相关的依赖   
  5. yum -y install mysql-devel    
  6. yum -y install perl httpd-devel apr-devel   
  7. yum -y install bzip2-devel    
  8. yum -y install curl-devel    
  9. yum -y install gmp-devel   
  10. yum -y install pspell-devel   
  11. yum -y install libmcrypt-devel   
  12. yum -y install libxslt-devel   
  13. yum -y install libjpeg-devel   
  14. yum -y install libpng-devel    
  15. yum -y install libxml2-devel   
  16. yum -y install freetype-devel   
  17. # 一些包,和部分工具软件   
  18. yum -y install openssl-devel   
  19. yum -y install libgssapi-devel   
  20. yum -y install krb5-devel   
  21. yum -y install make   
  22. yum -y install libtool-ltdl-devel   
  23. yum -y install sendmail mailx     
  24. yum -y install subversion-devel  
代码语言:javascript
复制
# 安装apache, mysql-server
yum -y install httpd mod_ssl 
yum -y install mysql-server

#和PHP相关的依赖
yum -y install mysql-devel 
yum -y install perl httpd-devel apr-devel
yum -y install bzip2-devel 
yum -y install curl-devel 
yum -y install gmp-devel
yum -y install pspell-devel
yum -y install libmcrypt-devel
yum -y install libxslt-devel
yum -y install libjpeg-devel
yum -y install libpng-devel 
yum -y install libxml2-devel
yum -y install freetype-devel

# 一些包,和部分工具软件
yum -y install openssl-devel
yum -y install libgssapi-devel
yum -y install krb5-devel
yum -y install make
yum -y install libtool-ltdl-devel
yum -y install sendmail mailx  
yum -y install subversion-devel

假设yum包不包含该软件怎么办? 采用终极方法:tar包安装,参照另文描述.

安装之后,php.ini默认不存在。如果需要设置php.ini选项,通过phpinfo()函数查看php.ini默认存放路径,将php源码路径下的php.ini-recommended复制到其目录下更名为php.ini

./configure时发现如下三个32/64bit不兼容错误

Linux代码

  1. libz.so   
  2. libcom_err.so   
  3. libidn.so  

将/usr/lib下三个ln重新link到/usr/lib64目录下的实际的so文件就OK,原因不明。

案例3: (基于案例I)我看yum默认安装的php都是以apache模块方式安装的,我能否也这样做?

可以,apache的php模块so文件是php源代码包编译出来的./configure加一个参数:

--with-apxs2=/usr/sbin/apxs

这是什么? --with-apxs2所指向的 /usr/sbin/apxs是apache安装的一个Perl脚本,它知道所有apache软件的信息, 这样编译出来的apache的Php模块文件(名字可能是libphp5.so)将被复制到合适的目录,并且修改httpd.conf装载该文件.

如果你的apache是源码方式安装的,那意味着apache软件所有相关文件都在某个目录下,如果/usr/apache,那么你也可以不用--with-apxs2而直接使用--with-apache=/usr/apache.

F.A.Q

Q1: make install出现警告

Warning: Cannot use a scalar value as an array in phar://install-pear-nozlib.phar/PEAR/ChannelFile.php on line 1400 不影响系统运行。但是为什么呢?

Q2: 我的主机上有多个ini文件,怎样知道那个php.ini才是我当前有效的ini文件?

A: 运行phpinfo()的php脚本,它会告诉你

Q3: 我想做一些php的设置,但是我不想改php.ini,怎么办?

A: php做./configure时,加参数 --with-config-file-scan-dir=/etc/php.d ,那么安装好的php运行时会自动检查/etc/php.d/下所有.ini文件。你可以把你的配置信息写到这里。

Q4: 启动apachce出现错误:libphp5.so: cannot restore segment prot after relock: Permission Denied

A: 临时禁用SELinux.执行命令setenforce 0. 永久生效可以执行setup命令,更改防火墙设置。

Q5: 启动apache出现错误:

Starting httpd: httpd: Syntax error on line 206 of /etc/httpd/conf/httpd.conf: Cannot load /usr/lib/httpd/modules/libphp5.so into server: /usr/lib/httpd/modules/libphp5.so: undefined symbol: sqlite3SrcListShiftJoinType

A: php做./configure是时使用参数--without-sqlite。当然这是回避问题,我还没具体研究这个问题的确切原因:)

Q5:按照你的./configure在32位机器上运行好好的,到了64位机器就不工作了,提示mysql什么的找不到

A: ./configure增加参数 -–libdir=/usr/lib64 –-with-libdir=lib64

下面是我在64bit主机上安装php的配置参数

Shell代码

  1. ./configure --prefix=/usr/php --with-apxs2=/usr/sbin/apxs --with-config-file-path=/etc/ --with-config-file-scan-dir=/etc/php.d --without-sqlite --enable-mbstring --with-curl --with-gettext --with-bz2 --with-mysql -enable-shmop --enable-calendar --with-openssl --with-pspell --enable-ftp --with-openssl --with-zlib --enable-exif --with-gmp --enable-sysvmsg --enable-sockets --enable-wddx --with-xsl --with-mcrypt --with-mysqli --with-mime_magic --with-pdo-mysql --libdir=/usr/lib64 --with-libdir=lib64 --with-gd --with-jpeg-dir=/usr/lib64 --with-png-dir=/usr/lib64 --with-freetype-dir=/usr/lib64   
代码语言:javascript
复制
./configure --prefix=/usr/php --with-apxs2=/usr/sbin/apxs --with-config-file-path=/etc/ --with-config-file-scan-dir=/etc/php.d --without-sqlite --enable-mbstring --with-curl --with-gettext --with-bz2 --with-mysql -enable-shmop --enable-calendar --with-openssl --with-pspell --enable-ftp --with-openssl --with-zlib --enable-exif --with-gmp --enable-sysvmsg --enable-sockets --enable-wddx --with-xsl --with-mcrypt --with-mysqli --with-mime_magic --with-pdo-mysql --libdir=/usr/lib64 --with-libdir=lib64 --with-gd --with-jpeg-dir=/usr/lib64 --with-png-dir=/usr/lib64 --with-freetype-dir=/usr/lib64

执行./configure之前,如果php已经make过,最好make clean以保证configure指示的参数能够正确被编译.

本文由来源 21aspnet,由 javajgs_com 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档