【问题标题】:PHP Batch Processing For LoopPHP 批处理循环
【发布时间】:2019-01-26 10:13:10
【问题描述】:

我有一个可以向其发送 GET 请求的端点,它会根据限制和偏移量返回不同的结果。

https://example-foo-bar.com?l=100&o=0 // returns the first 100 items.

我想创建一个 for 循环(或我假设的嵌套 for 循环),一次返回 100 个项目,每次将结果添加到数组中,直到响应结束。我有发送 curl 请求和存储结果的代码,只是在批处理部分苦苦挣扎。

类似:

https://example-foo-bar.com?l=100&o=0

https://example-foo-bar.com?l=100&o=99

https://example-foo-bar.com?l=100&o=199

https://example-foo-bar.com?l=100&o=218 // end of response ?

我也知道一共有多少个结果,存储为$count;


我最终得到了这样的结果,但感觉不是最佳做法:

function testLoop(){

  $limit = 100;

  $count = getCount();

  $j = ceil($count/$limit);

  for ($i = 0; $i < $j; $i++){
    $offset = $i*100;
    echo 'https://example-foo-bar?l='.$limit.'&o='.$offset.'';
  }
 }

 testLoop();

【问题讨论】:

  • “直到文件结束” - 什么文件?
  • 响应结束

标签: php for-loop get batch-processing nested-loops


【解决方案1】:

我不确定我是否正确理解了这个问题。但是您是否正在寻找类似的东西?

$offset = 0;
$limit = 100;
$run = true;
$result_array = array();
while($run) {      
  $result_array = array_merge($result_array, json_decode(file_get_contents("https://example-foo-bar.com?l=".$limit."&o=".$offset),true));
  $offset = $offset + $limit;
  if($offset == {somenumber}) {
    $run = false;
  }
}

然后使用cron作业调用php文件

【讨论】:

  • 结果是一个 Json 对象
  • 我更新了答案。请检查这是否符合您的要求。
  • 如果你满意,请标记为正确答案:-)
【解决方案2】:
  1. 创建表'schedule'并存储数据id、link_name、offset和status列
  2. 将 cron 设置为每 10 分钟执行一次,并首先获取一个状态 =0 的条目(一个)
  3. 将参数传递给 testLoop($limit) 以调用函数。可能只有offset=0,offset=99,offset=199这样的整个链接
  4. 完成后更新调度表中的 status=1。
  5. 10 分钟后 cron 调用 Step1。

【讨论】:

    【解决方案3】:

    将 Cron 用于此类批处理的最佳方式,您也可以使用 php-resque

    【讨论】:

      猜你喜欢
      • 2019-08-06
      • 2017-06-15
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-21
      相关资源
      最近更新 更多