Neden? Izle bu kadar uzun sürüyor?

2 Cevap php

Benim sunucuda bir PHP komut dosyası için bir AJAX POST isteği yapmak. Sırayla bu komut bir metin dosyasının içeriğini kontrol etmek harici bir sunucuya bir php komut dosyası için bir GET isteği yapar. Ancak, bir sonuç ile geri gelmek için çok uzun bir zaman alır. Neden böyledir?

AJAX Post Request to Script on my server

session_start();
$fileName = $_POST['textFile'];
$result = file_get_contents($_SESSION['serverURL']."fileReader.php?textFile=$fileName");
echo $result;

GET Request to a script on different server

$fileName = $_GET['textFile'];

if (file_exists('text/'.$fileName.'.txt')) {

    $lines = file('text/'.$fileName.'.txt');

    echo $lines[sizeof($lines)-1];

}
else{
    echo 0;
}

Bunlar çok basit komut ve onun sadece çok küçük bir metin dosyası denetimi vardır, öyleyse neden bu kadar uzun sürüyor?

Ben sitedeki diğer AJAX isteği yapıyorum ama bu kesinlikle bir soruna neden olamaz. Bunu söyledikten sonra, döndürülen metin dosyası benim sunucuda tamamlamak için bir süre alır bir komut dosyasını başlatır başka AJAX isteği tamamlanması ile her zaman eş-incides değeri, ama nasıl olacak bu etkinin birbirlerini?! Bunlar sağa gerekmez mi?

2 Cevap

Bir dosyanın son satırı almak için HTTP üzerinden yol almak zorunda değilsiniz. Neden dosya sistemi içinde kalmak ve son satırı almak için böyle bir işlevi kullanmayın:

function fileGetLine($filename, $line) {
    if (!is_file($filename) || !is_readable($filename)) {
        // invalid file name or not readable
        return false;
    }
    if (!is_int($line)) {
        // invalid line number
        return false;
    }
    $lines = file($filename);
    $lineCount = count($lines);
    if ($line < 0) {
        // negative line number, count from end
        $line = $lineCount + $line;
    }
    if ($line < 0 || $line >= $lineCount) {
        // line number out of bounds
        return false;
    }
    return $lines[$line];
}

session_start();
echo fileGetLine('text/'.basename($_POST['textFile']).'.txt', -1);

Ağ gecikmesi ve CPU yük olasılıkla burada gecikmenin en büyük faktörlerdir.

Eğer yeni bir bağlantı açmak her zaman, açılış bağlantısı yükü, hem de indirgenmiş transfer hızı (bir dosyayı doğrudan okuma aksine) var.

Ayrıca, tamamlamak için bir süre alır sizin "diğer" AJAX isteği ile ilgili ... Aslında bu sistemde her şeyi etkileyebilir. Onu tamamlamak için uzun zaman alırsa, o CPU veya disk çok fazla bant genişliği yiyor söylemek muhtemelen güvenlidir. Bu gibi herhangi bir yoğun işlem sistemi üzerinde her şeyi etkileyebilir. Eğer aynı dosya veya veritabanı tabloları ile çalışıyorsanız, özellikle eğer bu anda dosya sistemi veya veritabanı dayak edilebilir.

Bu sorun bunu görmeden ne olduğunu söylemek gerçekten zor, sisteminizin her parça zaman aşımına, ve talepleri sırasında, CPU ve bellek yükleri izlemelidir. Darboğaz nerede olduğunu anlamaya çalışın.