Heim >Backend-Entwicklung >PHP-Tutorial >Wie unterstützt PHP die Übertragung von CURL-String-Zertifikaten?

Wie unterstützt PHP die Übertragung von CURL-String-Zertifikaten?

藏色散人
藏色散人nach vorne
2019-04-25 09:27:382895Durchsuche

Hintergrund

Bei der Verbindung zur WeChat-Zahlung müssen Zertifikate am Rückerstattungspunkt verwendet werden. Da wir eine SAAS-Plattform sind, müssen wir Zahlungen über mehrere Parteien und alle Kanäle unterstützen Wenn Dateien auf dem Anwendungsserver gespeichert werden, ist dies von SLB betroffen. Die Dateien auf einem bestimmten Computer sind nicht synchron und behindern den Rückerstattungsprozess. Wenn die Dateien jedoch im OSS gespeichert sind, muss das Backend sie vom OSS auf den herunterladen Anwendungsserver, um Konsistenz sicherzustellen. Nach langem Überlegen haben wir uns schließlich entschieden, den Zertifikatsinhalt in der Datenbank zu speichern. Unabhängig davon, wie viele Maschinen im Cluster verwendet werden, kann die Konsistenz der Datei sichergestellt und redundante Downloadschritte vermieden werden .

Problem

Aber ich bin gleich beim Starten auf ein Problem gestoßen. Das CURL-Zertifikat von PHP unterstützt die Übertragung von Zeichenfolgen nicht und kann nur den Zertifikatspfad ausfüllen (das Folgende ist die offizielle Erklärung). )

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

Lösungsprozess

Das erste, was mir einfiel, war, eine leere Datei zu erstellen, den Zertifikatinhalt hineinzuschreiben und die Datei dann zu löschen, nachdem das Zertifikat verwendet wurde Der Vorgang, eine Entitätsdatei zu erstellen und dann zu löschen, ist immer noch sehr mühsam. Gibt es eine Möglichkeit, temporäre Dateien zu erstellen? Ja, die Funktion tmpfile() kann uns dabei helfen, eine temporäre Datei zu erstellen und den Dateipfad abzurufen. Deshalb habe ich eine Methode geschrieben, um den temporären Dateipfad abzurufen.

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

Das Traurige daran ist, dass der von dieser Methode zurückgegebene Pfad dies tut Überhaupt nicht gelesen. Ich konnte den Inhalt nicht finden und dachte sogar, ich wäre betrogen worden. Ich habe den Grund gefunden, nachdem ich die offiziellen Dokumente gelesen hatte. Wenn die von

zurückgegebene Handle-Referenzanzahl 0 ist , die temporäre Datei wird recycelt und der temporäre Pfad wird natürlich recycelt. Nachdem die Methode

ausgeführt wurde, endet der Lebenszyklus der lokalen Variablen tmpfile() (das offizielle Dokument lautet wie folgt). 🎜>

file_get_contents(/tmp/phpyyiOZv): failed to open stream: No such file or directory
getTmpPathByContent() hat die Grundursache bestätigt, dann müssen wir jetzt dringend einen Lebenszyklus-Randomizer finden. Der Variablentyp wird verwendet, um das Handle zu speichern, wenn der Prozess endet. Welcher Typ kann die Bedingungen erfüllen? statische Variablen. Der Unterschied zwischen statischen Variablen und lokalen Variablen besteht darin, dass ihnen zu Beginn des PHP-Lebenszyklus Speicherplatz zugewiesen und im globalen Variablenbereich gespeichert wird. In diesem Fall werden statische Variablen von Ihnen deklariert Wenn Sie den Referenzzähler $tmpFile größer als 0 halten können, kann unser Code die folgende Verarbeitung ausführen:

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.

Führen Sie ihn erneut aus und lesen Sie den Inhalt der temporären Datei erfolgreich $tmpFile

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

Jetzt können Sie festlegen die generierte temporäre Dateiadresse an

-----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-----

Das obige ist der detaillierte Inhalt vonWie unterstützt PHP die Übertragung von CURL-String-Zertifikaten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen