我有一个相当长的内存密集型循环。我不能一下子运行它,因为我的服务器设置了执行时间限制,或者我耗尽了内存。
我想把这个循环分成更小的块。
我有一个想法,将循环拆分成更小的块,然后设置一个location标头,以便使用新的启动条件重新加载脚本。
我的旧脚本(伪代码。我意识到了下面的缺点)
for($i=0;$i<1000;$i++)
{
//FUNCTION
}我的新脚本
$start=$_GET['start'];
$end=$start+10;
for($i=$start;$i<$end;$i++;)
{
//FUNCTION
}
header("Location:script.php?start=$end");然而,我的新脚本成功地运行了几次,然后我得到了一个服务器错误“太多重定向”。
有什么办法可以解决这个问题吗?有没有人能建议一个更好的策略?
我在一个共享服务器上,所以我不能增加内存分配或脚本执行时间。
我想要一个PHP解决方案。
谢谢。
发布于 2012-04-20 11:35:46
“重定向太多”是一个浏览器错误,所以PHP的解决方案是使用cURL或标准流来加载初始页面,并让它跟随所有重定向。但是,您必须在没有超时限制的计算机上运行此程序(例如,使用CLI)
另一件需要考虑的事情是使用AJAX。页面上的一段JavaScript将运行您的脚本,收集脚本的输出,并确定是停止(计算结束)还是继续(从X开始)。这样你也可以创建一个漂亮的进度表;-)
发布于 2012-04-20 11:29:23
您可能希望研究一下forking child processes来完成这项工作。这些子进程可以在它们自己的内存空间中以较小的块完成工作,而父进程会触发多个子进程。这通常是由Gearman处理的,但也可以不用。
看看Dealnews的开发者网站上的Forking PHP吧。它有一个库和一些示例代码来帮助管理派生子进程所需的代码。
发布于 2012-04-20 11:18:14
首先,如果不知道您在循环中做了什么,就很难告诉您实际解决问题的最佳方法。但是,如果您想要执行一些需要很长时间的任务,我的建议是设置一个cron作业,让它一次完成一小部分。脚本将记录它停止的位置,下一次启动时,它可以读取日志以确定从哪里开始。
编辑:如果你反对cron,而且你不太关心用户体验,你可以这样做:
让页面加载类似于上面的cron作业。除了在这么多秒或迭代之后,停止脚本。显示刷新meta标签或javascript刷新。这样做,直到任务完成。
https://stackoverflow.com/questions/10239752
复制相似问题