源码编译安装 PHP,请教关于./configure 的问题

背景#

  • 昨天想转 slim 框架为 lumen 5.3.1 版做 API 开发,lumen 官网上标明 PHP 版本需要 >=5.6.4,查了一下 PHP 官网的稳定版本,主要是 5.6.22 和 7.0.11,于是就下载了 PHP 7.0.11 的源码版本
  • ./configure [option] 的时候,以前都是一成不变的复制粘贴,从来没有思考过 ./configure 后面选项的意义,趁这次重新编译安装,正好弄清楚一下

laravel-china 官网上目前标明的 lumen 5.3.1 对 PHP 版本的要求 >=5.5.9 是不正确的,php artisan 的时候,会无法识别 php 里面的可变参数... 语法。昨晚已私聊管理员龙哥,大家也可以注意一下这个 PHP 新语法

安装细节#

我在测试安装 php 的 openssl 模块的时候,分别使用了以下方式:

  • ./configure
  • ./configure --with-openssl
  • ./configure --with-openssl=/usr/local
  • ./configure --with-openssl=/usr/local/xxx

结果出现了不同的结果

  • 第一种不会安装 openssl 模块
  • 第二种可以正常安装 openssl 模块
  • 第三种可以正常安装 openssl 模块 (我的电脑存在 /usr/local/include/openssl/evp.h)
  • 第四种会报错:configure: error: Cannot find OpenSSL's evp.h (我的电脑 /usr/local/xxx 是空目录)

问题#

由于第二种和第三种都可以安装成功。

  1. 假设指定了路径是用于调用系统自带的函数库,那为什么我检查./configure 文件的源码,源码会判断只有./configure --with-openssl=shared./configure --with-openssl=shared[,path] 才算是调用系统自带的函数库呢?
  2. 假设指定了路径是用于创建不依赖于系统的独立函数库,那为什么第四种方式还是会报错呢?
  3. ./configure 源码里面进行了四种判断,还麻烦大神系统地分析一下这四种情况分别对应什么需求,非常感谢 ^_^

./configure 源码四种判断:

  • ./configure --with-openssl=shared
  • ./configure --with-openssl=shared[,path]
  • ./configure
  • ./configure --with-openssl

附录#

./configure 文件源码片段:
file

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 7
leo

--with-openssl=/usr/local 是告诉 configure 程序,要在 /usr/local 目录下去寻找 openssl 的头文件,你给他一个空目录,自然是找不到对应头文件的

8年前 评论

@leo 如果不指定目录,仅仅是 --with-openssl 的话,是会调用系统自带的还是编译安装源码里面的 ext/openssl 呢

8年前 评论
leo

@思过崖 看来你有一个比较大的误区,这里有两个东西:1.openssl 头文件 2. php-openssl 扩展,ext/openssl 这个目录下的是 php-openssl 扩展的源码,并不包含 openssl 本身,也就是你加上 --with-openssl 并不能让 configure 程序帮你安装 openssl 及其头文件,仅仅 --with-openssl 是告诉 configure 程序,你的 openssl 头文件在系统默认的位置

8年前 评论
leo

编译 php-openssl 扩展需要 openssl 头文件,如果没有 openssl 头文件就会编译失败(在 configure 阶段就会报错)

8年前 评论

@leo 意思就是说:(1)./configure --with-openssl 会在系统默认位置寻找 openssl 头文件,如果找到就 ok,找不到就会报错;
(2)./configure --with-openssl=/usr/local 会在 /usr/local/include/openssl/ 目录下寻找 openssl 头文件,如果找到就 ok,找不到就报错(指定目录适用于如下情况:系统安装有多个版本的 openssl,想指定某个版本,或者 openssl 没有安装在默认的位置)
(3)找到了系统的 openssl 头文件,后续才可以编译 ext/openssl 目录下的源码,安装 php-openssl 扩展
。不知道我的理解对不对,非常感谢哈~~

8年前 评论
leo

@思过崖 对的

8年前 评论

谢谢哈,豁然开朗了很多,google 搞了很久没有弄清楚:grimacing:

8年前 评论