Автор оригинала: David Wong.
фон
В последнее время при подключении оплаты wechat нам необходимо использовать сертификаты в месте возврата. Поскольку мы являемся платформой SaaS, нам необходимо поддерживать многоканальные платежи. Если мы сохраним все файлы сертификатов на сервере приложений, на него повлияет SLB, что приведет к рассинхронизации файла машины и затруднит процесс возврата. Однако, если файлы хранятся в OSS, серверная часть загрузит их из OSS на сервер приложений для обеспечения единообразия. Подумав об этом, я, наконец, решил сохранить содержимое сертификата в базе данных. У разных клиентов есть файл сертификата, соответствующий друг другу. Независимо от того, сколько машин кластеризовано, можно гарантировать согласованность файла и избежать избыточных шагов загрузки.
проблема
Однако мы столкнулись с проблемой сразу после того, как сделали это. Сертификат curl PHP не поддерживает передачу строк, поэтому мы можем только заполнить путь к сертификату (ниже приводится официальное заявление)
Сертификаты клиента должны быть указаны с помощью выражения пути к хранилищу сертификатов.
Процесс разрешения
Моя первая мысль-создать пустой файл, записать содержимое сертификата и удалить файл после использования сертификата. Однако операция создания файла сущности и его удаления требует высокой производительности, что очень хлопотно. Есть ли способ создать временный файл? Да, функция tmpfile() может помочь нам создать временные файлы и получить путь к файлу, поэтому я написал метод для получения временного пути к файлу
К сожалению, обратный путь с помощью этого метода вообще не мог прочитать содержимое и даже какое-то время думал, что его обманули
file_get_contents(/tmp/phpyyiOZv): не удалось открыть поток: Нет такого файла или каталога
Только после прочтения официального документа мы сможем выяснить причину. Если счетчик ссылок на дескриптор, возвращаемый tmpfile (), равен 0, временный файл будет переработан, и временный путь, естественно, завершится ошибкой. Очевидно, что после выполнения gettmppathbycontent () жизненный цикл файла локальной переменной $tmp завершится (официальный документ выглядит следующим образом)
Файл автоматически удаляется при закрытии (например, при вызове fclose(), или когда не осталось ссылок на дескриптор файла, возвращенный tmpfile ()), или когда скрипт завершается.
После подтверждения основной причины нам нужно найти тип переменной, жизненный цикл которой заканчивается с окончанием процесса, чтобы сохранить дескриптор. Какой тип может соответствовать этим условиям? Статические переменные. Разница между статическими переменными и локальными переменными заключается в том, что в начале жизненного цикла PHP для них будет выделено место в памяти, и они будут храниться в области глобальных переменных, а глобальные переменные будут уничтожены на этапе завершения работы модуля. Таким образом, объявление статических переменных может привести к тому, что количество ссылок в файле $tmp будет больше 0. Тогда наш код может сделать следующее
Другое выполнение успешно прочитает содержимое временного файла
–НАЧАТЬ СЕРТИФИКАТ—– MIIEbDCCA9WgAwIBAgIEAWJKHDANBgkqhkig9w0baqufadcbijelmakga1uebhmc Q04xEjAQBgNVBAgTCUd1YW5nZG9uZzERma8ga1uebxmiu2hlbnpozw4xedaobgnv BAoTB1RlbmNlbnQxDDAKBgNVBAsTA1dYrzetmbega1ueaxmktw1wyxlty2hdqtef MB0GCSqGSIb3DQEJARYQbW1wYXltY2hAdgvuy2vuddaefw0xnza4mdcwotixndda Fw0yNzA4MDUwOTIxNDdaMIGbMQswCQYDvqqgewjdtjesmbaga1uecbmjr3vhbmdk b25nMREwDwYDVQQHEwhTaGVuemhlbjEQma4ga1uechmhvgvuy2vuddeomawga1ue CxMFTU1QYXkxMDAuBgNVBAMUJ+a3seWcs+W4guaYjua6kOi9r+S7tuiCoeS7veac iemZkOWFrOWPuDERMA8GA1UEBBMIMTAyntkyodewggeima0gcsqgsib3dqebaqua A4IBDwAwggEKAoIBAQDg2D3++uOxY/yMGQPBnROvyYimnCsfGE0dnqdGUTCykqbh yfv82zE1/ст/4DQX2QDiIvLif+sMGcYwF4bkzdY+HgitYLI0k5o/5LCNZOMctuio kdYC2bNdWHq2y9S5UWLQR1Zvq+6QyPBVBVY9yq9xtQhIlUTsZnICAp3iQLfqur3l aEdH9IERoRUIkbyb8oX5ONQz4P9jOeE9c5iwx0qrh4s01nfhkhr8jhlugrlpo9va xGgi/48fOlONj6wWal5Gt0OvvEbIwgQwya15Kbx2yegnzvybqa+lQMeXEqZSFie3 г+wGvbtlONczQEtp+JDxLZLUS/FT7U0TQN/t8JDvAgMBAAGjggFGMIIBQjAJBgNV HRMEAjAAMCwGCWCGSAGG+EIBDQQfFh0iQ0VTLUNBIEdlbmVyYXRlIenlcnrpzmlj YXRlIjAdBgNVHQ4EFgQUjDJ75bu3Roog7XOH6uFAdZ6kpcIwgb8GA1UdIwSBtzCB tIAUPgUm9iJitBVbiM1kfrDUYqflhnShgZCkgY0wgYoxCzAJBgNVBAYTAkNOMRIw EAYDVQQIEwlHdWFuZ2RvbmcxETAPBgNVBAcTCFNoZW56aGVuMRAwDgYDVQQKEwdU ZW5jZW50MQwwCgYDVQQLEwNXWEcxEzARBgNVBAMTCk1tcGF5bWNoQ0ExHzAdBgkq hkiG9w0BCQEWEG1tcGF5bWNoQHRlbmNlbnSCCQC7VJcrvADoVzAOBgNVHQ8BAf8E BAMCBsAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQEFBQADgYEA ucJLJkkHxlqQCEapZOWmySutqNVZxFbqyG//UXxxpA/1yG4e+KmufKZWv+с+MtYI 8i0KDDCv/UE+kkFIrHYDDKsdLRpxrYOUHGoqq0c7yBJ6Dimgy6m8U8FsEv3HtUR2 8g5xrg2Tc5MPWEp9ncEw575hGk0CXLDGOkI1nU+pGqk= –КОНЕЧНЫЙ СЕРТИФИКАТ—–
Теперь вы можете установить для сгенерированного временного файла адрес curlopt_ Ssl cert
резюме
Вышесказанное составляет все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет некоторую справочную ценность для вашего обучения или работы. Спасибо вам за вашу поддержку developepaer.
Оригинал: “https://developpaper.com/the-method-of-supporting-curl-string-certificate-transfer-in-php/”