我很擅长使用PHP和当前项目我正在运行一个外部API,它返回来自各种服务器的ping结果。然后,我使用此信息在网页上显示“实时”事件。
一次运行所有服务器的请求将需要几分钟才能返回结果,因此我想将每个服务器拆分为单独的请求。但是,创建一个foreach
循环并循环遍历每个服务器的单个请求仍然没有返回结果,直到循环结束。
我现在认为我最好的选择是设置某种异步处理(多线程)函数,以便在它自己的独立线程上发出每个请求。
PHP很容易实现吗?我只需要发送一个AJAX调用,获取结果并发布到数据库。但是,我确实需要一遍又一遍地运行它。
注意:
我正在使用PHP版本5.5.12,并尝试短暂尝试pthreads
的路径,但它似乎打破了我的MSSQL线程安全驱动程序,并暂时杀死我的Web应用程序。我猜这可能不是一个相当简单的过程。
答案 0 :(得分:1)
感谢$Dagon
的建议,我决定冒险走curl_multi
的道路。利用php.net网站上的示例,我添加了以下功能:
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
}
即使在执行完所有网址后仍然显示结果,但是我的60多个服务器地址数组中的数据仍然大约为10秒左右,相比大约一分钟(每个服务器一次ping一次) )。
正是我所需要的。