|
这篇文章主要为大家详细介绍了PHP利用多线程下载远程多个文件的简单示例,具有一定的参考价值,可以用来参考一下。
感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧!
代码如下:
- function remote($urls, $name = '', $path = '', $dir = './images/') {
- if (!is_array($urls) or count($urls) == 0) {
- return false;
- }
- dmkdir($dir);
- $curl = $text = array();
- foreach($urls as $k => $v) {
- if (!empty($v) && preg_match("~^http~i", $v)) {
- $nurl[$k] = trim(str_replace(' ', "%20", $v));
- $curl[$k] = curl_init($nurl[$k]);
- curl_setopt($curl[$k], CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
- curl_setopt($curl[$k], CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($curl[$k], CURLOPT_HEADER, 0);
- curl_setopt($curl[$k], CURLOPT_CONNECTTIMEOUT, 20);
- if(!isset($handle)){
- $handle = curl_multi_init();
- }
- curl_multi_add_handle($handle, $curl[$k]);
- }
- continue ;
- }
- $active = null;
- do{
- $mrc = @curl_multi_exec($handle, $active);
- } while ($mrc == CURLM_CALL_MULTI_PERFORM);
- while ($active && $mrc == CURLM_OK) {
- if (curl_multi_select($handle) != -1) {
- do {
- $mrc = curl_multi_exec($handle, $active);
- } while ($mrc == CURLM_CALL_MULTI_PERFORM);
- }
- }
- foreach ($curl as $k => $v) {
- if (curl_error($curl[$k]) == "") {
- if ($k == 0) {
- $fname[$k] = strtolower($name . '.' . pathinfo($urls[$k], PATHINFO_EXTENSION));
- } else {
- $fname[$k] = strtolower($name . '_' . $k . '.' . pathinfo($urls[$k], PATHINFO_EXTENSION));
- }
- $text[$k] = (string) curl_multi_getcontent($curl[$k]);
- $filedir[$k] = $dir.'/' . $fname[$k];
- if (file_put_contents($filedir[$k], $text[$k])) {
- $filepath[$k] = $path . $fname[$k];
- }
- }
- curl_multi_remove_handle($handle, $curl[$k]);
- curl_close($curl[$k]);
- }
- curl_multi_close($handle);
- return $filepath;
- }
复制代码 |
|