对于一个请求,处理到大,当在多个请求中拆分时,我也会得到重定向循环


Process to big for one request, when splitted in multiple request too the same page i get redirect loop

我在cakefp中有一个foreach,它处理来自分销商的产品,但问题是列表中最多有200种产品,每个产品可以有3张大图片和2个尺寸。所以我总共有1200个大动作来满足一个请求。我破坏了每10个产品的foreach,将它们从数组中删除并重定向到同一页面。但过了一段时间,我得到了一个重定向循环。

有什么办法避免这种情况吗?如果我在这个重定向freenzy中添加另一个页面,它会工作吗?重定向循环仅在重定向到同一页面时出现?

问题是循环将结束,但浏览器并不知道这一点。

$this->data = $this->Session->read('Parser.data');
$limit = 0;
foreach ($this->data as $key => $data):
   $limit++;
   if ($limit == 4)
      $this->redirect($this->here);
   ...
   $this->Session->delete('Parser.data.' . $key);
endforeach;
$this->redirect(array('controller' => 'parser', 'action' => 'index')); //if $this->data is empty it redirects to upload page

服务器可以处理我测试过的任何数量的记录,但我有以下操作:

$this->getImage(WWW_ROOT . $folder . DS, $new_path, $image['path']);

它看起来像这样:

protected function getImage($folder = null, $path = null, $from = null) {
    if (isset($from) && !empty($from))
        file_put_contents($folder . $path, file_get_contents($from));
}

这会加载服务器的内存并崩溃。这就是为什么我不得不打断前臂几次。我还尝试了其他函数来获取图片作为cUrl,但结果相同!

让我复制另一个非常相似的问题的答案:

永远不要使用URL来执行此类任务,这完全是错误的、不安全的,可能会导致脚本失效或服务器不再响应。

假设你有10000个用户,脚本运行时间为30秒,很可能脚本在完成之前就超时了,而此时你只处理了一部分用户。另一种脚本运行时数量很高或无限多的场景可能会锁定服务器。根据脚本或DB操作的不同,它可能会导致服务器的负载很高,并且在脚本运行时使用该网站的用户将遇到一个非常慢且没有响应的网站。

此外,你不能真正在一个URL上运行循环,你可以从一个URL重定向到另一个URL,这样可以模拟100000个用户的循环。如果你不循环记录,但同时获取所有100000条,那么你的脚本很可能会因为内存不足而失效。

您应该创建一个shell来处理循环中的用户,并且始终只处理例如10、50或100个用户的批。

在执行shell时,我建议将其与"nice"命令一起使用,以限制允许shell使用的CPU时间,以防止shell占用100%的CPU来保持站点响应。

查看创建外壳并在蛋糕中设置一个cron。