手把手教你在Mac环境下基于php7安装mcrypt扩展

打印 上一主题 下一主题

主题 1013|帖子 1013|积分 3039

近来在mac本地环境安装了PHP7,但由于本地项目需要处理加解密事项,本地php环境没有安装mcrypt扩展导致跑不通,所以就花点时间完满下本地php运行环境,过程中也踩了许多坑,大伙应该也会碰到类似问题,所以就记录下,一起学习!! !
  

目录
一、配景引入
1、加密技能在php中的实现
2、php版本和mcrypt扩展的兼容关系
二、前置预备
1、确认 PHP 版本
2、下载mcrypt 扩展依赖
3、安装mcrypt扩展依赖
3.1 mhash
3.1.1 安装
3.2 Libmcrypt
3.2.1 安装
3.2.2 常见报错问题梳理
1、configure: error: /bin/sh ./config.sub -apple-darwin24.1.0 failed
2、error: call to undeclared library function 'calloc' with type 'void *(unsigned long, unsigned long)'; ISO C99
3、error: call to undeclared library function 'isdigit' with type 'int (int)'; ISO C99
4、error: type specifier missing, defaults to 'int'; ISO C99
三、mcrypt 安装执行
1、基于PHP7.2安装mcrypt 扩展
1.1 安装
2、基于PHP7.1安装mcrypt 扩展
2.1 安装
2.2 常见问题梳理
1、error: incompatible function pointer types initializing 'php_stream_filter *(*)
四、mcrypt 扩展验证
1、检查php.ini文件中是否开启 mcrypt.so 插件
2、下令行检查php扩展模块
3、通过phpstrom查看
五、常见问题梳理
1、执行报错:PHP Warning: PHP Startup: mcrypt: Unable to initialize module
2、mcrypt_get_iv_size()、mcrypt_create_iv()、mcrypt_decrypt() 执行报错



一、配景引入

1、加密技能在php中的实现

        加密技能重要包括对称加密和非对称加密。对称加密使用雷同的密钥进行加密和解密操作,其优点是加密速度快,但密钥管理相对复杂;非对称加密使用一对密钥(公钥和私钥),公钥用于加密,私钥用于解密,安全性较高,但加密速度相对较慢。 
        在 PHP 中,为了实现数据加密和解密功能,就需要使用相关的加密扩展。mcrypt 扩展应运而生,它提供了一系列丰富的加密和解密函数,支持多种加密算法,如 DES、Triple - DES、Blowfish 等常见的对称加密算法。这些算法可以根据不同的应用场景和安全需求进行选择,为 PHP 开辟者提供了机动的数据加密解决方案。
2、php版本和mcrypt扩展的兼容关系

        随着 PHP 版本的不停更新,特殊是从 PHP 5 到 PHP 7 的过渡,再到现在的PHP8,PHP 的内部架构和功能发生了许多庞大变化。这些变化对 mcrypt 扩展产生了肯定的兼容性影响。
        相比PHP5,PHP 7 在性能和安全性方面有了显著提升,对旧的扩展机制进行了优化。比方,PHP 7 的内存管理模型改变,使得一些依赖于旧内存布局的扩展(包括 mcrypt)大概会出现潜在的问题。在 PHP 7 的开辟过程中,更加注重代码的规范化和安全性,一些旧的、大概存在安全隐患的函数和接口在新的版本中被重新审阅或者修改,这大概导致 mcrypt 扩展中的部分功能与 PHP 7 的新安全策略不完全兼容,以至于后续出现了openssl扩展,所以使用mcrypt扩展需要思量PHP版本号:
        1、PHP7以前的版本,mcrypt 扩展可以使用;
        2、从 PHP 7.1 开始,mcrypt扩展被标记为废弃(deprecated),固然在PHP7.1和PHP7.2中还可以使用 mcrypt 扩展,但官方不保举使用;
        3、在 PHP 7.2 中,使用 mcrypt扩展会产生E_DEPRECATED 错误消息,告知开辟者 mcrypt扩展 即将被弃用;
        4、到了 PHP 7.3 及更高版本,mcrypt扩展 已经被完全移除,推动开辟者使用更安全、更新的加密技能,如openssl扩展;
        简言之,随着操作系统和 PHP 运行环境的更新,某些操作系统更新后大概不再支持旧版本的 mcrypt 底层库,需要审慎选型以及升级。

二、前置预备

        当前Mac系统环境:macOS Sequoia 15.1
        PHP版本:7.2
1、确认 PHP 版本

        安装 mcrypt 扩展之前,需要先确定 Mac 系统中是否已经成功安装了 PHP7的运行环境,而且还要明确是PHP7的哪个版本,PHP7.1和 PHP7.2对mcrypt 扩展的安装方式都不一样。
打开终端,检查PHP版本
  1. php -v
复制代码
执行结果如下,阐明已经成功安装php7.2版本的运行环境



2、下载mcrypt 扩展依赖

      mcrypt扩展 依赖 libmcrypt 和 mhash 两个库文件,在安装mcrypt扩展之前,需要先安装依赖的库文件,安装次序是:mhash、Libmcrypt
     安装方式是通过源码编译方式进行安装:


  • mhash(mhash-0.9.9.9.tar.gz)源码包下载:https://sourceforge.net/projects/mhash/files/mhash/0.9.9.9/mhash-0.9.9.9.tar.gz/download
  • Libmcrypt(libmcrypt-2.5.8.tar.gz)源码包下载:https://sourceforge.net/projects/mcrypt/files/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz/download


3、安装mcrypt扩展依赖

3.1 mhash

3.1.1 安装

下载后进行解压,进行项目目录,执行编译下令
  1. xxxx@mac ~/Downloads tar -zxvf mhash-0.9.9.9.tar.gz
  2. xxxx@mac ~/Downloads cd mhash-0.9.9.9
  3. xxxx@mac ~/Downloads/mhash-0.9.9.9 ls
  4. xxxx@mac ~/Downloads/mhash-0.9.9.9 sudo ./configure --prefix=/usr/local && sudo make && sudo make install
复制代码
注意点:


  • 1、需要sudo 执行,因为过程中会需要系统权限去创建或者cp文件,否则会出现 “ Permission denied ” 问题而导致编译失败
  • 2、--prefix=/usr/local,指定安装目录,默认安装到 /usr/local/lib目录下,可根据本身的安装风俗选择安装位置
  • 3、当出现以下结果信息时,阐明已经安装成功



  • 4、进入 /usr/local/lib 目录,检查是否有libmhash.dylib库文件,有即阐明安装完成



3.2 Libmcrypt

3.2.1 安装

下载后进行解压,进行项目目录,执行编译下令
  1. xxxx@mac ~/Downloads tar -zxvf libmcrypt-2.5.8.tar.gz
  2. xxxx@mac ~/Downloads cd libmcrypt-2.5.8
  3. xxxx@mac ~/Downloads/libmcrypt-2.5.8 ls
  4. xxxx@mac ~/Downloads/libmcrypt-2.5.8 sudo ./configure --prefix=/usr/local && sudo make && sudo make install
复制代码
注意点:
1、过程中出现 warning 信息可以不消关注
2、出现以下信息,阐明安装成功:

3、进入 /usr/local/lib 目录,检查是否有libmhash.dylib库文件,有即阐明安装完成



3.2.2 常见报错问题梳理

1、configure: error: /bin/sh ./config.sub -apple-darwin24.1.0 failed

【问题征象】:执行报错:checking build system type... configure: error: /bin/sh ./config.sub -apple-darwin24.1.0 failed
【缘故原由分析】:config.sub 文件是用于帮助 configure 脚本确定构建系统类型的一个辅助脚本,它会根据当前系统的相关信息(比如操作系统版本、硬件架构等)来准确判断构建环境。如果这个文件破坏了或者在相应的目录中缺失了,那么执行 ./config.sub -apple-darwin24.1.0 这个操作就无法正常完成,进而导致 configure 脚本报错。
【解决办法】:重新获取最新的config.sub和config.guess,替换掉项目目录下的文件,这里要处理的文件有两个:config.sub、 config.guess


  • 先从官网下载最新的sub、guess文件,可以长途仓库clone到本地的随意一个目录( 克隆地点:Index of /git/config.git/ )
  • 再复制这两个文件到 libmcrypt-2.5.8 项目目录下,并覆盖源文件
  • 回到项目目录继续执行configure下令
  1. xxxx@mac ~/tools/config git clone https://git.savannah.gnu.org/git/config.git
  2. xxxx@mac ~/tools/config cp -f config.sub config.guess /Users/your_user/Downloads/libmcrypt-2.5.8
复制代码


2、error: call to undeclared library function 'calloc' with type 'void *(unsigned long, unsigned long)'; ISO C99

【问题征象】:执行报错:3-way.c:294:12: error: call to undeclared library function 'calloc' with type 'void *(unsigned long, unsigned long)'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
【缘故原由分析】:从表现上看,出现该报错是因为调用了一个未声明的库函数 calloc,并且由于遵循的 C 语言标准(ISO C99 及之后版本)不支持隐式函数声明,所以编译器给出了这个警告(在编译选项中开启了 -Wimplicit-function-declaration 时会显示如许的错误提示),本质缘故原由是,在 C 语言中,当使用标准库函数(像 calloc 如许的函数)时,需要包含对应的头文件来告知编译器函数的原型声明等信息。对于 calloc 函数,精确的做法是包含  <stdlib.h>  头文件。如果在 3-way.c 文件中没有包含这个头文件,编译器就不知道 calloc 函数的参数类型、返回值类型等详细信息,进而判断这是一个未声明的函数调用,不符合 C99 及后续标准要求。
【解决办法】


  • 检查 3-way.c 是否包含了  <stdlib.h>  头文件,如果没有,需要添加上
  1. xxxx@mac ~/Downloads/libmcrypt-2.5.8 find . -name 3-way.c
  2. ./modules/algorithms/3-way.c
  3. xxxx@mac ~/Downloads/libmcrypt-2.5.8 vi ./modules/algorithms/3-way.c
复制代码

项目目录下的C语言文件比较多,如果每个文件都因为同样的缘故原由执行报错,则每个文件都需要加上 <stdlib.h>  头文件,一个个改很贫苦,所以需要找一个统一入口进行调解,发现每个C文件里面都会引入<libdefs.h> 头文件 ,所以可以统一把 <stdio.h> 、<stdlib.h> 两个头文件加入到 libdefs.h 文件中。
  1. xxxx@mac ~/Downloads/libmcrypt-2.5.8 find . -name libdefs.h
  2. ./lib/libdefs.h
  3. xxxx@mac ~/Downloads/libmcrypt-2.5.8 vi ./lib/libdefs.h
复制代码



  • 补充后,回到项目目录下,继续执行configure下令

3、error: call to undeclared library function 'isdigit' with type 'int (int)'; ISO C99

【问题征象】执行报错:mcrypt_extra.c:376:19: error: call to undeclared library function 'isdigit' with type 'int (int)'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]

【缘故原由分析】:函数声明不符合标准要求,代码中调用了 isdigit 函数,然而编译器找不到其声明信息,所以判断这是对未声明的库函数的调用,不符合 C99 及之后标准对函数声明的要求,进而报出此错误。
【解决办法】:在 mcrypt_extra.c 文件的开头(要确保在调用 isdigit 函数之前,通常是在所有函数调用语句之前)添加  #include <ctype.h> 语句,保存后,回到项目目录下继续执行configure下令。



4、error: type specifier missing, defaults to 'int'; ISO C99

【问题征象】执行报错:
mcrypt_symb.c:5:8: error: type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int [-Wimplicit-int]
fatal error: too many errors emitted, stopping now [-ferror-limit=]

【缘故原由分析】:不符合 C99 及后续标准的类型声明问题,
【解决办法】
方法一:一个个改,改到符合C99标准为止,但不太实际,项目下文件那么多,执行一个改一个,服从太低了。
方法二(保举):既然是一个编译标准问题,之前其他环境能执行成功,阐明应该是有其他的编译标准,这里我们可以选择直接修改编译标准为 C89,以满足当前的编译执行。
终极解决方案是:修改 configure 脚本文件,找到 CFLAGS 变量的代码处,后面添加 : -std=c89,保存后,回到项目目录下继续执行configure下令。
修改前:

修改后:

ps:为什么是修改这个地方,也是踩坑踩出来的,在编译下令执行过程中,通过这个信息可以锁定configure 文件 要加-std=c89 的位置



三、mcrypt 安装执行

        由于 PHP 版本的缘故原由,mcrypt扩展有不同的安装方式,PHP7.2可以通过 pecl 方式进行安装;PHP7.1 只能通过源码编译方式进行安装。
        阐明:为什么PHP7.1不能用 pecl 方式进行安装?因为 mcrypt 扩展通过 pecl 安装时,要求 PHP 的版本范围是大于即是 7.2.0 且小于即是 8.4.0。

所以这里区分下PHP7.1 和 PHP7.2的安装方式:
1、基于PHP7.2安装mcrypt 扩展

1.1 安装

安装方式:基于 pecl 工具进行安装


  • 先查找是PECL仓库中存在与mcrypt相关扩展及其版本,下令执行:pecl search mcrypt



  • 执行 pecl install mcrypt 下令



  • 执行结束,会告知你扩展文件详细放在哪里,同时会修改你的php.ini文件,开启mcrypt扩展


至此,mcrypt扩展安装成功!!

2、基于PHP7.1安装mcrypt 扩展

2.1 安装



  • 选择符合的mcrypt版本,官网有最新的版本源码包,可按需选择下载,提供了以下几个安装源码包的下载地点:

    • - mcrypt源码包官网地点:https://sourceforge.net/projects/mcrypt/files/MCrypt/
    • - mcrypt-1.0.7下载:https://pecl.php.net/get/mcrypt-1.0.7.tgz
    • - mcrypt-1.0.1下载:https://pecl.php.net/get/mcrypt-1.0.1.tgz
    • - mcrypt-1.0.0下载:https://pecl.php.net/get/mcrypt-1.0.0.tgz

通过 pecl search mcrypt 结果可以看出,当前 PHP7.1 版本 可选择 mcrypt 1.0.7 版本进行安装。


  • 下载源码后,进行解压,进入到项目目录,执行编译下令
  1. xxxx@mac ~/Downloads tar -zxvf mcrypt-1.0.7.tar.gz
  2. xxxx@mac ~/Downloads cd mcrypt-1.0.7
  3. xxxx@mac ~/Downloads/mcrypt-1.0.7 ls
  4. xxxx@mac ~/Downloads/mcrypt-1.0.7 sudo ./configure --prefix=/usr/local && sudo make && sudo make install
复制代码


  • 执行结束,会告诉你扩展点详细的文件位置,进目录查看,确实存在mcrypt.so,阐明扩展安装成功!!




  • 检查php.ini文件,看是否有开启 mcrypt.so 插件

至此,mcrypt扩展安装成功!!

2.2 常见问题梳理

1、error: incompatible function pointer types initializing 'php_stream_filter *(*)

【问题征象】执行报错:~/Downloads/mcrypt-1.0.7/mcrypt_filter.c:273:2: error: incompatible function pointer types initializing 'php_stream_filter *(*)(const char *, zval *, int)' (aka 'struct _php_stream_filter *(*)(const char *, struct _zval_struct *, int)') with an expression of type 'php_stream_filter *(const char *, zval *, uint8_t)' (aka 'struct _php_stream_filter *(const char *, struct _zval_struct *, unsigned char)') [-Wincompatible-function-pointer-types]
【缘故原由分析】:函数指针类型不兼容问题,函数指针参数中最后一个参数的类型,一个是 uint8_t(无符号字符类型,等同于 unsigned char),另一个是 int 类型,这种类型不匹配违反了 C 语言对于函数指针类型一致性的要求,所以编译器报出此错误。
【解决办法】:修改函数指针所指向函数的参数类型
修改前:

修改后:



四、mcrypt 扩展验证

1、检查php.ini文件中是否开启 mcrypt.so 插件



  • 如果不知道php.ini文件放在哪,可以通过find 全局搜索该文件:sudo find / -name php.ini
  • 如果本地PHP环境是基于Homebrew安装的,一样平常情况下是在 /opt/homebrew/etc/php/7.2 目录下可以找到

2、下令行检查php扩展模块

下令行执行:php -m | grep mcrypt



3、通过phpstrom查看



五、常见问题梳理

1、执行报错:PHP Warning: PHP Startup: mcrypt: Unable to initialize module


【缘故原由分析】:mcrypt 模块和 PHP 本身在编译时所使用的模块 API 版本不一致。mcrypt 模块是基于 20170718 版本的模块 API 进行编译的,然而 PHP 却是依据 20160303 版本的模块 API 编译得来。这种版本上的差别使得 PHP 在启动尝试初始化 mcrypt 模块时,无法成功完成初始化操作,阐明PHP7.1 天生的 mcrypt.so 是不能放到 PHP7.2里面去用的

2、mcrypt_get_iv_size()、mcrypt_create_iv()、mcrypt_decrypt() 执行报错

【问题征象】执行报错:PHP Deprecated Warning 'yii\base\ErrorException' with message 'Function mcrypt_get_iv_size() is deprecated'
【缘故原由分析】:错误信息表示正在使用的 mcrypt_get_iv_size() 函数已经被弃用
【问题解决】:临时解决是抑制警告,在函数调用的前面加一个 @ ,比如:@mcrypt_get_iv_size


        以上便是基于Mac环境下安装mcrypt扩展的全过程,linux环境的安装也是大差不差,举一反三即可,如有描述不对的地方,欢迎指正

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

滴水恩情

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表