Янв 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.
ПС: Подкиньте какую-то хрень для оформления кода)
Читать также:


12 февраля, 2008 в 20:40
>> В следующих постах мы рассмотрим другие способы реализации многопоточности в PHP.
У тебя раздвоение личности?))
13 февраля, 2008 в 15:16
имелось ввиду мы с вами, моими читателями рассмотрим)
а раздвоения у нас нет)
14 февраля, 2008 в 15:45
Вот
4 марта, 2008 в 19:11
Руслан вобщем есть у тебя такая фигня которая позволяет удаленному пользователю выполнить произвольный PHP сценарий на целевой системе. и есть ли такие вобще программы?
4 марта, 2008 в 19:13
ну и чтоб она была бы с привелегиями веб сервера
6 марта, 2008 в 14:50
folone, о класс, спасибо!
Pils, нету таких программ) и не будет) те че заняться нечем, йуный хакер?)