phpcurl多线程方法

author author     2022-07-30     353

关键词:

<?php
/*
curl 多线程抓取
*/
 /** 
     * curl 多线程 
     *  
     * @param array $array 并行网址 
     * @param int $timeout 超时时间
     * @return array 
     */ 
 function Curl_http($array,$timeout){
  $res = array();
  $mh = curl_multi_init();//创建多个curl语柄
 $startime = getmicrotime();
  foreach($array as $k=>$url){
   $conn[$k]=curl_init($url);

        curl_setopt($conn[$k], CURLOPT_TIMEOUT, $timeout);//设置超时时间
        curl_setopt($conn[$k], CURLOPT_USERAGENT, ‘Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)‘);
        curl_setopt($conn[$k], CURLOPT_MAXREDIRS, 7);//HTTp定向级别
        curl_setopt($conn[$k], CURLOPT_HEADER, 0);//这里不要header,加块效率
        curl_setopt($conn[$k], CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
        curl_setopt($conn[$k],CURLOPT_RETURNTRANSFER,1);
        curl_multi_add_handle ($mh,$conn[$k]);
  }
  //防止死循环耗死cpu 这段是根据网上的写法
  do {
   $mrc = curl_multi_exec($mh,$active);//当无数据,active=true
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);//当正在接受数据时
  while ($active and $mrc == CURLM_OK) {//当无数据时或请求暂停时,active=true
   if (curl_multi_select($mh) != -1) {
    do {
     $mrc = curl_multi_exec($mh, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
   }
  }

  foreach ($array as $k => $url) {
     curl_error($conn[$k]);
       $res[$k]=curl_multi_getcontent($conn[$k]);//获得返回信息
       $header[$k]=curl_getinfo($conn[$k]);//返回头信息
       curl_close($conn[$k]);//关闭语柄
       curl_multi_remove_handle($mh  , $conn[$k]);   //释放资源  
  }

  curl_multi_close($mh);
  $endtime = getmicrotime();
  $diff_time = $endtime - $startime;

  return array(‘diff_time‘=>$diff_time,
      ‘return‘=>$res,
     ‘header‘=>$header  
     );

 }
 //计算当前时间
 function getmicrotime() {
     list($usec, $sec) = explode(" ",microtime());
     return ((float)$usec + (float)$sec);
 }

 //测试一下,curl 三个网址
 $array = array(
    "http://www.weibo.com/",
    "http://www.renren.com/",
    "http://www.qq.com/"
    );
 $data = Curl_http($array,‘10‘);//调用
 var_dump($data);//输出

?>

关于do while的那段解释:

因为$active要等全部url数据接受完毕才变成false,所以这里用到了curl_multi_exec的返回值判断是否还有数据,
当有数 据的时候就不停调用curl_multi_exec,暂时没有数据就进入select阶段,新数据一来就可以被唤醒继续执行。
这里的好处就是CPU的无谓 消耗没有了。

这个多线程的写法步骤:
第一步:调用curl_multi_init
第二步:循环调用curl_multi_add_handle
这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle。
第三步:持续调用curl_multi_exec
第四步:根据需要循环调用curl_multi_getcontent获取结果
第五步:调用curl_multi_remove_handle,并为每个字handle调用curl_close
第六步:调用curl_multi_close

java多线程编程——多线程技能(代码片段)

第一章Java多线程技能文章目录第一章Java多线程技能前言一、进程和多线程概述二、使用多线程1.继承Thread类2.线程随机性的展现3.实现Runnable接口4.使用Runnable接口实现多线程的优点5.实例变量共享造成的非线程安全问题与解决方... 查看详情

java+线程内部调用实例方法会多线程安全吗?

Java中线程内部调用实例方法时,其线程安全性取决于该实例方法是否是线程安全的。如果实例方法经过正确设计和实现,确保不会出现竞态条件(racecondition)和数据竞争(datarace),则它也是线程安全的,线程内部调用时不会... 查看详情

多线程教程初级教程--创建多线程的方法(代码片段)

1-1:进程和线程的区别是什么?总结:进程是所有线程的集合,每一个线程是进程中的一条执行路径。1-2:利用多线程有什么好处1.提高程序的执行效率,防止阻塞2.充分利用多核CPU的性能3.利用多线程可以达到任务以大化小的目的2-1... 查看详情

多线程基础

多线程基础(二)1、创建线程1)使用Thread创建并启动线程–通过继承Thread类并重写run方法来定义一个具体的线程。run方法中定义线程要完成的任务。packageday04;/***第一种创建线程的方法*继承Thread类,重写run方法*run方法:定义线... 查看详情

多线程

...方法调用前为异步方法指定一个回调函数,方法调用后被线程池中的一个线程接管,执行该方法。主线程立即返回,继续执行其他工作。如果异步方法执行完毕,会自动执行回调方法,处理异步方法的调用结果。实现:通过异步... 查看详情

多线程与多进程---方法对比与使用

多线程与多进程 创建多线程和多进程创建多线程方法一:直接调用import threading, time         def foo(name):       time 查看详情

java多线程多线程基础

1.创建线程的方法之一--继承Thread类,并实现run方法1.main函数 2.测试线程类:3.运行结果:  2.创建线程的方法之二--实现Runnable接口 查看详情

java多线程示例

/*多线程示例。创建多线程有两种方法。一种继承Thread类,并且覆盖Thread中的run方法,并且调用其start方法。startt方法的作用是开启线程,并且调用run方法。复写run方法的目的是:将自定义的代码存储在run方法中,让线程运行。*/... 查看详情

多线程--课堂

线程方法介绍:1、sleep():使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据,注意该方法要捕捉异常。... 查看详情

多线程(代码片段)

1.多线程1.创建多线程1.第一种创建方式Thread类创建Thread类:实现步骤:创建一个Thread类的子类在Thread类的子类中重写Thread类中的run方法,设置线程任务(开启线程需要做什么?)创建Thread类的子类对象调用Thread类中的方法start方法,开启新... 查看详情

多线程-join()方法

在很多情况下,主进程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程往往将早于子线程结束之前结束。这时,如果主线程想等待子线程执行完成之后再结束,比如子线程处理一个数据,主线程要取得这个数据... 查看详情

java多线程java中的sleep方法

点我跳过黑哥的卑鄙广告行为,进入正文。 Java多线程系列更新中~  正式篇:Java多线程(一)什么是线程Java多线程(二)关于多线程的CPU密集型和IO密集型这件事Java多线程(三)如何创建线程Java多线程(四)java中的Sleep... 查看详情

[java学习]多线程(207待续)

关于多进程与多线程使用多进程的目的:提高CPU利用率。使用多线程的目的:提高应用程序?利用率。多线程与多进程区别:进程间内存独立;同一个进程的线程间共享“堆内存和方法区内存”,栈内存是独立的,一个线程一个... 查看详情

解决这个多线程问题的方法是啥?

】解决这个多线程问题的方法是啥?【英文标题】:Whichapproachtotakewiththismultithreadingproblem?解决这个多线程问题的方法是什么?【发布时间】:2011-03-2908:56:08【问题描述】:小问题:我想生成一个后台线程来处理提交到队列的工... 查看详情

java---多线程篇(代码片段)

多线程进程与线程并行与并发多线程的创建和启动Thread类创建线程的两种方式方式一:继承Thread类方式二:实现Runnable接口指定线程的名称,并获取继承方式和实现方式的联系和区别Thread类相关的方法1线程的优先级Thr... 查看详情

多线程之线程的常用方法

线程的常用方法:  Thread.currentThead():获取当前线程对象  getPriority():获取当前线程的优先级  setPriority():设置当前线程的优先级  注意:线程优先级高,被CPU调度的概率大,但不代表一定会运行,还有小概... 查看详情

20多线程

...:  在操作系统中能(同时)运行多个任务(程序)多线程:在同一应用程序中有多个顺序流(同时)执行 创建线程的方法方式一:  定义一个线程类,它继承类Thread并重写其中的方法run(),方法run()称为线程体。  由... 查看详情

java多线程有几种实现方法?线程之间如何同步

java中多线程的实现方法有两种:1.直接继承thread类;2.实现runnable接口;同步的实现方法有五种:1.同步方法;2.同步代码块;3.使用特殊域变量(volatile)实现线程同步;4.使用重入锁实现线程同步;5.使用局部变量实现线程同步。其... 查看详情