滴水恩情 发表于 2025-1-2 22:22:05

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

近来在mac本地环境安装了PHP7,但由于本地项目需要处理加解密事项,本地php环境没有安装mcrypt扩展导致跑不通,所以就花点时间完满下本地php运行环境,过程中也踩了许多坑,大伙应该也会碰到类似问题,所以就记录下,一起学习!! !
https://i-blog.csdnimg.cn/direct/ab6e5849bcc54434912159852048ff8c.webp
目录
一、配景引入
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版本
php -v 执行结果如下,阐明已经成功安装php7.2版本的运行环境
https://i-blog.csdnimg.cn/direct/a451e9529bfa4eeb8295ca0db08f0a79.png


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 安装

下载后进行解压,进行项目目录,执行编译下令
xxxx@mac ~/Downloads tar -zxvf mhash-0.9.9.9.tar.gz
xxxx@mac ~/Downloads cd mhash-0.9.9.9
xxxx@mac ~/Downloads/mhash-0.9.9.9 ls
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、当出现以下结果信息时,阐明已经安装成功
https://i-blog.csdnimg.cn/direct/94a399f1f326488cb9fe0e217baee020.png


[*]4、进入 /usr/local/lib 目录,检查是否有libmhash.dylib库文件,有即阐明安装完成
https://i-blog.csdnimg.cn/direct/3d739202fcde43e5a8b6b2493d658a27.png


3.2 Libmcrypt

3.2.1 安装

下载后进行解压,进行项目目录,执行编译下令
xxxx@mac ~/Downloads tar -zxvf libmcrypt-2.5.8.tar.gz
xxxx@mac ~/Downloads cd libmcrypt-2.5.8
xxxx@mac ~/Downloads/libmcrypt-2.5.8 ls
xxxx@mac ~/Downloads/libmcrypt-2.5.8 sudo ./configure --prefix=/usr/local && sudo make && sudo make install 注意点:
1、过程中出现 warning 信息可以不消关注
2、出现以下信息,阐明安装成功:
https://i-blog.csdnimg.cn/direct/648e2c1f72b44a77ae9f361cf7b6385b.png
3、进入 /usr/local/lib 目录,检查是否有libmhash.dylib库文件,有即阐明安装完成
https://i-blog.csdnimg.cn/direct/2070e2edc66544b791c2122854bdd8eb.png


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下令
xxxx@mac ~/tools/config git clone https://git.savannah.gnu.org/git/config.git
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>  头文件,如果没有,需要添加上
xxxx@mac ~/Downloads/libmcrypt-2.5.8 find . -name 3-way.c
./modules/algorithms/3-way.c
xxxx@mac ~/Downloads/libmcrypt-2.5.8 vi ./modules/algorithms/3-way.c https://i-blog.csdnimg.cn/direct/a311abd29999442da3425f613c8cba05.png
项目目录下的C语言文件比较多,如果每个文件都因为同样的缘故原由执行报错,则每个文件都需要加上 <stdlib.h>  头文件,一个个改很贫苦,所以需要找一个统一入口进行调解,发现每个C文件里面都会引入<libdefs.h> 头文件 ,所以可以统一把 <stdio.h> 、<stdlib.h> 两个头文件加入到 libdefs.h 文件中。
xxxx@mac ~/Downloads/libmcrypt-2.5.8 find . -name libdefs.h
./lib/libdefs.h
xxxx@mac ~/Downloads/libmcrypt-2.5.8 vi ./lib/libdefs.h https://i-blog.csdnimg.cn/direct/379258673f05463fb2d8ac39b1e50039.png


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


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=]
https://i-blog.csdnimg.cn/direct/ebd5a209622743b888d481da25ae7c75.png
【缘故原由分析】:不符合 C99 及后续标准的类型声明问题,
【解决办法】:
方法一:一个个改,改到符合C99标准为止,但不太实际,项目下文件那么多,执行一个改一个,服从太低了。
方法二(保举):既然是一个编译标准问题,之前其他环境能执行成功,阐明应该是有其他的编译标准,这里我们可以选择直接修改编译标准为 C89,以满足当前的编译执行。
终极解决方案是:修改 configure 脚本文件,找到 CFLAGS 变量的代码处,后面添加 : -std=c89,保存后,回到项目目录下继续执行configure下令。
修改前:
https://i-blog.csdnimg.cn/direct/bdb6615670b84799aa080397b85d0774.png
修改后:
https://i-blog.csdnimg.cn/direct/d6c5962881c5472bb80d58bdbff26461.png
ps:为什么是修改这个地方,也是踩坑踩出来的,在编译下令执行过程中,通过这个信息可以锁定configure 文件 要加-std=c89 的位置
https://i-blog.csdnimg.cn/direct/8f1a6f33a479400bbceff4a9a66dbb3f.png


三、mcrypt 安装执行

        由于 PHP 版本的缘故原由,mcrypt扩展有不同的安装方式,PHP7.2可以通过 pecl 方式进行安装;PHP7.1 只能通过源码编译方式进行安装。
        阐明:为什么PHP7.1不能用 pecl 方式进行安装?因为 mcrypt 扩展通过 pecl 安装时,要求 PHP 的版本范围是大于即是 7.2.0 且小于即是 8.4.0。
https://i-blog.csdnimg.cn/direct/8e8efc936e244554836dcf1c84d6125e.png
所以这里区分下PHP7.1 和 PHP7.2的安装方式:
1、基于PHP7.2安装mcrypt 扩展

1.1 安装

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


[*]先查找是PECL仓库中存在与mcrypt相关扩展及其版本,下令执行:pecl search mcrypt
https://i-blog.csdnimg.cn/direct/a038328f46ff4593ac0d3c85eac592ea.png


[*]执行 pecl install mcrypt 下令
https://i-blog.csdnimg.cn/direct/5b77c191cb714128bd390746a1c5fb3e.png


[*]执行结束,会告知你扩展文件详细放在哪里,同时会修改你的php.ini文件,开启mcrypt扩展
https://i-blog.csdnimg.cn/direct/c250144b2f734709bd15efd098375530.png
https://i-blog.csdnimg.cn/direct/d95cfaf0727d434ca349d361c8f78eb5.png
至此,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 版本进行安装。


[*]下载源码后,进行解压,进入到项目目录,执行编译下令
xxxx@mac ~/Downloads tar -zxvf mcrypt-1.0.7.tar.gz
xxxx@mac ~/Downloads cd mcrypt-1.0.7
xxxx@mac ~/Downloads/mcrypt-1.0.7 ls
xxxx@mac ~/Downloads/mcrypt-1.0.7 sudo ./configure --prefix=/usr/local && sudo make && sudo make install

[*]执行结束,会告诉你扩展点详细的文件位置,进目录查看,确实存在mcrypt.so,阐明扩展安装成功!!
https://i-blog.csdnimg.cn/direct/e2d60997933c41f294c8196ad5236882.png
https://i-blog.csdnimg.cn/direct/ba3725dfebfa40aabc20d1093fef63a8.png


[*]检查php.ini文件,看是否有开启 mcrypt.so 插件
https://i-blog.csdnimg.cn/direct/9bc7831129914340b69c88412989f7c5.png
至此,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 语言对于函数指针类型一致性的要求,所以编译器报出此错误。
【解决办法】:修改函数指针所指向函数的参数类型
修改前:
https://i-blog.csdnimg.cn/direct/1b7c45b233834b6399fee1f5b370a0b1.png
修改后:
https://i-blog.csdnimg.cn/direct/7d7b954596824d25bb7d1c7be12e78d6.png


四、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
https://i-blog.csdnimg.cn/direct/f2db08a6381c48afadcb11de99a5544b.png


3、通过phpstrom查看

https://i-blog.csdnimg.cn/direct/a5fd897115404628a288308c3152df76.png

五、常见问题梳理

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

https://i-blog.csdnimg.cn/direct/373f08b8cefc4b79b3819cb36b03369f.png
【缘故原由分析】: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环境的安装也是大差不差,举一反三即可,如有描述不对的地方,欢迎指正
页: [1]
查看完整版本: 手把手教你在Mac环境下基于php7安装mcrypt扩展