首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将非常长的内存密集型循环拆分成更小的块?

如何将非常长的内存密集型循环拆分成更小的块?
EN

Stack Overflow用户
提问于 2012-04-20 11:14:39
回答 6查看 3.1K关注 0票数 0

我有一个相当长的内存密集型循环。我不能一下子运行它,因为我的服务器设置了执行时间限制,或者我耗尽了内存。

我想把这个循环分成更小的块。

我有一个想法,将循环拆分成更小的块,然后设置一个location标头,以便使用新的启动条件重新加载脚本。

我的旧脚本(伪代码。我意识到了下面的缺点)

代码语言:javascript
复制
for($i=0;$i<1000;$i++)
{
  //FUNCTION
}

我的新脚本

代码语言:javascript
复制
$start=$_GET['start'];
$end=$start+10;

for($i=$start;$i<$end;$i++;)
{
   //FUNCTION
}

header("Location:script.php?start=$end");

然而,我的新脚本成功地运行了几次,然后我得到了一个服务器错误“太多重定向”。

有什么办法可以解决这个问题吗?有没有人能建议一个更好的策略?

我在一个共享服务器上,所以我不能增加内存分配或脚本执行时间。

我想要一个PHP解决方案。

谢谢。

EN

回答 6

Stack Overflow用户

发布于 2012-04-20 11:35:46

“重定向太多”是一个浏览器错误,所以PHP的解决方案是使用cURL或标准流来加载初始页面,并让它跟随所有重定向。但是,您必须在没有超时限制的计算机上运行此程序(例如,使用CLI)

另一件需要考虑的事情是使用AJAX。页面上的一段JavaScript将运行您的脚本,收集脚本的输出,并确定是停止(计算结束)还是继续(从X开始)。这样你也可以创建一个漂亮的进度表;-)

票数 2
EN

Stack Overflow用户

发布于 2012-04-20 11:29:23

您可能希望研究一下forking child processes来完成这项工作。这些子进程可以在它们自己的内存空间中以较小的块完成工作,而父进程会触发多个子进程。这通常是由Gearman处理的,但也可以不用。

看看Dealnews的开发者网站上的Forking PHP吧。它有一个库和一些示例代码来帮助管理派生子进程所需的代码。

票数 1
EN

Stack Overflow用户

发布于 2012-04-20 11:18:14

首先,如果不知道您在循环中做了什么,就很难告诉您实际解决问题的最佳方法。但是,如果您想要执行一些需要很长时间的任务,我的建议是设置一个cron作业,让它一次完成一小部分。脚本将记录它停止的位置,下一次启动时,它可以读取日志以确定从哪里开始。

编辑:如果你反对cron,而且你不太关心用户体验,你可以这样做:

让页面加载类似于上面的cron作业。除了在这么多秒或迭代之后,停止脚本。显示刷新meta标签或javascript刷新。这样做,直到任务完成。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10239752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档