Hızlı file_get_contents alternatif ()

5 Cevap php

Şu anda siteleri bir dizi GET veri göndermek için () file_get_contents kullanıyorum ama sayfanın yürütülmesi sırasında bu hatayı alıyorum:

Ölümcül hata: 30 saniye Maksimum yürütme zamanı aşıldı

Gerçekten komut dosyası yapmak istediğiniz tüm web sayfası yükleme başlatın ve sonra bırakın. Her web sayfası yüklemek tam 5 dakika kadar sürebilir, ve ben tam yüklemek için gerek yoktur.

İşte ben şu anda ne var:

        foreach($sites as $s) //Create one line to read from a wide array
        {
                file_get_contents($s['url']); // Send to the shells
        }

EDIT: herhangi bir karışıklık temizlemek için, bu komut hiçbir veri döndürmek diğer sunucular üzerinde komut başlatmak için kullanılıyor.

EDIT: Ben şimdi veri göndermek ve daha sonra durdurmak için bir saniye zaman aşımı ayarlayarak, hile yapmak için cURL kullanmak çalışılıyor. İşte benim kod:

        $ch = curl_init($s['url']); //load the urls
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); //Only send the data, don't wait.
        curl_exec($ch); //Execute
        curl_close($ch); //Close it off.

Belki ben yanlış seçeneği kurdum. Konuştuğumuz gibi bazı kitaplarına bakıyorum. Sadece sana bir güncelleme veriyor. Sizi bugüne kadar bana yardımcı oluyor hepinize teşekkür ederim.

EDIT: Ah, sorun bulundu. Ben CURLOPT_CONNECTTIMEOUT yerine CURLOPT_TIMEOUT kullanıyordum. Whoops.

Ancak şimdi, komut tetiklemiyor. Her ignore_user_abort (DOĞRU) kullanın; bu yüzden sorunu anlayamıyorum

Hah, o çizik. Şimdi çalışır. Çok teşekkürler herkese

5 Cevap

Bunu çözmek için birçok yol vardır.

Sen uyumsuz istekleri yürütmek için onun curl_multi_ * fonksiyonları ile cURL kullanabilirsiniz. Yoksa talep ve zaman aşımı dönecektir, bu yüzden Curl yaygın şekilde ama 1 olarak zaman aşımı sınırını kullanarak kullanabilirsiniz, ancak isteği idam edilecektir.

Eğer cURL yüklü değilse, siz file_get_contents kullanarak ama süreçlerini bölmek devam (çok havalı değil, ama çalışıyor) gibi bir şey ZendX_Console_Process_Unix kullanarak böylece her isteği arasında bekleyen önlemek olabilir.

I don't fully understands the meaning behind your script. But here is what you can do:

  1. Hızla ölümcül hatayı önlemek için sadece dosyanın başında set_time_limit (120) ekleyebilirsiniz. Bu komut 2 dakika boyunca çalıştırmak için izin verecektir. Tabii ki sonsuz için istediğiniz herhangi bir sayı ve 0 kullanabilirsiniz.
  2. Sadece url aramak gerekir ve sonuç için "bakım" yapmazsanız uyumsuz modunda Curl kullanmalısınız. Tamamlandığında kadar bu durumda URL için herhangi bir çağrı beklemek olmaz. Ve çok hızlı bir şekilde hepsini arayabilirsiniz.

BR.

Uzak sayfaları yüklemek için 5 dakika kadar sürebilir, lütfen file_get_contents oturmak ve o 5 dakika bekleyecek. Eğer bir arka plan işlemi içine çatal uzaktan komut dosyalarını değiştirmek ve orada ağır işleme yapabileceği herhangi bir yolu var mı? Bu şekilde sizin ilk hit hemen dönün ve başlangıç ​​dönemi için beklemek zorunda kalmazsınız.

Bir başka olasılık HEAD isteği hile yapacağını olmadığını araştırmaktır. KAFA sadece başlıkları, herhangi bir veri dönmez, bu yüzden uzak işleri tetikleyecek ve tam çıkış için sabırsızlanıyorum için yeterli olabilir.

Franco bahsedilen ve ben tutuklanmıştı emin değilim gibi, özellikle curl_multi işlevleri değil, düzenli kıvırmak olanları kullanmak istiyorum. Bu bir curl_multi nesnesine birden kıvırmak nesne paketleri ve geldikleri gibi tepkiler (sizin durumda, ya da değil) dönen, aynı zamanda onları çalıştırır.

http://php.net/curl_multi_init at Örnek

Sadece trigger operasyon için gereken güncelleme Re:

Bir zaman aşımı ile file_get_contents kullanarak deneyebilirsiniz. Bu çağrıldığını uzaktan komut yol açacak, ancak bağlantı n saniye (örneğin 1) sonra bitirildiği.

Bağlantı, çalışması gerekir (ignore_user_abort olurdu PHP) iptal edilirse bile çalışmaya devam eder böylece uzaktan komut dosyası yapılandırılmış olup olmadığını.

Bunu bir deneyin. Bu işe yaramazsa, size time_limit artan ya da harici bir yürütülebilir kullanarak etrafında almazsınız. Ama sen söylüyorsun ne - bu çalışması gerekir - sadece istek yapmak gerekir. Hatta 0 için zaman aşımını ayarlamak için deneyebilirsiniz ama bu güven olmaz.

Dan here:

<?php
$ctx = stream_context_create(array(
    'http' => array(
        'timeout' => 1
        )
    )
);
file_get_contents("http://example.com/", 0, $ctx);
?>

curl da bir zaman aşımı anahtarı vardır: Adil olmak gerekirse, Chris'in cevabı zaten bu olasılık içerir.