Можем ли мы ввести массив в функцию curl и проследить результат для каждого элемента? - PullRequest
1 голос
/ 03 февраля 2012

Мой вопрос прост, но для меня это создает так много путаницы в моем уме. Я хочу знать, что мы можем ввести массив для функции curl?
обратите внимание, что «Я НЕ ПОСТАВЛЯЮ ДАННЫЕ» (ДЛЯ ПОСТАВКИ ДАННЫХ, Я ЗНАЮ, МЕНЮ ИСПОЛЬЗУЕТСЯ)

Чтобы сделать мой вопрос более понятным, позвольте мне сказать вам код ..

function mycurl($url){
$ch = curl_init(); // create a new cURL resource
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$data = curl_exec($ch); // grab URL and pass it to the browser
//echo $data; //ncomment for debugging
curl_close($ch); 
return $data;

}

и массив, который я собираюсь использовать:

myArray 
0 => string 'http://www.abc.com/a
1 => string 'http://www.abc.com/b
2 => string 'http://www.abc.com/c
3 => string 'http://www.abc.com/d

для использования массива, я использую foreach цикл, код приведен ниже

foreach ($myArray as $temp){
    $heading= mycurl($temp);
    echo $heading;
    }

цель кода

перейти на каждый URL массива с помощью функции curl требуется извлечь данные из URL обрабатывают следующий элемент массива и извлекают данные и т. д.

Кто-нибудь может подсказать мне, как я могу использовать элементы массива в функции curl? Как я могу получить свою цель? Если цикл foreach не является правильной методологией, то что мне делать?

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

То, что вы делаете, выглядит хорошо, за исключением того, что вы не должны инициализировать обработчик curl для каждой итерации, просто инициализируйте его один раз, затем измените значение $ url для каждой итерации, это будет выглядеть примерно так:

function mycurl($ch, $url) {

    curl_setopt($ch, CURLOPT_URL,$url);

    return curl_exec($ch); 
}

$ch = curl_init(); // create a new cURL resource

curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

foreach ($urls as $url) {
    $header = mycurl($ch, $url);
    var_dump($header);
}

curl_close($ch);
1 голос
/ 03 февраля 2012

Вы делаете это правильно.Однако вы можете использовать curl_multi_exec() (см. Примеры) для одновременного запуска всех запросов, классический curl может выполнять только один запрос за один раз.быть:

$ch = curl_init(); // create a new cURL resource
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

foreach( $myArray as $url){
    curl_setopt($ch, CURLOPT_URL,$url);
    $data = curl_exec( $ch);
    echo $data;
}

curl_close( $ch);

или с правильным дизайном объекта:

class MyClass {
    protected $ch = null;

    public function __construct( ){
        $this->ch = curl_init();
        curl_setopt($this->ch, CURLOPT_HEADER, 0);
        curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, TRUE);
    }

    public function __destruct(){
        curl_close( $this->ch);
    }

    public function getData( $url){
        curl_setopt($this->ch, CURLOPT_URL,$url);
        return curl_exec( $this->ch);
    }
}

$extractor = new MyClass();
foreach( $myArray as $url){
    $data = $extractor->getData( $url);
    echo $data;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...