国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

PHP支持CURL字符串證書傳輸?shù)姆椒ń榻B(代碼)

2024-05-04 21:50:58
字體:
供稿:網(wǎng)友

本篇文章給大家?guī)淼膬?nèi)容是關(guān)于PHP支持CURL字符串證書傳輸?shù)姆椒ń榻B(代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

最近在對接微信支付的時候,需要在退款處用到證書,由于我們是SAAS平臺,要支持多方多渠道支付,如果把所有證書文件保存在應(yīng)用服務(wù)器會受到SLB的影響,會導(dǎo)致某臺機(jī)器文件不同步而阻礙退款流程,但把文件存在OSS的話,后端又要從OSS下載到應(yīng)用服務(wù)器來保證一致性。思來想去,最終決定將證書內(nèi)容保存在數(shù)據(jù)庫,不同客戶各對應(yīng)一份證書文件,無論幾臺機(jī)器做集群都能保證文件的一致性,同時也避免了多余的下載步驟。

問題

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

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

解決過程

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

  1. <?php 
  2.  
  3.     public function getTmpPathByContent($content
  4.  
  5.     { 
  6.  
  7.         $tmpFile = tmpfile(); 
  8. //Vevb.com 
  9.         fwrite($tmpFile$content); 
  10.  
  11.         $tempPemPath = stream_get_meta_data($tmpFile); 
  12.  
  13.         return $tempPemPath['uri'];  ///tmp/phpXZCtAO 
  14.  
  15.     } 
  16.  
  17. ?> 

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

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

看了官方文檔才找到原因,如果tmpfile()返回的句柄引用計數(shù)為0的話就會將臨時文件回收,臨時路徑自然也就失效了,顯然方法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)在亟需找到一個生命周期隨進(jìn)程結(jié)束而終止的變量類型來保存句柄,什么類型能滿足條件呢?靜態(tài)變量。靜態(tài)變量與局部變量不同的是,在PHP生命周期開始時便會為其分配內(nèi)存空間,并會把它存儲在全局變量區(qū)域,而全局變量是在模塊關(guān)閉階段銷毀的,這樣的話,聲明靜態(tài)變量就可以使$tmpFile引用計數(shù)持續(xù)保持大于0的狀態(tài),那我們的代碼就可以做出如下處理

  1. <?php 
  2.  
  3.     public function getTmpPathByContent($content
  4.  
  5.     { 
  6.  
  7.         static $tmpFile = null; 
  8.  
  9.         $tmpFile = tmpfile(); 
  10.  
  11.         fwrite($tmpFile$content); 
  12. //Vevb.com 
  13.         $tempPemPath = stream_get_meta_data($tmpFile); 
  14.  
  15.         return $tempPemPath['uri']; 
  16.  
  17.     } 
  18.  
  19. ?> 

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

  1. -----BEGIN CERTIFICATE----- 
  2.  
  3. MIIEbDCCA9WgAwIBAgIEAWJKHDANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC 
  4.  
  5. Q04xEjAQBgNVBAgTCUd1YW5nZG9uZzERMA8GA1UEBxMIU2hlbnpoZW4xEDAOBgNV 
  6.  
  7. BAoTB1RlbmNlbnQxDDAKBgNVBAsTA1dYRzETMBEGA1UEAxMKTW1wYXltY2hDQTEf 
  8.  
  9. MB0GCSqGSIb3DQEJARYQbW1wYXltY2hAdGVuY2VudDAeFw0xNzA4MDcwOTIxNDda 
  10.  
  11. Fw0yNzA4MDUwOTIxNDdaMIGbMQswCQYDVQQGEwJDTjESMBAGA1UECBMJR3Vhbmdk 
  12.  
  13. b25nMREwDwYDVQQHEwhTaGVuemhlbjEQMA4GA1UEChMHVGVuY2VudDEOMAwGA1UE 
  14.  
  15. CxMFTU1QYXkxMDAuBgNVBAMUJ+a3seWcs+W4guaYjua6kOi9r+S7tuiCoeS7veac 
  16.  
  17. iemZkOWFrOWPuDERMA8GA1UEBBMIMTAyNTkyODEwggEiMA0GCSqGSIb3DQEBAQUA 
  18.  
  19. A4IBDwAwggEKAoIBAQDg2D3++uOxY/yMGQPBnROvyYimnCsfGE0dnqdGUTCykqBh 
  20.  
  21. yfv82zE1/St/4DQX2QDiIvLif+sMGcYwF4bkzdY+HgitYLI0k5o/5LCNZOMctuio 
  22.  
  23. kdYC2bNdWHq2y9S5UWLQR1Zvq+6QyPBVBVY9yq9xtQhIlUTsZnICAp3iQLfQUR3l 
  24.  
  25. aEdH9IERoRUIkbyb8oX5ONQz4P9jOeE9C5iwx0QrH4s01NFhkhr8JHlugRLpo9vA 
  26.  
  27. xGgi/48fOlONj6wWal5Gt0OvvEbIwgQwya15KBX2YeGnZvYBQa+lQMeXEqZSFie3 
  28.  
  29. G+wGvbtlONczQEtp+JDxLZLUS/FT7U0TQN/t8JDvAgMBAAGjggFGMIIBQjAJBgNV 
  30.  
  31. HRMEAjAAMCwGCWCGSAGG+EIBDQQfFh0iQ0VTLUNBIEdlbmVyYXRlIENlcnRpZmlj 
  32.  
  33. YXRlIjAdBgNVHQ4EFgQUjDJ75bu3Roog7XOH6uFAdZ6kpcIwgb8GA1UdIwSBtzCB 
  34.  
  35. tIAUPgUm9iJitBVbiM1kfrDUYqflhnShgZCkgY0wgYoxCzAJBgNVBAYTAkNOMRIw 
  36.  
  37. EAYDVQQIEwlHdWFuZ2RvbmcxETAPBgNVBAcTCFNoZW56aGVuMRAwDgYDVQQKEwdU 
  38.  
  39. ZW5jZW50MQwwCgYDVQQLEwNXWEcxEzARBgNVBAMTCk1tcGF5bWNoQ0ExHzAdBgkq 
  40.  
  41. hkiG9w0BCQEWEG1tcGF5bWNoQHRlbmNlbnSCCQC7VJcrvADoVzAOBgNVHQ8BAf8E 
  42.  
  43. BAMCBsAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQEFBQADgYEA 
  44.  
  45. ucJLJkkHxlqQCEapZOWmySutqNVZxFbqyG//UXxxpA/1yG4e+KmufKZWv+c+MtYI 
  46.  
  47. 8i0KDDCv/UE+kkFIrHYDDKsdLRpxrYOUHGoqq0c7yBJ6Dimgy6m8U8FsEv3HtUR2 
  48.  
  49. 8g5xrg2Tc5MPWEp9ncEw575hGk0CXLDGOkI1nU+pGqk= 
  50.  
  51. -----END CERTIFICATE----- 

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

  1. <?php 
  2.  
  3.     $sslCertPath = getTmpPathByContent($content); 
  4.  
  5.     curl_setopt($ch,CURLOPT_SSLCERT, $sslCertPath); 
  6.  
  7.     //...... 
  8.  
  9. ?> 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 潮安县| 灵璧县| 合川市| 阜康市| 平顶山市| 招远市| 茶陵县| 翁牛特旗| 洛隆县| 阿尔山市| 尚志市| 上饶市| 昭觉县| 屏东市| 和田市| 宝山区| 辽阳县| 盘山县| 蕉岭县| 濮阳市| 淮安市| 湟中县| 兴国县| 鲜城| 赣州市| 永兴县| 丰宁| 桓仁| 康乐县| 河西区| 彩票| 营山县| 上林县| 南通市| 尉氏县| 贡山| 滨海县| 千阳县| 翁源县| 宁远县| 凤凰县|