Столкнулся со странностью в 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 совпадает на обоих системах.