2012-02-28 3 views
0

Я пытаюсь найти способ получить быстрый доступ к файлу, а затем немедленно отключиться.Выход из cURL fetch

Поэтому я решил использовать cURL, поскольку это самый быстрый вариант для меня. Но я не могу понять, как я должен «отключить» cURL.

С приведенным ниже кодом в журналах доступа Apache говорится, что файл, к которому я попытался получить доступ, действительно был доступен, но я немного чувствую это, потому что, когда я просто запускаю цикл while, не вырываясь из него, это просто продолжает цикл. Не следует ли остановить цикл, когда cURL закончил выборку файла? Или я просто глуп; это цикл, который постоянно перезапускается?

<?php 
$Resource = curl_init(); 
curl_setopt($Resource, CURLOPT_URL, '...'); 
curl_setopt($Resource, CURLOPT_HEADER, 0); 
curl_setopt($Resource, CURLOPT_USERAGENT, '...'); 
while(curl_exec($Resource)){ 
    break; 
} 
curl_close($Resource); 
?> 

Я попытался установить CURLOPT_CONNECTTIMEOUT_MS/CURLOPT_CONNECTTIMEOUT вариантов очень малые значения, но это не помогло в этом случае.

Есть ли более «правильный» способ сделать это?

+0

Что вы подразумеваете под «быстрым доступом»? Прочитайте всего несколько байтов? Или просто проверьте, есть ли это там или нет? – raina77ow

+0

«Прочитайте всего несколько байтов», я полагаю. – user966939

+0

См. Здесь, если он подходит: http://stackoverflow.com/q/985455/367456 – hakre

ответ

1

Это утверждение superflous:

while(curl_exec($Resource)){ 
    break; 
} 

Вместо просто сохранить возвращаемое значение для дальнейшего использования:

$result = curl_exec($Resource); 

while петля ничего не помогает. Итак, теперь на ваш вопрос: вы можете сообщить curl, что он должен брать только некоторые байты из тела и затем выйти. Это может быть достигнуто за счет уменьшения CURLOPT_BUFFERSIZE до малой величины и с помощью функции обратного вызова, чтобы сказать свернуться он должен остановиться:

$withCallback = array(
    CURLOPT_BUFFERSIZE  => 20, # ~ value of bytes you'd like to get 
    CURLOPT_WRITEFUNCTION => function($handle, $data) { 
     echo "WRITE: (", strlen($data), ") $data\n"; 
     return 0; 
    }, 
); 

$handle = curl_init("http://stackoverflow.com/"); 
curl_setopt_array($handle, $withCallback); 
curl_exec($handle); 
curl_close($handle); 

Выход:

WRITE: (10) <!DOCTYPE 

Другой альтернативой является сделать запрос на голову используя CURLOPT_NOBODY, который никогда не доставит тело. Но это не запрос GET.

Настройки таймаута подключения - это то, сколько времени потребуется до истечения времени ожидания подключения. Соединение - это фаза, пока сервер не примет ввод от curl, и завиток начинает знать о том, что делает сервер. Это не относится к фазе, когда ротор извлекает данные с сервера, это

CURLOPT_TIMEOUT Максимальное количество секунд, чтобы Curl функции для выполнения.

В Руководстве по PHP вы найдете длинный список доступных опций: curl_setopt­Docs.

+0

Обратите внимание, что я не устанавливал значения для 'CURLOPT_TIMEOUT', это было для' CURLOPT_CONNECTTIMEOUT_MS' и 'CURLOPT_CONNECTTIMEOUT'. – user966939

+0

Я знаю, вот почему я указал на это. Возможно, вы захотите установить его на 2 или 3 секунды, чтобы не дождаться, пока прочитаете. См. Также [В чем разница между CURLOPT_CONNECTTIMEOUT и CURLOPT_TIMEOUT? (Quora)] (HTTP: //www.quora.ком/PHP/Что-разностной-между-CURLOPT_CONNECTTIMEOUT-и-CURLOPT_TIMEOUT). – hakre

1

Возможно, это может быть полезно?

$GLOBALS["dataread"] = 0; 
define("MAX_DATA", 3000); // how many bytes should be read? 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://www.php.net/"); 
curl_setopt($ch, CURLOPT_WRITEFUNCTION, "handlewrite"); 
curl_exec($ch); 
curl_close($ch); 

function handlewrite($ch, $data) 
{ 
    $GLOBALS["dataread"] += strlen($data); 
    echo "READ " . strlen($data) . " bytes\n"; 
    if ($GLOBALS["dataread"] > MAX_DATA) { 
     return 0; 
    } 
    return strlen($data); 
}