PHP實現(xiàn)支持CURL字符串證書傳輸?shù)姆椒╛第1頁
PHP實現(xiàn)支持CURL字符串證書傳輸?shù)姆椒╛第2頁
PHP實現(xiàn)支持CURL字符串證書傳輸?shù)姆椒╛第3頁
PHP實現(xiàn)支持CURL字符串證書傳輸?shù)姆椒╛第4頁
PHP實現(xiàn)支持CURL字符串證書傳輸?shù)姆椒╛第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第PHP實現(xiàn)支持CURL字符串證書傳輸?shù)姆椒ㄗ罱趯游⑿胖Ц兜臅r候,需要在退款處用到證書,由于我們是SAAS平臺,要支持多方多渠道支付,如果把所有證書文件保存在應(yīng)用服務(wù)器會受到SLB的影響,會導(dǎo)致某臺機器文件不同步而阻礙退款流程,但把文件存在OSS的話,后端又要從OSS下載到應(yīng)用服務(wù)器來保證一致性。思來想去,最終決定將證書內(nèi)容保存在數(shù)據(jù)庫,不同客戶各對應(yīng)一份證書文件,無論幾臺機器做集群都能保證文件的一致性,同時也避免了多余的下載步驟。

問題

但是剛做就遇到了問題,PHP的CURL證書并不支持字符串的傳輸,只能填寫證書路徑(以下是官方的說法)

Clientcertificatesmustbespecifiedbyapathexpressiontoacertificatestore.

解決過程

我第一個想到的就是創(chuàng)建空白文件,將證書內(nèi)容寫進去,等證書使用完畢后再將文件刪除,但是創(chuàng)建實體文件再刪除的操作消耗性能不說,還非常麻煩,有沒有創(chuàng)建臨時文件的方法呢?有,tmpfile()函數(shù)就可以幫我們創(chuàng)建臨時文件并拿到文件路徑,于是我寫了一個獲取臨時文件路徑的方法

publicfunctiongetTmpPathByContent($content)

$tmpFile=tmpfile();

fwrite($tmpFile,$content);

$tempPemPath=stream_get_meta_data($tmpFile);

return$tempPemPath['uri'];///tmp/phpXZCtAO

比較悲哀的是,通過這個方法返回的路徑根本讀不到內(nèi)容,甚至一度以為是不是被騙了

file_get_contents(/tmp/phpyyiOZv):failedtoopenstream:Nosuchfileordirectory

看了官方文檔才找到原因,如果tmpfile()返回的句柄引用計數(shù)為0的話就會將臨時文件回收,臨時路徑自然也就失效了,顯然方法getTmpPathByContent()執(zhí)行完后,局部變量$tmpFile的生命周期就結(jié)束了(官方文檔如下)

Thefileisautomaticallyremovedwhenclosed(forexample,bycallingfclose(),orwhentherearenoremainingreferencestothefilehandlereturnedbytmpfile()),orwhenthescriptends.

確認了根源,那我們現(xiàn)在亟需找到一個生命周期隨進程結(jié)束而終止的變量類型來保存句柄,什么類型能滿足條件呢?靜態(tài)變量。靜態(tài)變量與局部變量不同的是,在PHP生命周期開始時便會為其分配內(nèi)存空間,并會把它存儲在全局變量區(qū)域,而全局變量是在模塊關(guān)閉階段銷毀的,這樣的話,聲明靜態(tài)變量就可以使$tmpFile引用計數(shù)持續(xù)保持大于0的狀態(tài),那我們的代碼就可以做出如下處理

publicfunctiongetTmpPathByContent($content)

static$tmpFile=null;

$tmpFile=tmpfile();

fwrite($tmpFile,$content);

$tempPemPath=stream_get_meta_data($tmpFile);

return$tempPemPath['uri'];

再執(zhí)行一次就成功讀取了臨時文件的內(nèi)容

-----BEGINCERTIFICATE-----

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=

-----ENDCERTIFICATE-----

下面就可以把生成的臨時文件地址設(shè)置到CURLOPT_SSLCERT了

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論