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 .
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.
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['uri']; ///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['uri']; } ?>
-----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!