Senaryo emin değilim, ölür neden

8 Cevap

Ben bizim sisteme veri alabilirsiniz böylece bir diziye 6.000 hat 500 KB dosyayı ayrıştırmak çalışıyorum. Sorun komut yerde çizgiler 3000-4000 arasında yürütme durur olmasıdır. Kodda hiçbir sonları vardır, diğer ithalat üzerinde kullanabilirsiniz. Herhangi bir bu oluyor olabilir neden fikir ve ne bunu önlemek için ne yapabilirim?

/**
 * Takes a seperated value string and makes it an array
 * @param $delimiter string The delimiter to be seperated by, usually a comma or tab
 * @param $string string The string to seperate
 * @return array The resulting array
 */
public function svToArray ($delimiter, $string) {
    $x = 0;
    $rowList = array();
    $splitContent = preg_split("#\n+#", trim($string));
    foreach ($splitContent as $key => $value) {
        $newData = preg_split("#".$delimiter."#", $value);
        if ($x == 0) {
            $headerValues = array_values($newData);
        } else {
            $tempRow = array();
            foreach ($newData as $rowColumnKey => $rowColumnValue) {                                                
                $tempRow[$headerValues[$rowColumnKey]] = $rowColumnValue;
            }
            $rowList[] = $tempRow;
        }
        $x++;
    }
    return $rowList;
}

UPDATE: Error reporting is enabled. I've started using a file that's only 130KB at 1,500 lines and it does the same thing...

Ben echo "test<br/>"; sonra bir çıkış koymak sürece aşağıdaki örnekte hiçbir şey yankıları gibi hata ayıklama kodu eklediğinizde

public function svToArray ($delimiter, $string) {
    $x = 0;
    $rowList = array();
    $splitContent = preg_split("#\n+#", trim($string));
    echo "test<br/>";
    foreach ($splitContent as $key => $value) {
        $newData = preg_split("#".$delimiter."#", $value);
        if ($x == 0) {
            $headerValues = array_values($newData);
        } else {
            $tempRow = array();
            foreach ($newData as $rowColumnKey => $rowColumnValue) {                                                
                $tempRow[$headerValues[$rowColumnKey]] = $rowColumnValue;
            }
            $rowList[] = $tempRow;
        }
        $x++;
    }
    echo "test";
    $this->tru->debug($rowList);
    exit;
    return $rowList;
}

UPDATE If I comment out $tempRow[] = $rowColumnValue; then it echoes everything fine....

8 Cevap

Çok fazla çıkış sayfa hiç bir şey göstermek için neden çıktı tamponuna vardı sanki görünür.

Muhtemelen sadece zaman aşımı. Her zaman X saniye sonra durur mu?

Yüksek maksimum yürütme süresini ayarlamayı deneyin: set_time_limit (900) sayfalarınızın üst kısmında.

You can check the max execution time in your phpinfo(): 1. Create a new php page with 2. Search for max_execution_time

Eğer dosyalara baktınız mı? Çok sınırlayıcı bir çizgi var mı? Ayrıca, tüm hakkında "#" nelerdir?

Benim en iyi tahminim $headerValues[$rowColumnKey] tanımlı olmayan bir çizgi vuruyorlar olmasıdır.

Ne $ rowColumnKey ve $ rowColumnValue hakkında?

Onlar fonksiyonunda tanımlı değildir.

Eğer hata raporlama setine sahip olduğundan emin olun, sizin php dosyasının üstüne koymak:

ini_set('display_errors', true);
error_reporting(E_ALL);

Ayrıca scriptin yürütme süresini uzatabilirsiniz:

ini_set('max_execution_time', 50000);

Bu bellek bittiğinde ben hiçbir çıkış ve hatasız bir php script kalıp, ettik sadece zaman ilgili. Script fazla bellek kullanmak gibi görünmüyor, ama ben php için bellek sınırı yeterince yüksek olduğundan emin olmak için kontrol ediyorum.

Eğer yerine sadece yazdırmak için çalışmakla dönen diziye yineleme emin misiniz? (Konu fonksiyonun dışında ziyade bunun içinde olabilir.)

Ayrıca ...

`exit;
 return $rowList;`

Kaldırmayı deneyin 'exit;' hat ve bu değişiklik bir şey olmadığını görmek.

Ayrıca, $ splitContent kullanılmadan önce bir dizi olarak tanımlı değil, ancak preg_split bir dizi dönmek için gidiyor. (Bu sonuçları etkileyebilir olmamalı, ama bunu yapmak için güvenlidir.)

Eğer dizesi içinde ne olacağını emin olamaz zaman niye $ anahtar => $ değer çiftleri kullanıyorsunuz? Biz $ string içeriğinin bir küçük örnek görmek olsaydı, biz daha iyi çalışması için bu işlevi ayarlamak mümkün olabilir.

# / Ile değiştirilmesi gerektiğini, ama bu sadece bir biçimlendirme sorunu olabilir.

$ NewData bu sorunu neden olmasa bile sadece güvenli olması için kullanılmadan önce bir dizi olarak tanımlanmış olmalıdır.

Eğer php.ini maksimum yürütme süresini artırabilir eğer .. ayrıca .. sizin sunucunuzun kontrol hata günlükleri de yardımcı olabilir her örneği için maksimum bellek miktarını artırmak.