PHP Curl en Aşımı Ayarı

5 Cevap php

Ben php aracılığıyla mevcut veritabanı üzerinde bir kıvrılma isteği koşuyorum. Veri kümesi çok büyük olduğunu ve bunun sonucu olarak, veritabanı sürekli bir XML yanıt dönmek için uzun bir zaman miktarda alır. Bunu düzeltmek için, biz uzun bir zaman aşımı olması gerekiyordu ne, bir kıvrılma kurulması talebi.

$ch = curl_init();
$headers["Content-Length"] = strlen($postString);
$headers["User-Agent"] = "Curl/1.0";

curl_setopt($ch, CURLOPT_URL, $requestUrl);
    curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, 'admin:');
curl_setopt($ch,CURLOPT_TIMEOUT,1000);
$response = curl_exec($ch);
curl_close($ch);

Istek tamamlanmadan önce (bir tarayıcı aracılığıyla istendiğinde <1000) Ancak, kıvırmak isteği sürekli biter. Bu curl zaman aşımı ayarlamak için doğru yolu olmadığını biliyor mu?

5 Cevap

Belgelerine bakın: http://www.php.net/manual/en/function.curl-setopt.php

CURLOPT_CONNECTTIMEOUT - The number of seconds to wait while trying to connect. Use 0 to wait indefinitely.
CURLOPT_TIMEOUT - The maximum number of seconds to allow cURL functions to execute.

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,0); 
curl_setopt($ch, CURLOPT_TIMEOUT, 400); //timeout in seconds

Ayrıca php script kendini zaman yürütülmesine büyütmek unutmayın:

set_time_limit(0);// to infinity for example

CURLOPT_TIMEOUT herhangi cURL fonksiyonu çalıştırmak için almak için izin süreyi tanımlar gibi Hmm, bana görünüyor. Bu cURL tamamlamak için bağlantı için beklenecek süre maksimum miktarda söyler çünkü ben, gerçekten yerine CURLOPT_CONNECTTIMEOUT bakıyor gerektiğini düşünüyorum.

Sizin kodu 1000 aşımını ayarlar seconds. Milisaniye için CURLOPT_TIMEOUT_MS.

Bunu yanıt CURL isteği çalıştıran sunucu bekliyor olacak zaman aşımı, bir tarayıcıdan isteği çalıştıramazsınız. Tarayıcısı muhtemelen 1-2 dakika, varsayılan ağ zaman aşımı aşımına uğruyor.

Siz komut satırı / terminalden çalıştırmak gerekir.

PHP docs sözlerinden ... bazı insanlar için uygun olabilir, bu bir cilvesi vardır.

Eğer cURL az bir saniye içinde zaman aşımı isterseniz değeri ise libcurl hemen zaman aşımı neden olur "Unix benzeri sistemlerde" üzerinde bir hata / "özelliği" olmasına rağmen, siz, CURLOPT_TIMEOUT_MS kullanabilirsiniz < ; Hata ile 1000 ms "cURL Hata (28): Zaman aşımı ulaşıldı". Bu davranış için açıklama:

"Libcurl standart sistem adı çözümleyici kullanmak için inşa edilirse, transfer o bölümü hala bir saniye izin minimum zaman aşımı ile zaman aşımı için tam ikinci çözünürlüğü kullanacaktır."

Ne bu PHP geliştiricileri anlamına gelir "libcurl standart sistem adı çözümleyici kullanarak olup olmadığını söyleyemem, çünkü ilk test olmadan bu işlevi kullanamazsınız (ama ne olduğunu oldukça emin olabilirsiniz)" dir

Sorun olduğunu üzerine (Li | U) nix, libcurl standart isim çözümleyici kullanır, bir SIGALRM libcurl aşımı alarm olduğunu düşünüyor ad çözümlemesi sırasında ortaya çıkar.

Çözelti CURLOPT_NOSIGNAL kullanarak sinyalleri devre dışı bırakmak için. Burada zaman aşımı test böylece 10 saniyelik bir gecikmeye neden kendisini isteyen bir betik örneği:

<?php
if (!isset($_GET['foo'])) {
        // Client
        $ch = curl_init('http://localhost/test/test_timeout.php?foo=bar');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);
        $data = curl_exec($ch);
        $curl_errno = curl_errno($ch);
        $curl_error = curl_error($ch);
        curl_close($ch);

        if ($curl_errno > 0) {
                echo "cURL Error ($curl_errno): $curl_error\n";
        } else {
                echo "Data received: $data\n";
        }
} else {
        // Server
        sleep(10);
        echo "Done.";
}
?>

From http://www.php.net/manual/en/function.curl-setopt.php#104597