Dj Zemine - Giving Tenderness in Good Hands Как качать с YouTube
Янв 25

Всем известно что многопоточности в PHP нет. Но есть задачи, которые без нее просто никак. Потому приходится реализовывать multi-threading различными извращенными способами.

Сегодня мы поговорим про CURL.

В билиотеке CURL поддержка мультипоточности есть и она отлично подходит например для многопотоковой загрузки одновременно нескольких файлов. Рассмотрим пример кода.

<?php

/**
 * Многопотоковая загрузка посредством CURL
 *
 * @param array $array_urls массив url'ов
 * @param int $timeout таймаут
 * @param str $savepath путь для сохранения файлов
 * @return array массив имен загруженных файлов
 */
function multi_download($array_urls, $timeout = 60, $savepath = 'tmp/')
{
$multi_handle = null;
$curl_handles = array();
$file_pointers = array();
$downloaded_files = array();

// для работы нам нужен curl
if(!extension_loaded('curl')) return false;
if(!is_array($array_urls) || empty($array_urls)) return false;

// если папки нету, мы ее создадим
if ($savepath) {
	if(!is_dir($savepath)) {
		if(!mkdir($savepath, 0755)) return false;
	}
}

// инициализируем curl_multi
$multi_handle=curl_multi_init();

// добавляем url'ы с параметрами
foreach($array_urls as $key=>$url) {
	// создаем список имен закачанных файлов (на будущее)
	$downloaded_files[$key]=$savepath.md5($url);
	// список указателей на открытые файлы
	$file_pointers[$key]=fopen($downloaded_files[$key],'w');
	// список curl-обработчиков
	$curl_handles[$key]=curl_init($url);
	// создаем массив с опциями
	$options=array (
	CURLOPT_FILE => $file_pointers[$key],
	CURLOPT_TIMEOUT => $timeout,
	CURLOPT_FAILONERROR => true,
	CURLOPT_HEADER => false,
	CURLOPT_FOLLOWLOCATION => true
	);
	// и применяем к нашим обработчикам
	curl_setopt_array($curl_handles[$key], $options);
	// добавляем обработчик в curl_multi
	curl_multi_add_handle($multi_handle,$curl_handles[$key]);
}

// выполняем
do { curl_multi_exec($multi_handle, $running);
} while ($running > 0);

// освобождаем ресурсы
foreach ($array_urls as $key => $url) {
	curl_multi_remove_handle($multi_handle,$curl_handles[$key]);
	curl_close($curl_handles[$key]);
	fclose($file_pointers[$key]);
}
curl_multi_close($multi_handle);

// возвращаем список скачанных файлов
return $downloaded_files;
}

?>

В следующих постах мы рассмотрим другие способы реализации многопоточности в PHP.

ПС: Подкиньте какую-то хрень для оформления кода)


(Нет пока голосов)
Loading ... Loading ...

Добавить в delicious.com Добавить в google.com/bookmarks/ Добавить в bobrdobr.ru Добавить на Memori.ru Добавить на news2.ru Добавить на digg.com

Комментарии к “Multi-Threading in PHP using CURL”

  1. S.A.P.   

    >> В следующих постах мы рассмотрим другие способы реализации многопоточности в PHP.

    У тебя раздвоение личности?))

  2. Freelite   

    имелось ввиду мы с вами, моими читателями рассмотрим)
    а раздвоения у нас нет)

  3. folone   

    ПС: Подкиньте какую-то хрень для оформления кода)

    Вот

  4. Pils   

    Руслан вобщем есть у тебя такая фигня которая позволяет удаленному пользователю выполнить произвольный PHP сценарий на целевой системе. и есть ли такие вобще программы?

  5. Pils   

    ну и чтоб она была бы с привелегиями веб сервера

  6. Freelite   

    folone, о класс, спасибо!

    Pils, нету таких программ) и не будет) те че заняться нечем, йуный хакер?)

Оставить комментарий

Ищете автомобиль? купить audi A3 и A4 - audi в Москве росно