You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Facebook Ads PHP SDK处理分页以获取全部结果?

问题:PHP版Facebook Ads API分页获取全部洞察数据

使用PHP版Facebook Ads API调用getInsights()方法获取广告洞察数据时,仅返回前25条结果。已知需要通过分页获取完整数据集,且getInsights()返回类游标对象,但不清楚如何正确处理分页,尤其是next()方法的工作原理、如何判断是否还有更多结果,以及调用fetchAfter()后的操作逻辑。

现有代码:

$account = new AdAccount('act_' . $accountId);

$params = [
    'time_range' => ['since' => '2023-09-01', 'until' => '2023-09-30'],
    'level' => 'adset'
];

$fields = [
    AdsInsightsFields::CAMPAIGN_NAME,
    AdsInsightsFields::ADSET_ID,
    AdsInsightsFields::ADSET_NAME,
    AdsInsightsFields::IMPRESSIONS,
    AdsInsightsFields::CLICKS,
    AdsInsightsFields::SPEND
];

$insights = $account->getInsights($fields, $params);

// How do I handle pagination to fetch all results?

官方文档给出的示例代码:

// Fetch the next page
$cursor->fetchAfter();
// New Objects will be appended to the cursor

疑问:调用fetchAfter()之后该如何操作?是否需要再次执行foreach循环?


解决方案

核心逻辑

Facebook PHP Business SDK返回的游标对象(即代码中的$insights)内置了分页处理方法,核心要点:

  • hasNext():判断是否存在下一页数据,返回布尔值
  • fetchAfter():请求下一页数据,新数据会自动追加到当前游标对象中
  • 无需创建新游标,循环调用fetchAfter()直到hasNext()返回false即可获取全部数据

完整实现代码

$account = new AdAccount('act_' . $accountId);

$params = [
    'time_range' => ['since' => '2023-09-01', 'until' => '2023-09-30'],
    'level' => 'adset'
];

$fields = [
    AdsInsightsFields::CAMPAIGN_NAME,
    AdsInsightsFields::ADSET_ID,
    AdsInsightsFields::ADSET_NAME,
    AdsInsightsFields::IMPRESSIONS,
    AdsInsightsFields::CLICKS,
    AdsInsightsFields::SPEND
];

// 初始化游标,获取第一页数据
$insightsCursor = $account->getInsights($fields, $params);
$allInsights = [];

// 循环处理所有页数据
do {
    // 遍历当前页的所有洞察记录,存入总结果数组
    foreach ($insightsCursor as $insight) {
        $allInsights[] = $insight->getData();
    }
    // 获取下一页数据,fetchAfter()返回是否成功获取到新数据
} while ($insightsCursor->hasNext() && $insightsCursor->fetchAfter());

// $allInsights即为所有页的完整洞察数据

关键细节说明

  1. 分页判断:hasNext()会自动检查游标中的分页标记,无需手动处理分页Token,简单可靠。
  2. fetchAfter()的作用:调用后SDK会自动向Facebook API发起下一页请求,新数据直接追加到当前游标中,不需要重新赋值给新变量。
  3. 循环逻辑:使用do-while可以确保先处理第一页数据,再尝试获取后续页面,避免遗漏初始页;fetchAfter()返回布尔值,配合hasNext()可以避免无效的API请求。

内容的提问来源于stack exchange,提问作者Chris Stryczynski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 11:23:18