這篇文章給大家分享的是PHP支持CURL字符串證書的方法,相信大部分人都還沒學(xué)會(huì)這個(gè)技能,為了讓大家更加了解,給大家總結(jié)了以下內(nèi)容,話不多說,一起往下看吧。
創(chuàng)新互聯(lián)建站專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、盤龍網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5技術(shù)、商城系統(tǒng)網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為盤龍等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
最近在對(duì)接微信支付的時(shí)候,需要在退款處用到證書,由于我們是SAAS平臺(tái),要支持多方多渠道支付,如果把所有證書文件保存在應(yīng)用服務(wù)器會(huì)受到SLB的影響,會(huì)導(dǎo)致某臺(tái)機(jī)器文件不同步而阻礙退款流程,但把文件存在OSS的話,后端又要從OSS下載到應(yīng)用服務(wù)器來保證一致性。思來想去,最終決定將證書內(nèi)容保存在數(shù)據(jù)庫,不同客戶各對(duì)應(yīng)一份證書文件,無論幾臺(tái)機(jī)器做集群都能保證文件的一致性,同時(shí)也避免了多余的下載步驟。
但是剛做就遇到了問題,PHP的CURL證書并不支持字符串的傳輸,只能填寫證書路徑(以下是官方的說法)
Client certificates must be specified by a path expression to a certificate store.
我第一個(gè)想到的就是創(chuàng)建空白文件,將證書內(nèi)容寫進(jìn)去,等證書使用完畢后再將文件刪除,但是創(chuàng)建實(shí)體文件再刪除的操作消耗性能不說,還非常麻煩,有沒有創(chuàng)建臨時(shí)文件的方法呢?有,tmpfile()
函數(shù)就可以幫我們創(chuàng)建臨時(shí)文件并拿到文件路徑,于是我寫了一個(gè)獲取臨時(shí)文件路徑的方法
比較悲哀的是,通過這個(gè)方法返回的路徑根本讀不到內(nèi)容,甚至一度以為是不是被騙了
file_get_contents(/tmp/phpyyiOZv): failed to open stream: No such file or directory
看了官方文檔才找到原因,如果tmpfile()
返回的句柄引用計(jì)數(shù)為0的話就會(huì)將臨時(shí)文件回收,臨時(shí)路徑自然也就失效了,顯然方法getTmpPathByContent()
執(zhí)行完后,局部變量$tmpFile
的生命周期就結(jié)束了(官方文檔如下)
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.
確認(rèn)了根源,那我們現(xiàn)在亟需找到一個(gè)生命周期隨進(jìn)程結(jié)束而終止的變量類型來保存句柄,什么類型能滿足條件呢?靜態(tài)變量。靜態(tài)變量與局部變量不同的是,在PHP生命周期開始時(shí)便會(huì)為其分配內(nèi)存空間,并會(huì)把它存儲(chǔ)在全局變量區(qū)域,而全局變量是在模塊關(guān)閉階段銷毀的,這樣的話,聲明靜態(tài)變量就可以使$tmpFile
引用計(jì)數(shù)持續(xù)保持大于0的狀態(tài),那我們的代碼就可以做出如下處理
再執(zhí)行一次就成功讀取了臨時(shí)文件的內(nèi)容
-----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-----
下面就可以把生成的臨時(shí)文件地址設(shè)置到CURLOPT_SSLCERT
了
看完上述內(nèi)容,你們掌握PHP支持CURL字符串證書的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!