<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      PHP如何支持CURL字符串證書傳輸

      背景

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

      問題

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

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

      解決過程

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

      <?php
          public function getTmpPathByContent($content)
          {
              $tmpFile = tmpfile();
              fwrite($tmpFile, $content);
              $tempPemPath = stream_get_meta_data($tmpFile);
              return $tempPemPath['uri'];	 ///tmp/phpXZCtAO
          }
      ?>
      

      比較悲哀的是,通過這個方法返回的路徑根本讀不到內(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.

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

      <?php
          public function getTmpPathByContent($content)
          {
              static $tmpFile = null;
              $tmpFile = tmpfile();
              fwrite($tmpFile, $content);
              $tempPemPath = stream_get_meta_data($tmpFile);
              return $tempPemPath['uri'];
          }
      ?>
      

      再執(zhí)行一次就成功讀取了臨時文件的內(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-----
      

      下面就可以把生成的臨時文件地址設置到CURLOPT_SSLCERT

      <?php
          $sslCertPath = getTmpPathByContent($content);
          curl_setopt($ch,CURLOPT_SSLCERT, $sslCertPath);
          //......
      ?>
      
      posted @ 2019-05-05 20:03  MARIOOW  閱讀(1515)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 十八禁国产精品一区二区| 亚洲中文字幕av天堂| 成人国产精品中文字幕| 熟妇激情一区二区三区| 国精品91人妻无码一区二区三区| 人人超碰人摸人爱| 国产日韩精品中文字幕| 厨房与子乱在线观看| 久久中文字幕日韩无码视频| 欧美熟妇xxxxx欧美老妇不卡| 国产天美传媒性色av高清| 十八禁国产一区二区三区| 国产乱妇乱子视频在播放| 亚洲黄日本午夜一区二区| 国产播放91色在线观看| 人妻少妇精品无码专区| 国产av一区二区三区精品| 久久人与动人物a级毛片 | 国产国产乱老熟女视频网站97| 日本久久香蕉一本一道| 海宁市| 日韩av综合中文字幕| 丁香花成人电影| 亚洲乱色一区二区三区丝袜| 亚洲av综合久久成人网| 农村妇女野外一区二区视频| 亚洲嫩模喷白浆在线观看| 国内精品无码一区二区三区 | 亚洲欧美人成电影在线观看| 亚洲精品国产精品乱码不卡| 亚洲精品综合久中文字幕| 免费看欧美全黄成人片| 国产精品久久久午夜夜伦鲁鲁| 额尔古纳市| 国内少妇人妻偷人精品| 午夜精品区| 老熟妇欲乱一区二区三区| 人人澡人摸人人添| 亚洲精品乱码久久久久久蜜桃不卡| 少妇熟女视频一区二区三区| 午夜福利国产精品视频|