Php 为什么curl\u multi不能在本地主机中正常工作?

Php 为什么curl\u multi不能在本地主机中正常工作?,php,curl-multi,Php,Curl Multi,我使用一个php函数返回1000多个网站的状态(即网站是向上还是向下) 公共函数卷发检查($nodes){ $results=array(); $node_count=计数($nodes); $curl_arr=array(); $master=curl_multi_init(); 对于($i=0;$i0); 对于($i=0;$i$value的数组) $this->multi_exec_curl_files[]=array('link'=>$value['link']); //... $this

我使用一个php函数返回1000多个网站的状态(即网站是向上还是向下)

公共函数卷发检查($nodes){
$results=array();
$node_count=计数($nodes);
$curl_arr=array();
$master=curl_multi_init();
对于($i=0;$i<$node_count;$i++){
$url=$nodes[$i];
$curl\u arr[$i]=curl\u init($url);
curl_setopt($curl_arr[$i],CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl_arr[$i],curl_NOBODY,true);
curl_setopt($curl_arr[$i],CURLOPT_超时,5);
curl_multi_add_句柄($master,$curl_arr[$i]);
}
$running=null;
做{
curl_multi_exec($master,$running);
}而($running>0);
对于($i=0;$i<$node_count;$i++){
$results[$i]['url']=curl\u getinfo($curl\u arr[$i],CURLINFO\u EFFECTIVE\u url);
$results[$i]['code']=curl\u getinfo($curl\u arr[$i],CURLINFO\u HTTP\u code);
$results[$i]['time']=curl\u getinfo($curl\u arr[$i],CURLINFO\u PRETRANSFER\u time);
}
回音“完成”;
返回$results;
}
$nodes=数组('http://google.com','http://yahoo.com','http://msn.com');   
$result=curlCheck($nodes);
打印(结果);
虽然我使用了
curl\u multi
,但是这个过程的时间很长;为此,我如何进行并行处理

试试这个解决方案:

使用
设置时间限制(0)如果使用xampp或wampp;你的执行时间可能突然结束

class myclass
{

public $multi_exec_curl_files = array();

//...

public function name()
{

//add urls to list

foreach($array as $id => $value)
$this->multi_exec_curl_files[] = array('link' => $value['link']);

//...

$this->multiCurl($this->multi_exec_curl_files);


...

}

public function multiCurl($res = array(), $options = "") {

        if (count($res) <= 0)
            return False;

        $handles = array();

        if (!$options) // add default options
            $options = self::$options;

        //print_r($options);
        // add curl options to each handle
        foreach ($res as $k => $row) {
            $ch{$k} = curl_init();
            $options[CURLOPT_URL] = $row['link'];
            //echo $row['link'].PHP_EOL;
            curl_setopt_array($ch{$k}, $options);
            $handles[$k] = $ch{$k};
        }
        //die('d');

        $mh = curl_multi_init();

        foreach ($handles as $k => $handle) {
            curl_multi_add_handle($mh, $handle);
        }

        $running_handles = null;
        //execute the handles
        do {
            $status_cme = curl_multi_exec($mh, $running_handles);
        } while ($status_cme == CURLM_CALL_MULTI_PERFORM);
//
        while ($running_handles && $status_cme == CURLM_OK) {
            if (curl_multi_select($mh) != -1) {
                do {
                    $status = curl_multi_exec($mh, $running_handles);
                } while ($status == CURLM_CALL_MULTI_PERFORM);
            }
        }

}
class-myclass
{
public$multi_exec_curl_files=array();
//...
公共函数名()
{
//将URL添加到列表中
foreach($id=>$value的数组)
$this->multi_exec_curl_files[]=array('link'=>$value['link']);
//...
$this->multiCurl($this->multi\u exec\u curl\u文件);
...
}
公共函数multiCurl($res=array(),$options=”“){
如果(计数($res)$row){
$ch{$k}=curl_init();
$options[CURLOPT_URL]=$row['link'];
//echo$row['link'].PHP_EOL;
curl_setopt_数组($ch{$k},$options);
$handles[$k]=$ch{$k};
}
//死亡('d');
$mh=curl_multi_init();
foreach($k=>$handle的句柄){
curl\u multi\u add\u句柄($mh,$handle);
}
$running_handles=null;
//执行句柄
做{
$status\u cme=curl\u multi\u exec($mh,$running\u句柄);
}while($status\u cme==CURLM\u CALL\u MULTI\u PERFORM);
//
while($running_handles&&$status_cme==CURLM_OK){
如果(卷曲多点选择($mh)!=-1){
做{
$status=curl\u multi\u exec($mh,$running\u句柄);
}而($status==CURLM\u CALL\u MULTI\u PERFORM);
}
}
}
从这里开始;这一个工作,我每天测试它;根据需要添加函数

指南:

  • 实例化该类,区分大小写

    $app=新的myclass()

  • 运行主功能

    $app->name()

  • 在此函数中,您必须执行查询并从数据库中提取所有网站URL,并将链接存储在变量/property
    $this->multi_exec_curl_文件中

    我使用
    $array
    作为我的网站列表

  • 加载所有网站URL后,调用multi-curl方法

    $this->multiCurl($this->multi\u exec\u curl\u文件)

  • 这将为每个网站url启动一个执行行(句柄),它将执行您告诉它的操作

    我使用此方法同时下载多个网站网页,您可以使用此方法查看一个网站是否在线(多个网站)

    $handles
    是curl中链接的集合

    $handle
    是一个url

    进程启动后,将等待所有句柄完成;

    根据:


    在使用libcurl版本7.24或更高版本(似乎对应于PHP5.3.10或更高版本)的Windows设置上,您可能会发现curl\u multi\u select()总是返回-1,导致文档中的示例代码超时。这显然不是一个严格意义上的bug:根据libcurl文档,如果curl\u multi\u select返回-1,您应该添加自己的sleep。

    谢谢您的回复,您能写一个如何使用此类的示例吗?t谢谢你,但我不能使用它!!我有一个错误(超过了30秒的最长执行时间)。我在Windows7上的xampp中测试了它。你能写一个完整的你用过的代码吗?或者发电子邮件到tahmasebi.f[在]gmail.com吗?请。使用set_time_limit(0);作为你的第一个指令;它确保你的应用程序运行所需的时间;
    class myclass
    {
    
    public $multi_exec_curl_files = array();
    
    //...
    
    public function name()
    {
    
    //add urls to list
    
    foreach($array as $id => $value)
    $this->multi_exec_curl_files[] = array('link' => $value['link']);
    
    //...
    
    $this->multiCurl($this->multi_exec_curl_files);
    
    
    ...
    
    }
    
    public function multiCurl($res = array(), $options = "") {
    
            if (count($res) <= 0)
                return False;
    
            $handles = array();
    
            if (!$options) // add default options
                $options = self::$options;
    
            //print_r($options);
            // add curl options to each handle
            foreach ($res as $k => $row) {
                $ch{$k} = curl_init();
                $options[CURLOPT_URL] = $row['link'];
                //echo $row['link'].PHP_EOL;
                curl_setopt_array($ch{$k}, $options);
                $handles[$k] = $ch{$k};
            }
            //die('d');
    
            $mh = curl_multi_init();
    
            foreach ($handles as $k => $handle) {
                curl_multi_add_handle($mh, $handle);
            }
    
            $running_handles = null;
            //execute the handles
            do {
                $status_cme = curl_multi_exec($mh, $running_handles);
            } while ($status_cme == CURLM_CALL_MULTI_PERFORM);
    //
            while ($running_handles && $status_cme == CURLM_OK) {
                if (curl_multi_select($mh) != -1) {
                    do {
                        $status = curl_multi_exec($mh, $running_handles);
                    } while ($status == CURLM_CALL_MULTI_PERFORM);
                }
            }
    
    }