LINUX.ORG.RU

php 8.1 слишком медленный curl

 php curl


0

3

Столкнулся со странностью в php 8.1 (ubuntu 22.04.3 LTS)

Время выполнения запроса через curl в 10 раз дольше чем в php 7.4 (18.04.6 LTS)

$start_tm = 0;
function xhrtime() {
  global $start_tm;
  $t = hrtime(false);
  if(!$start_tm) $start_tm = $t[0] * 1000 + intval($t[1]/1000000);
  $r = $t[0] * 1000 + intval($t[1]/1000000) - $start_tm;
  echo $r,"\n";
}

$server_url = 'https://local.server.ru';
xhrtime();
for($i=0; $i < 10; $i++) {
  $ch = curl_init($server_url.'/index.html');
  curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-type: text/html']);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, isset($argv[1]) ? true:false);
  curl_setopt($ch, CURLOPT_TIMEOUT , 1);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT , 1);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER , true);
  $ret = curl_exec($ch);
  $code =  curl_getinfo($ch,CURLINFO_HTTP_CODE);
  curl_close($ch);
  echo "result $code length ",strlen($ret),"\n";
}
xhrtime();

на 7.4 без CURLOPT_SSL_VERIFYPEER 110-200мс

на 7.4 с CURLOPT_SSL_VERIFYPEER 230-300мс

на 8.1 без CURLOPT_SSL_VERIFYPEER 350-360мс

на 8.1 с CURLOPT_SSL_VERIFYPEER 3120-3145мс

Вопрос - как с этим бороться?

Понизить версию php нельзя.

Менять версию php на отличную от дистрибутива тоже не очень хочется.

strace показал огромную разницу в скорости чтения файла «/etc/ssl/certs/ca-certificates.crt». В 8.1 он читается 200 мс.

Сама операция чтения (read()) выполняется примерно за одинаковое время, а вот между вызовами read() время отличается в 10 раз.

8.1

     0.000262 openat(AT_FDCWD, "/etc/ssl/certs/ca-certificates.crt", O_RDONLY) = 7 <0.000039>
     0.000120 newfstatat(7, "", {st_mode=S_IFREG|0644, st_size=208567, ...}, AT_EMPTY_PATH) = 0 <0.000027>
     0.000100 read(7, "-----BEGIN CERTIFICATE-----\nMIIH"..., 4096) = 4096 <0.000028>
     0.001503 read(7, "8B1\nRXxlDPiyN8+sD8+Nb/kZ94/sHvJw"..., 4096) = 4096 <0.000031>
     0.006284 read(7, "BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC"..., 4096) = 4096 <0.000047>
     0.006165 read(7, "oZIhvcNAQEMBQAwQTELMAkGA1UE\nBhMC"..., 4096) = 4096 <0.000046>
     0.006119 read(7, "DCCAgoCggIBAK2Wny2cSkxK\ngXlRmeyK"..., 4096) = 4096 <0.000047>
     0.006043 read(7, "aAjMaZ7snkGeRDImeuKHCnE96+RapNLb"..., 4096) = 4096 <0.000046>
     0.006165 read(7, "r1QGbNgGE41b/+EmGVnAJLqBcXmQRFBo"..., 4096) = 4096 <0.000050>
     0.004232 read(7, "TYltxhh5EF5EQIM8HauQhl1K6yNg3ruj"..., 4096) = 4096 <0.000050>

7.4

     0.000097 openat(AT_FDCWD, "/etc/ssl/certs/ca-certificates.crt", O_RDONLY) = 6 <0.000039>
     0.000110 fstat(6, {st_mode=S_IFREG|0644, st_size=208567, ...}) = 0 <0.000029>
     0.000094 read(6, "-----BEGIN CERTIFICATE-----\nMIIH"..., 4096) = 4096 <0.000031>
     0.000312 read(6, "8B1\nRXxlDPiyN8+sD8+Nb/kZ94/sHvJw"..., 4096) = 4096 <0.000032>
     0.000455 read(6, "FoXDTMwMTIzMTE0MDgyNFowRDEL\nMAkG"..., 4096) = 4096 <0.000032>
     0.000528 read(6, "jgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcm"..., 4096) = 4096 <0.000032>
     0.000430 read(6, "LBQAwPDEeMBwGA1UE\nAwwVQXRvcyBUcn"..., 4096) = 4096 <0.000032>
     0.000327 read(6, "jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYD"..., 4096) = 4096 <0.000031>
     0.000327 read(6, "BDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbc"..., 4096) = 4096 <0.000033>
     0.000422 read(6, "hVECe5uUFoC2EyP+YbNDrihqECB63aCP"..., 4096) = 4096 <0.000031>

длина файла /etc/ssl/certs/ca-certificates.crt совпадает на обоих системах.

★★★★★

А сегодня в php не все могут смотреть. Вернее, смотреть могут не только лишь все. Мало, кто может это делать.

skidphysic
()

Похоже это известная проблема c openssl-3.0 которая в ubuntu-22.04

vel ★★★★★
() автор топика
Ответ на: комментарий от vel

если есть возможность, сделай копию контейнера и попробуй вручную установить в нём openssl-1.1.1w

вот примерный гайд, как это делалось для 1.1.1i -> https://web.archive.org/web/20221208103116/https://www.hostnextra.com/kb/how-to-install-openssl-1-1-1i-on-almalinux/

d00fy ★★★
()
Ответ на: комментарий от d00fy

Я пока думаю в другую сторону.

По умолчанию была установлена libcurl4-openssl-dev

Но есть альтернатива в виде libcurl4-gnutls-dev. Она при установке выносит libcurl4-openssl-dev.

Если не поможет, то тогда придётся менять openssl, но откатываться на 1.1.1 не очень хочется, а вот обновиться до 3.1 (где эти проблемы вроде исправлены) наверно есть смысл.

vel ★★★★★
() автор топика
Ответ на: комментарий от vel

откатываться вряд ли возможно (даже подымали по этому поводу шум, что переход на openssl3 ломает софт)
я предлагал именно руками раскидать бинарники, как показано в статье, осталяя openssl3 и его зависимости

upd: прежде чем мучаться со сборкой из сырцов, просто скачай deb-ки openssl и libssl1.1 из ubuntu 20.04 и распакуй/переименуй куда надо, а то вдруг там проблема вообще в чём-то другом

d00fy ★★★
()
Последнее исправление: d00fy (всего исправлений: 2)
Ответ на: комментарий от d00fy

просто скачай deb-ки openssl и libssl1.1 из ubuntu 20.04 и распакуй/переименуй куда надо,

Какой-то странный совет. Во-первых, их можно штатно установить, зачем распаковывать? Во-вторых, от того что ты установишь 1.1, пхп (или курл) не станет его использовать вместо 3.0. Если ты предлагаешь подменить libssl.so 3.0 на 1.1 под тем же именем - оно скорее всего даже не запустится из-за всяких unresolved symbols. А если и запустится - будет глючить. Надо пересобирать с нужной версией openssl всё, или найти пакеты где уже собрано.

firkax ★★★★★
()

php слишком медленный

Fixed.

dimgel ★★★★★
()
Последнее исправление: dimgel (всего исправлений: 1)

с libcurl-gnutls ещё немного хуже :(

vel ★★★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.