使用php在循环内调用API
我正在寻找在循环内调用API的最佳和最快的方法,例如,bellow是我当前的代码,但我认为这不是一个好方法,因为在这种方式下,API被调用的时间是100秒,因为它在php循环下。有什么我可以在外面用的吗?但问题是我必须传递一些唯一的值,这些值只在循环中使用php在循环内调用API,php,loops,curl,while-loop,Php,Loops,Curl,While Loop,我正在寻找在循环内调用API的最佳和最快的方法,例如,bellow是我当前的代码,但我认为这不是一个好方法,因为在这种方式下,API被调用的时间是100秒,因为它在php循环下。有什么我可以在外面用的吗?但问题是我必须传递一些唯一的值,这些值只在循环中 $sql_q = sqlsrv_query($mssql, "SELECT * FROM Table WHERE Club='123'"); while($sql_f = sqlsrv_fetch_array($sql_
$sql_q = sqlsrv_query($mssql, "SELECT * FROM Table WHERE Club='123'");
while($sql_f = sqlsrv_fetch_array($sql_q)){
/ Calling API TO Check Status
$auth = curl_init();
curl_setopt_array($auth, array(
CURLOPT_URL => "http://api.checkstatus.com/apiurl",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS =>"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\r\n <soap:Body>\r\n <CheckStatus xmlns=\"http://apiurl.info/\">\r\n <UserID>".$ql_f['ID']."</UserID>\r\n </CheckStatus >\r\n </soap:Body>\r\n</soap:Envelope>",
CURLOPT_HTTPHEADER => array(
"Content-Type: text/xml"
),
));
$authres = curl_exec($auth);
curl_close($auth);
}
$sql\u q=sqlsrv\u查询($mssql,“从Club='123'所在的表中选择*);
而($sql\u f=sqlsrv\u fetch\u数组($sql\u q)){
/调用API检查状态
$auth=curl_init();
curl_setopt_数组($auth,数组(
CURLOPT_URL=>”http://api.checkstatus.com/apiurl",
CURLOPT_RETURNTRANSFER=>true,
CURLOPT_编码=>“”,
CURLOPT_MAXREDIRS=>10,
CULLOPT_超时=>0,
CURLOPT_FOLLOWLOCATION=>true,
CURLOPT_HTTP_VERSION=>CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST=>“POST”,
CURLOPT\u POSTFIELDS=>“\r\n\r\n\r\n”。$ql\u f['ID']。”\r\n\r\n\r\n“,
CURLOPT_HTTPHEADER=>数组(
“内容类型:文本/xml”
),
));
$authres=curl\u exec($auth);
卷曲关闭($auth);
}
您需要设置一个调度机制
例如:
您需要设置一个调度机制 例如:
你为什么要提交这么多?它可能会在某个时候拒绝您的请求。您确定
while($sql\u f=sqlsrv\u fetch\u array($sql\u q))吗{
这取决于API支持什么。如果您的API只支持此参数化,我看不出有任何方法可以发送大量请求。虽然循环工作正常,甚至API也工作正常,但我担心的是加载速度,我很确定这是因为我在循环内调用API。如果我错了,请纠正我。通常API具有某种过滤功能,我的建议是检查您正在使用的API的文档,并通过一个或两个请求(使用偏移量、页面或其他方式)获取所需的所有数据…如果您从数据库中获得2000条记录会怎么样?您将向API发出2000条请求?这似乎根本不正确。为什么您必须提交这么多?它可能会在某个时候拒绝您的请求。您确定($sql\U f=sqlsrv\U fetch\U array($sql\U q))时while吗{
这取决于API支持什么。如果您的API只支持此参数化,我看不出有任何方法可以发送大量请求。虽然循环工作正常,甚至API也工作正常,但我担心的是加载速度,我很确定这是因为我在循环内调用API。如果我错了,请纠正我。通常API具有某种过滤功能,我的建议是检查您正在使用的API的文档,并通过一个或两个请求(使用偏移量、页面或其他方式)获取所需的所有数据…如果你从数据库中获得2000条记录会怎么样?你会向API发出2000条请求?这似乎完全不正确谢谢你的回答,但我调用API是为了检查状态,而不是更新状态,所以cron job对我来说帮不了忙。换句话说,我显示了一个用户列表及其状态。状态来自API,所以当r我运行此代码时,我希望看到所有用户的状态,而不是等待cron作业。异步检查状态并在用户列表中显示最后一个已知状态如何?如果状态检查是一项昂贵的操作,您应该找到方法将其使用降到最低。例如,通过在本地缓存状态,根据需要更新状态具体请求,创建另一个可以批量返回状态的API,等等。感谢您的回答,但我调用API是为了检查状态,而不是更新状态,所以cron job不会帮我猜。换句话说,我显示用户列表及其状态。状态来自API,所以每当我运行此代码时,我都希望看到所有用户使用它们的状态,而不是等待cron作业。异步检查状态并在用户列表中显示最后一个已知状态如何?如果状态检查是一项昂贵的操作,您应该找到方法来最小化它的使用。例如,通过在本地缓存状态、根据特定请求更新状态、创建另一个API来批量退货状态等。