gpt4 book ai didi

php - 为什么此代码会导致服务器上的高平均负载?

转载 作者:太空宇宙 更新时间:2023-11-04 11:10:19 24 4
gpt4 key购买 nike

当从不太稳定的 API 获得的值在一定范围内时,下面的代码会发送一条消息。

此代码会导致平均负载上升,但不会导致 CPU 使用率上升,这可能是由于高 I/O 等待。

CentOS 6.5
Kernel 2.6.32-431.11.2.el6.x86_64
Apache 2.2.15
PHP 5.3.3 (mod_fcgid/2.3.7)

> cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]

该代码对专用硬件和云端(均作为 KVM/Virtio 上的 VM)产生了相同的问题影响。

可以做什么来防止此代码*导致处理器在处理新指令之前等待指令完成**?我知道减少超时并不能真正解决问题,只会减少其影响。

*这是我对这段代码导致load average的理解上去。

<?php

$min = '1';
$last_min = '1';

if (!empty($_GET['min'])) {
$min = $_GET['min'];
} else {
$min = false;
}

$ctx=stream_context_create(array('http'=>
array(
'timeout' => 10 // seconds timeout
)
));

$json = file_get_contents('https://www.domain.com/api/ticker/',false,$ctx);

if (!empty($json )) {
echo($json);
if (@file_get_contents('log.txt')) {
if (quote_changed($json)) {
file_put_contents('log.txt', $json, FILE_APPEND);
}
} else {
file_put_contents('log.txt', $json);
}

$obj = json_decode($json,true);
$last = $obj['ticker']['last'];
if (is_numeric($last)) {
$last = (int)$last;
$last_min = @file_get_contents('last_min.txt');
$notified = @file_get_contents('notified.txt');
if ($notified === false) {
$notified = 'false';
#echo "no notify file\n";
}
if (($last_min === false) || (($min) && ($last_min <> $min))) {
$last_min = 1;
$notified = 'false';
file_put_contents('last_min.txt', $min);
#echo "no min file or diff min\n";
}
#echo ('notified='.$notified.'\n');

if (($last >= $min) && ($notified=='false')) {
#$url = ('http://otherdomain.com/nexmo/sendmsg.php' . '?name=blah' . $last);
#file_get_contents($url);
#switch to SMS when going abroad and plugin new number when available
mail("8885551212@mail.net","Blah at".$last,"","From: gaia@domain.com\n");
file_put_contents('notified.txt', 'true');
#echo "msg sent\n";
} elseif (($last < $min) && ($notified=='true')) {
file_put_contents('notified.txt', 'false');
#echo "not sent\n";
}
}
}

function quote_changed($current) {
$previous = tailCustom('log.txt');
#echo ('previous='.$previous);
if ($previous === (trim($current))) {
return 0;
} else {
return 1;
}
}

function tailCustom($filepath, $lines = 1, $adaptive = true) {

// Open file
$f = @fopen($filepath, "rb");
if ($f === false) return false;

// Sets buffer size
if (!$adaptive) $buffer = 4096;
else $buffer = ($lines < 2 ? 64 : ($lines < 10 ? 512 : 4096));

// Jump to last character
fseek($f, -1, SEEK_END);

// Read it and adjust line number if necessary
// (Otherwise the result would be wrong if file doesn't end with a blank line)
if (fread($f, 1) != "\n") $lines -= 1;

// Start reading
$output = '';
$chunk = '';

// While we would like more
while (ftell($f) > 0 && $lines >= 0) {

// Figure out how far back we should jump
$seek = min(ftell($f), $buffer);

// Do the jump (backwards, relative to where we are)
fseek($f, -$seek, SEEK_CUR);

// Read a chunk and prepend it to our output
$output = ($chunk = fread($f, $seek)) . $output;

// Jump back to where we started reading
fseek($f, -mb_strlen($chunk, '8bit'), SEEK_CUR);

// Decrease our line counter
$lines -= substr_count($chunk, "\n");

}

// While we have too many lines
// (Because of buffer size we might have read too many)
while ($lines++ < 0) {

// Find first newline and remove all text before that
$output = substr($output, strpos($output, "\n") + 1);

}

// Close file and return
fclose($f);
return trim($output);

}

?>

最佳答案

将数据移动到数据库中,或者如果这不是一个选项,则将不稳定的文件缓存到您本地的服务器中,这样您就不必每次都访问外部提供程序。

如果这些都不是一个选项,在我看来,提供 API 的人需要提高他们的性能,您可以通过通过 Firebug 对每次点击所花费的毫秒数进行基准测试来验证这一点。

关于php - 为什么此代码会导致服务器上的高平均负载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23497391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com