Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中异步处理多个GET请求_Php_Multithreading_Asynchronous - Fatal编程技术网

在PHP中异步处理多个GET请求

在PHP中异步处理多个GET请求,php,multithreading,asynchronous,Php,Multithreading,Asynchronous,我对使用PHP非常陌生,对于当前的项目,我正在运行一个从各种服务器返回ping结果的外部API。然后,我使用此信息在网页上显示“实时”事件 一次运行所有服务器的请求需要几分钟才能返回结果,因此我想将每个服务器作为单独的请求进行分解。但是,创建一个foreach循环并通过每个服务器的一个请求进行循环,直到循环完成后才返回结果 我现在认为我最好的选择是设置某种异步处理(多线程)函数,在它自己的单独线程上发送每个请求 使用PHP很容易做到这一点吗?我只需要发送一个AJAX调用,获取结果并发布到数据库。

我对使用PHP非常陌生,对于当前的项目,我正在运行一个从各种服务器返回ping结果的外部API。然后,我使用此信息在网页上显示“实时”事件

一次运行所有服务器的请求需要几分钟才能返回结果,因此我想将每个服务器作为单独的请求进行分解。但是,创建一个
foreach
循环并通过每个服务器的一个请求进行循环,直到循环完成后才返回结果

我现在认为我最好的选择是设置某种异步处理(多线程)函数,在它自己的单独线程上发送每个请求

使用PHP很容易做到这一点吗?我只需要发送一个AJAX调用,获取结果并发布到数据库。然而,我确实需要不断地反复运行

注意:
我使用的是PHP版本5.5.12,并曾尝试尝试尝试使用
pthreads
,但它似乎破坏了我的MSSQL线程安全驱动程序,并暂时杀死了我的web应用程序。我猜这可能不是一个相当直接的过程。

多亏了
$Dagon
的建议,我决定冒险走
curl\u multi
的道路。利用网站上的一个示例,我添加了以下功能:

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

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

    $handles = array();

    if( !$options ) // add default options

        $options = array(
            CURLOPT_HEADER          => 0,
            CURLOPT_RETURNTRANSFER  => 1
        );


    // add curl options to each handle
    foreach( $res as $k => $row ) {

        $ch{$k} = curl_init();
        $options[CURLOPT_URL] = $row['url'];
        $opt = curl_setopt_array( $ch{$k}, $options );
        //var_dump( $opt );
        $handles[$k] = $ch{$k};

    }

    $mh = curl_multi_init();

    // add handles
    foreach( $handles as $k => $handle ) {

        $err = curl_multi_add_handle( $mh, $handle );

    }

    $running_handles = null;


    do {

        curl_multi_exec( $mh, $running_handles );
        curl_multi_select( $mh );

    } while( $running_handles > 0 );


    foreach( $res as $k=>$row ) {

        $res[$k]['error'] = curl_error( $handles[$k] );

        if( !empty( $res[$k]['error'] ) ) {

            $res[$k]['data']  = '';

        } else {

            $res[$k]['data']  = curl_multi_getcontent( $handles[$k] );  // get results

        }

        // close current handler
        curl_multi_remove_handle( $mh, $handles[$k] );

    }

    curl_multi_close( $mh );

    return $res; // return response

}
函数multiCurl($res,$options=”“){
如果(计数($res)为0,
CURLOPT_RETURNTRANSFER=>1
);
//向每个控制柄添加卷曲选项
foreach($k=>$row){
$ch{$k}=curl_init();
$options[CURLOPT_URL]=$row['URL'];
$opt=curl_setopt_数组($ch{$k},$options);
//var_dump($opt);
$handles[$k]=$ch{$k};
}
$mh=curl_multi_init();
//添加句柄
foreach($k=>$handle的句柄){
$err=curl\u multi\u add\u句柄($mh,$handle);
}
$running_handles=null;
做{
curl\u multi\u exec($mh,$running\u句柄);
卷曲多点选择($mh);
}while($running_handles>0);
foreach($k=>$row){
$res[$k]['error']=curl_error($handles[$k]);
如果(!empty($res[$k]['error'])){
$res[$k]['data']='';
}否则{
$res[$k]['data']=curl\u multi\u getcontent($handles[$k]);//获取结果
}
//关闭当前处理程序
curl_multi_remove_句柄($mh,$handles[$k]);
}
卷曲多重闭合($mh);
return$res;//返回响应
}
尽管在执行完所有url后仍会显示结果,但在我的60多个服务器地址数组中,返回的响应时间约为10秒左右,而每台服务器只需ping一次,响应时间约为一分钟


这正是我所需要的。

另一种方法是使用cron作业定期获取数据并将其存储在数据库中。然后,您只需查询数据库即可获得最新的结果。