Intereting Posts
URL-адрес перезаписи для субдомена Сбросить ID автоинкремент? phpmyadmin Обновление схемы доктрины Symfony2 из каталога и подкаталогов Получение «Не удалось найти точку доступа к процедуре php_var_unserialized_init» Кнопка возврата браузера, отображающая страницу из кеша? Очень высокая задержка в первом HTTP-запросе проекта CodeIgniter Чтобы понять массив в PHP при задании другой переменной в массиве время, прошедшее с логикой паузы mysql TIMEDIFF () и PHP Что такое умный способ подсчета количества уникальных элементов в массиве (PHP)? Ajax передает данные в php-скрипт Изменить базовую ссылку на веб-сайт с использованием файла .htaccess Есть ли функция PHP, которая добавляет только косые черты в двойные кавычки? Не одиночные кавычки Исправление ошибок исправления 500 Функция Javascript в PHP fromCharCode () Предварительная обработка PHP для удаления функциональности из встроенных файлов

Медленная производительность при создании подписанных URL CloudFront

Я следую этому образцу для создания подписанных URL-адресов на CloudFront с помощью PHP http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/CreateURL_PHP.html

И у меня все нормально работает и генерируется Подписанные URL как для RTMP-дистрибутивов, так и для HTTP-дистрибутивов.

Однако я заметил, что генерация URL-адреса знака занимает довольно много времени, и мне интересно, какое влияние может оказать при использовании в производстве с тысячами запросов.

Я сделал несколько тестов, и кажется, что длительное время происходит из-за функций php-openssl.

Вот код:

    <?php class Cloudfront { const KEYPAIRID = 'MYKEYPAIRID'; const PVTKEYFILE = '/home/keys/myprivatekey.pem'; public function rsa_sha1_sign($policy) { $signature = ""; // load the private key $fp = fopen(self::PVTKEYFILE, "r"); $priv_key = fread($fp, 8192); fclose($fp); $pkeyid = openssl_get_privatekey($priv_key); // compute signature openssl_sign($policy, $signature, $pkeyid); // free the key from memory openssl_free_key($pkeyid); return $signature; } public function simulated_rsa_sha1_sign($policy) { // create a simulated signature $signature = "©3•{š(|i~'{µÜr…6—\L¶…ÙiÃÔh@ç÷S„Aóö¯‡d‰‹{¦ºxòrd)Xcª Áh‚°Bgþ èòëÿô Š#CßFe ÓÒ>v1 R€¥#–þ*¸çGÀýƒ Ј¾F<t)eV7¿ø_ŒQÎiXXU s˜¦Ij:ý ÒR ‹ÚQ§ Çm8à ºâ*+äÇjƒãýO 4 ~ Uöeóy˜¢93_0iy §âE– a÷f¥y¿ÈãÏ`‹ _ì`ß ½õ ‹* ÁM'çõD jrüB •d˜¥ èp Òü¿Ö NŒ«éoI X €v=RÌlŠ¤ /Á û9Yš¾î"; // load the private key file although is not actually used $fp = fopen(self::PVTKEYFILE, "r"); $priv_key = fread($fp, 8192); fclose($fp); return $signature; } public function url_safe_base64_encode($value) { $encoded = base64_encode($value); // replace unsafe characters +, = and / with the safe characters -, _ and ~ return str_replace( array('+', '=', '/'), array('-', '_', '~'), $encoded); } public function create_stream_name($stream, $signature, $expires) { $result = $stream; // if the stream already contains query parameters, attach the new query parameters to the end // otherwise, add the query parameters $separator = strpos($stream, '?') == FALSE ? '?' : '&'; $result .= $separator . "Expires=" . $expires . "&Key-Pair-Id=" . self::KEYPAIRID . "&Signature=" . $signature; // new lines would break us, so remove them return str_replace('\n', '', $result); } public function get_signed_stream_name($video_path, $expires) { // this policy is well known by CloudFront, but you still need to sign it, since it contains your parameters $canned_policy = '{"Statement":[{"Resource":"' . $video_path . '","Condition":{"DateLessThan":{"AWS:EpochTime":' . $expires . '}}}]}'; // sign the original policy, not the encoded version $signature = $this->rsa_sha1_sign($canned_policy); // make the signature safe to be included in a url $encoded_signature = $this->url_safe_base64_encode($signature); // combine the above into a stream name $stream_name = $this->create_stream_name($video_path, $encoded_signature, $expires); return $stream_name; } } 

    Это в основном тот же образец, который CloudFront имеет в своих документах. Затем я создал контроллер, я делал вызовы get_signed_stream_name () для генерации подписанных URL-адресов. Я решил сделать цикл while, чтобы посмотреть, сколько времени потребуется, чтобы создать 500 подписанных URL-адресов.

     public function signedurl() { // Script start $start = microtime(true); $this->load->helper('cloudfront'); $this->cloudfront = new Cloudfront(); $i = 1; while ($i <= 500) { $expires = time() + rand(300, 900); $http_video_path = 'http://mydistribution.cloudfront.net/myvideo.mp4'; $signed_http_url = $this->cloudfront->get_signed_stream_name($http_video_path, $expires); echo '<strong>HTTP Signed URL:</strong> <br />' . $signed_http_url; echo '<br /><br />'; $i++; } // Script end $time_taken = microtime(true) - $start; echo $time_taken; } 

    Создание 500 подписанных URL-адресов, в то время как цикл занял около 11 секунд на моей локальной машине. Затем я решил изменить:

     $signature = $this->rsa_sha1_sign($canned_policy); 

    в

     $signature = $this->simulated_rsa_sha1_sign($canned_policy); 

    Чтобы узнать, что произошло, если все было запущено, кроме вызова функций php-openssl openssl_get_privatekey (), openssl_sign (), openssl_free_key ().

    Я запустил тот же скрипт с циклом 500 while, и потребовалось 0.090 секунд. Таким образом, в основном функции php-openssl делают скрипт намного медленнее. Это что-то, о чем я должен беспокоиться, это нормально, так как я генерирую эти подписанные URL-адреса, и это требует значительной вычислительной мощности?

    Я сделал несколько попыток, и вот пример времени, который потребовался по 3 из них.

     Real code using OpenSSL functions generating 500 signed url calls: 11.135037899 11.6025328636 11.0253090858 500 URLs simulated without using the OpenSSL functions: 0.0828909873962 0.0903220176697 0.0916609764099 

    Кроме того, я хотел бы знать, как создать подпись, которая работает для любого файла в дистрибутиве. Подстановочный знак, который я мог бы сгенерировать подпись, которая может быть использована для всех файлов в этой папке или дистрибутиве. Я где-то читал, что это возможно, но не знаю, как использовать эти образцы выше. Возможно, если я могу создать единую подпись для каждого запроса, а не для каждого файла, возвращенного в запросе, будет менее интенсивным.

    Благодаря!

    Related of "Медленная производительность при создании подписанных URL CloudFront"

    Вы пытались удалить «fopen ()» и использовать жестко закодированное значение для закрытого ключа?

    Пример:

     function getPrivateKey() { $privateKey = '-----BEGIN RSA PRIVATE KEY----- abc -----END RSA PRIVATE KEY-----'; return str_replace("\t", '', $privateKey); } 

    Если вам все еще нужны ключи во внешних файлах, попробуйте использовать php include () и воспользуйтесь кэшированием APC.

    Для обработки партий закрытых ключей; Вы можете использовать Iterator или scan_dir, сканировать ваши файлы на основе regex, включать ваши файлы и назначать их содержимое в массив ключей SSL. Опять же, вы воспользуетесь APC. К сожалению, я думаю, что scandir () потребуется получить доступ к вашей файловой системе. Как правило, это замедляет работу.

    Я наблюдаю ту же самую производительность с Boto (AWS's Python SDK), которая использует модуль rsa для вычисления подписи. Я думаю, что проблема просто сводится к тому, что вычисления RSA в этом контексте медленны. Я думаю / надеюсь, что решение заключается в том, чтобы настроить настройку или рабочий процесс работы с частным контентом.