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