Wie unterstützt PHP die Übertragung von CURL-String-Zertifikaten (detaillierter Lösungsprozess)

little bottle
Freigeben: 2023-04-05 22:02:01
nach vorne
2604 Leute haben es durchsucht

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-Zertifikate müssen durch einen Pfadausdruck zu einem Zertifikatspeicher angegeben werden.

Lösungsprozess

Mein erster Gedanke ist, eine leere Datei zu erstellen und schreiben Sie den Inhalt des Zertifikats. Warten Sie, bis das Zertifikat verwendet wird, und löschen Sie dann die Datei. Das Erstellen und anschließende Löschen einer Entitätsdatei verbraucht jedoch Leistung und ist sehr mühsam Datei? 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
    }
?>
Nach dem Login kopieren

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). 🎜>getTmpPathByContent()$tmpFileDie Datei wird automatisch entfernt, wenn sie geschlossen wird (z. B. durch Aufrufen von fclose() oder wenn keine weiteren Verweise auf das von tmpfile() zurückgegebene Dateihandle vorhanden sind) oder wenn das Skript endet

Bestätigt die Grundursache, dann müssen wir jetzt dringend ein Leben finden. Ein Variablentyp, dessen Zyklus endet, wenn der Prozess endet, um das Handle zu speichern. 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

größer als 0 halten können, kann unser Code die folgende Verarbeitung ausführen:
file_get_contents(/tmp/phpyyiOZv): failed to open stream: No such file or directory
Nach dem Login kopieren

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;];
    }
?>
Nach dem Login kopieren

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-----
Nach dem Login kopieren

[Empfohlener Kurs: CURLOPT_SSLCERTPHP-Video-Tutorial

]

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

Verwandte Etiketten:
php
Quelle:cnblogs.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage