当前位置: 首页 > 编程日记 > 正文

PHP编译安装

#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

注:这里的前提是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

这是一个最简化的安装步骤,如果不出意外,你的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扩展


前面的情况是: 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


和第一次安装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

我怎么知道这些参数的含义? 打开./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

假设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


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

相关文章:

Python 办公自动化,一键给PDF文件加密,超方便

作者 | 欣一来源 | Python爱好者集中营今天给大家做一个给PDF文件加密的GUI界面(图形用户界面),方便现在的一些上班族白领们使用,尤其是需要给一些比较重要的PDF文件加密的时候,下面我们来看具体的步骤给PDF文件加密首先我们需要清楚的是如何…

YUM安装多个(多实例) Mysql

2019独角兽企业重金招聘Python工程师标准>>> 这里使用的是MYSQL的percona分支 先安装repo包 yum install percona-release-0.0-1.x86_64.rpm -y 想安装5.6的把5.5替换就行了,5.6的太耗内存了-。- yum install Percona-Server-server-55.x86_64 Percona-Server-clien…

scala可变长度参数函数

2019独角兽企业重金招聘Python工程师标准>>> scala可变长度参数函数只需要在参数列表的最后放一个星号,实验如下: def main (args:Array[String]){argsfun("Runoob", "Scala", "Python")} def argsfun(args:St…

3000 字推荐一个可视化神器,50 行 Python 代码制作数据大屏

作者 | 俊欣来源 | 关于数据分析与可视化今天小编给大家分享一个制作数据大屏的工具,非常的好用,100行左右的Python代码就可以制作出来一个完整的数据大屏,并且代码的逻辑非常容易理解。PywebIO介绍Python当中的PywebIO模块可以帮助开发者在不…

使用Varnish+ESI实现静态页面的局部缓存

页面静态化是搭建高性能网站必用的招式之一,页面静态化可以有效提升系统响应速度,同时也有利于搜索引擎优化。但在页面静态化后,静态页面之间包含(例如所有的静态页面包含页头、页脚)以及静态页面中的局部信息的动态更…

The Apply method of function object

2019独角兽企业重金招聘Python工程师标准>>> http://webreference.com As explained in the previous page, JavaScript 1.3 includes two new methods for the Function object, call() andapply(). The apply() method is a variation on the call() method. The …

资源 | 100+个自然语言处理数据集大放送,再不愁找不到数据!

奉上100多个按字母顺序排列的开源自然语言处理文本数据集列表(原始未结构化的文本数据),快去按图索骥下载数据自己研究吧! 数据集 Apache软件基金会公开邮件档案:截止到2011年7月11日全部公开可用的Apache软件基金会邮…

Java中ArrayList源码分析

一、简介 ArrayList是一个数组队列,相当于动态数组。每个ArrayList实例都有自己的容量,该容量至少和所存储数据的个数一样大小,在每次添加数据时,它会使用ensureCapacity()保证容量能容纳所有数据。 1.1、ArrayList 的继承与实现接…

介绍三种绘制时间线图的方法

作者 |周萝卜来源 |萝卜大杂烩今天我们再来分享几种不同的制作方法,大家可以自行比较下各种方法的优劣。Matplotlib 制作Matplotlib 作为 Python 家族最为重要的可视化工具,其基本的 API 以及绘制流程还是需要掌握的。尤其是该库的灵活程度以及作为众多工…

phpize是什么

安装php(fastcgi模式)的时候,常常有这样一句命令:/usr/local/webserver/php/bin/phpize 一、phpize是干嘛的? phpize是什么东西呢?php官方的说明: http://php.net/manual/en/install.pecl.phpiz…

C语言比较好的风格梳理

errno int err;tb malloc(sizeof(struct xtracer_table));if (!tb) {err errno;fprintf(stderr, "%s:%d, errno:%d, %s\n",__func__, __LINE__, err, strerror(err));return NULL;} 转载于:https://www.cnblogs.com/muahao/p/8979144.html

Linux下Memcache服务器端的安装

Linux下Memcache服务器端的安装服务器端主要是安装memcache服务器端,目前的最新版本是 memcached-1.3.0 。下载:http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz http://memcached.googlecode.com/files/memcached-1.4.9.tar.gz 另外&#…

如何用技术恢复模糊的图像?在线教学…

作者 |小白 来源 |小白学视觉 有人认为恢复模糊的图像是不可能的,因为会丢失信息。但我对这个问题进行了很多思考,并认为如果输出图像的大小与输入图像的大小相同,那实际上是可能的!这样,输出就有足够的像素/信息来恢复…

数据库创建索引的原则

数据库建立索引的原则 铁律一:天下没有免费的午餐,使用索引是需要付出代价的 索引的优点有目共睹,但是,却很少有人关心过采用索引所需要付出的成本。若数据库管理员能够对索引所需要付出的代价有一个充分的认识,也就不…

Linux上实现ssh免密码登陆远程服务器

平常使用ssh登陆远程服务器时,都需要使用输入密码,希望可以实现通过密钥登陆而免除输入密码,从而可以为以后实现批量自动部署主机做好准备。 环境如下: IP地址操作系统服务器端10.0.0.10CentOS 6.5 x86客户端10.0.0.61CentOS 6.5 …

分享memcache和memcached安装过程

Memcache是什么? Memcache是一个自由和开放源代码、高性能、分配的内存对象缓存系统。用于加速动态web应用程序,减轻数据库负载。 它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一…

导入导出Android手机文件

1、获得root权限:adb root; 如提示adbd cannot run as root in production builds,参见我的另一篇文章:http://www.cnblogs.com/hdk1993/p/4770388.html 2、设置/system为可读写:adb remount; 3、将文件复制…

GPT-3 不够 Open,BigScience 构建开放语言模型,规模小 16 倍

编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 大约一年前,总部位于纽约布鲁克林的自然语言处理初创公司 Hugging Face 推出了 BigScience。这是一个拥有 900 多名研究人员的国际项目,旨在更好地理解自然语言模型原理和提高大…

华为云微服务引擎CSE大量新特性上线,诚邀您免费体验

1、提供GO语言微服务开发框架SDK 支持插件化注册中心、多RPC协议(已默认实现http和highway,可扩展) 提供熔断降级、容错、路由管理、限流、错误注入、灰度发布等治理能力 2、提供Service Mesh商业版 支持.NET、Node.js、PHP等多语言应用…

memcache和memcached安装

首先要明确 memcache不是memcached第一步安装libevent #wget https://github.com/downloads/libevent/libevent/libevent-2.0.15-stable.tar.gz #tar libevent-2.0.15-stable.tar.gz #tar xzvf libevent-2.0.15-stable.tar.gz #cd libevent-2.0.15-stable #./configure --h…

点击按钮下载文件

RequestMapping("/download.do")public void download(HttpServletRequest request,HttpServletResponse response)throws Exception {String filePath "文件路径";FileInputStream fis null;OutputStream os null;try {fis new FileInputStream(fileP…

开源社区的危机:拒绝被“白嫖”?2大著名项目遭作者破坏

作者 | 林檎来源 | 数据实战派近日,一位开源开发者的故意破坏,再次引发了机构依赖开源库的争议。这一类开源库往往由维护者义务工作而支撑。被破坏的开源库是 Marak Squires 开发的 color.js 库和 faker.js 库。这两个库被广泛使用,其中不乏企…

状态和面向对象编程——1.定位步骤

定位 所有无人驾驶车要安全畅游全球,都必须经过一系列相同的步骤。 你一直在学习第一步:定位。在车辆能够安全驾驶之前,它们首先要使用传感器和收集的其他数据对它们所处的位置做出最佳估计。 卡尔曼滤波器 让我们来回顾一下卡尔曼滤波器对汽…

ldconfig命令详解,linux动态链接库

动态链接库管理命令 为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfig.此执行程序存放在/sbin目录下. ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍…

用于自动驾驶的实时 YUV 多任务 CNN

作者 | AI 修炼之路来源 | AI 修炼之路摘要本文提出了一种针对低功耗车用SoC优化的多任务卷积神经网络(CNN)结构。我们介绍了一个基于统一架构的网络,其中编码器由检测和分割两个任务共享。该网络以25FPS运行,分辨率为1280800。简要讨论了直接利用原生YU…

博客5:文件,目录以及用户的权限管理

linux用户与组的相关内容简介: 1.Linux用户:Username/UID管理员:root,0普通用户:1-65535系统用户:1-499(在centos7上为1-999)作用:对守护进程获取资源进行权限分配登录…

以太坊代币空投合约的实现

2019独角兽企业重金招聘Python工程师标准>>> 本文将介绍如何在以太坊智能合约中实现代币的空投。区块链以太坊世界中所谓空投(airdrop),就是免费给你的区块链地址(公钥)发送代币。 代币空投的方式层出不穷&…

linux命令:ln 使用方法

命令:ln 使用方法指令名称 : ln使用权限 : 所有使用者使用方式 : ln [options] source dist,其中 option 的格式为 :[-bdfinsvF] [-S backup-suffix] [-V {numbered, existing, simple}][--help] [--version] [--] 说明 : Linux/Unix 档案系统中&#xf…

10 个案例分享几个 Python 可视化小技巧,助你绘制高质量图表

作者 | 俊欣来源 | 关于数据分析与可视化一般在Python当中,我们用于绘制图表的模块最基础的可能就是matplotlib了,今天小编分享几个用该模块进行可视化制作的技巧,帮助你绘制出更加高质量的图表。同时本篇文章的第二部分是用Python来制作可视…

(转) 地区赛获胜策略,赛前默念!

1. 比赛中评测会有些慢,偶尔还会碰到隔10分钟以上才返回结果的情况,这段时间不能等结果,必须开工其他题,如果WA,两道题同时做。交完每道题都要先打印。2. 比赛时发的饭不是让你当时就吃的,那是给你赛后吃的…