近来在对接微信付出的时刻,须要在退款处用到证书,因为我们是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); //...... ?>
本篇文章到这里就已悉数完毕了,更多其他精彩内容能够关注ki4网的php视频教程栏目!
以上就是PHP支撑CURL字符串证书传输的要领引见(代码)的细致内容,更多请关注ki4网别的相干文章!