旗下导航:搜·么
当前位置:网站首页 > PHP教程 > 正文

PHP怎样支撑CURL字符串证书传输(细致处理历程)【php教程】

作者:搜搜PHP网发布时间:2019-11-26分类:PHP教程浏览:95


导读:背景近来在对接微信付出的时刻,需要在退款处用到证书,因为我们是SAAS平台,要支撑多方多渠道付出,假如把一切证书文件保留在应用服务器会遭到SLB的影响,会致使某台机械文件差别步...

背景

近来在对接微信付出的时刻,需要在退款处用到证书,因为我们是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视频教程】

以上就是PHP怎样支撑CURL字符串证书传输(细致处置惩罚历程)的细致内容,更多请关注ki4网别的相干文章!

标签:PHPCURL字符串证书传输