PHP如何支持CURL字符串证书传输 ?
Posted php中文网最新课程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP如何支持CURL字符串证书传输 ?相关的知识,希望对你有一定的参考价值。
点击蓝字关注我们!每天获取最新的编程小知识!
源 / php中文网 源 / www.php.cn
背景
最近在对接微信支付的时候,需要在退款处用到证书,由于我们是SAAS平台,要支持多方多渠道支付,如果把所有证书文件保存在应用服务器会受到SLB的影响,会导致某台机器文件不同步而阻碍退款流程,但把文件存在OSS的话,后端又要从OSS下载到应用服务器来保证一致性。思来想去,最终决定将证书内容保存在数据库,不同客户各对应一份证书文件,无论几台机器做集群都能保证文件的一致性,同时也避免了多余的下载步骤。
问题
但是刚做就遇到了问题,PHP的CURL证书并不支持字符串的传输,只能填写证书路径(以下是官方的说法)
1 |
|
解决过程
我第一个想到的就是创建空白文件,将证书内容写进去,等证书使用完毕后再将文件删除,但是创建实体文件再删除的操作消耗性能不说,还非常麻烦,有没有创建临时文件的方法呢?有,tmpfile()
函数就可以帮我们创建临时文件并拿到文件路径,于是我写了一个获取临时文件路径的方法
1 2 3 4 5 6 7 8 9 |
|
比较悲哀的是,通过这个方法返回的路径根本读不到内容,甚至一度以为是不是被骗了
1 |
|
看了官方文档才找到原因,如果tmpfile()
返回的句柄引用计数为0的话就会将临时文件回收,临时路径自然也就失效了,显然方法getTmpPathByContent()
执行完后,局部变量$tmpFile
的生命周期就结束了(官方文档如下)
1 |
|
确认了根源,那我们现在亟需找到一个生命周期随进程结束而终止的变量类型来保存句柄,什么类型能满足条件呢?静态变量。静态变量与局部变量不同的是,在PHP生命周期开始时便会为其分配内存空间,并会把它存储在全局变量区域,而全局变量是在模块关闭阶段销毁的,这样的话,声明静态变量就可以使$tmpFile
引用计数持续保持大于0的状态,那我们的代码就可以做出如下处理
1 2 3 4 5 6 7 8 9 10 |
|
再执行一次就成功读取了临时文件的内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
1 2 3 4 5 |
|
-END-
声明:本文选自「 php中文网 」,搜索「 phpcnnew 」即可关注!
▼请点击下方:“阅读原文”,在线查看全部文章内容!
以上是关于PHP如何支持CURL字符串证书传输 ?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 PHP 发送带有 pem 证书的 curl 请求?