PHP如何支持CURL字符串证书传输 ?-php教程

资源魔 74 0

布景

比来正在对接微信领取的时分,需求正在退款处用到证书,因为咱们是SAAS平台,要支持多方多渠道领取,假如把一切证书文件保留正在使用效劳器会遭到SLB的影响,会招致某台机械文件没有同步而障碍退款流程,但把文件存正在OSS的话,后端又要从OSS下载到使用效劳器来保障分歧性。思来想去,终极决议将证书内容保留正在数据库,没有同客户各对应一份证书文件,无论几台机械做集群都能保障文件的分歧性,同时也防止了过剩的下载步骤。

成绩

然而刚做就遇到了成绩,PHP的CURL证书其实不支持字符串的传输,只能填写证书门路(如下是民间的说法)

Client certificates must be specified by a path expression to a certificate store.

处理进程

我第一个想到的就是创立空缺文件,将证书内容写出来,等证书应用终了后再将文件删除了,然而创立实体文件再删除了的操作耗费功能没有说,还十分费事,有无创立暂时文件的办法呢?有,tmpfile()函数就能够帮咱们创立暂时文件并拿到文件门路,于是我写了一个猎取暂时文件门路的办法

<?php
    public function getTmpPathByContent($content)
    {
        $tmpFile = tmpfile();
        fwrite($tmpFile, $content);
        $tempPemPath = stream_get_meta_data($tmpFile);
        return $tempPemPath['uri'];  ///tmp/phpXZCtAO
    }
?>

比拟悲痛的是,经过这个办法前往的门路基本读没有到内容,乃至一度认为是否是上圈套了

file_get_contents(/tmp/phpyyiOZv): failed to open stream: No such file or directory

看了民间文档才找到缘由,假如tmpfile()前往的句柄援用计数为0的话就会将暂时文件收受接管,暂时门路天然也就生效了,显然办法getTmpPathByContent()执行完后,部分变量$tmpFile的生命周期就完结了(民间文档以下)

The file is automatically removed when closed (for example, by calling fclose(), or when there are no remaining references to the file handle returned by tmpfile()), or when the script ends.

确认了本源,那咱们如今亟需找到一个生命周期随过程完结而终止的变量类型来保留句柄,甚么类型能餍足前提呢?动态变量。动态变量与部分变量没有同的是,正在PHP生命周期开端时便会为其调配内存空间,并会把它存储正在全局变量区域,而全局变量是正在模块封闭阶段销毁的,这样的话,申明动态变量就能够使$tmpFile援用计数继续放弃年夜于0的状态,那咱们的代码就能够做出以下解决

<?php
    public function getTmpPathByContent($content)
    {
        static $tmpFile = null;
        $tmpFile = tmpfile();
        fwrite($tmpFile, $content);
        $tempPemPath = stream_get_meta_data($tmpFile);
        return $tempPemPath['uri'];
    }
?>

再执行一次就胜利读取了暂时文件的内容

-----BEGIN CERTIFICATE-----
MIIEbDCCA9WgAwIBAgIEAWJKHDANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC
Q04xEjAQBgNVBAgTCUd1YW5nZG9uZzERMA8GA1UEBxMIU2hlbnpoZW4xEDAOBgNV
BAoTB1RlbmNlbnQxDDAKBgNVBAsTA1dYRzETMBEGA1UEAxMKTW1wYXltY2hDQTEf
MB0GCSqGSIb3DQEJARYQbW1wYXltY2hAdGVuY2VudDAeFw0xNzA4MDcwOTIxNDda
Fw0yNzA4MDUwOTIxNDdaMIGbMQswCQYDVQQGEwJDTjESMBAGA1UECBMJR3Vhbmdk
b25nMREwDwYDVQQHEwhTaGVuemhlbjEQMA4GA1UEChMHVGVuY2VudDEOMAwGA1UE
CxMFTU1QYXkxMDAuBgNVBAMUJ+a3seWcs+W4guaYjua6kOi9r+S7tuiCoeS7veac
iemZkOWFrOWPuDERMA8GA1UEBBMIMTAyNTkyODEwggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQDg2D3++uOxY/yMGQPBnROvyYimnCsfGE0dnqdGUTCykqBh
yfv82zE1/St/4DQX2QDiIvLif+sMGcYwF4bkzdY+HgitYLI0k5o/5LCNZOMctuio
kdYC2bNdWHq2y9S5UWLQR1Zvq+6QyPBVBVY9yq9xtQhIlUTsZnICAp3iQLfQUR3l
aEdH9IERoRUIkbyb8oX5ONQz4P9jOeE9C5iwx0QrH4s01NFhkhr8JHlugRLpo9vA
xGgi/48fOlONj6wWal5Gt0OvvEbIwgQwya15KBX2YeGnZvYBQa+lQMeXEqZSFie3
G+wGvbtlONczQEtp+JDxLZLUS/FT7U0TQN/t8JDvAgMBAAGjggFGMIIBQjAJBgNV
HRMEAjAAMCwGCWCGSAGG+EIBDQQfFh0iQ0VTLUNBIEdlbmVyYXRlIENlcnRpZmlj
YXRlIjAdBgNVHQ4EFgQUjDJ75bu3Roog7XOH6uFAdZ6kpcIwgb8GA1UdIwSBtzCB
tIAUPgUm9iJitBVbiM1kfrDUYqflhnShgZCkgY0wgYoxCzAJBgNVBAYTAkNOMRIw
EAYDVQQIEwlHdWFuZ2RvbmcxETAPBgNVBAcTCFNoZW56aGVuMRAwDgYDVQQKEwdU
ZW5jZW50MQwwCgYDVQQLEwNXWEcxEzARBgNVBAMTCk1tcGF5bWNoQ0ExHzAdBgkq
hkiG9w0BCQEWEG1tcGF5bWNoQHRlbmNlbnSCCQC7VJcrvADoVzAOBgNVHQ8BAf8E
BAMCBsAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQEFBQADgYEA
ucJLJkkHxlqQCEapZOWmySutqNVZxFbqyG//UXxxpA/1yG4e+KmufKZWv+c+MtYI
8i0KDDCv/UE+kkFIrHYDDKsdLRpxrYOUHGoqq0c7yBJ6Dimgy6m8U8FsEv3HtUR2
8g5xrg2Tc5MPWEp9ncEw575hGk0CXLDGOkI1nU+pGqk=
-----END CERTIFICATE-----

上面就能够把天生的暂时文件地点设置到CURLOPT_SSLCERT

<?php
    $sslCertPath = getTmpPathByContent($content);
    curl_setopt($ch,CURLOPT_SSLCERT, $sslCertPath);
    //......
?>

以上就是PHP若何支持CURL字符串证书传输 ?的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学 curl

抱歉,评论功能暂时关闭!