2 回答
TA贡献1810条经验 获得超4个赞
只需使用 cookie 存储每个循环块的计数器,然后重定向到同一页面
使用 cookie 拆分循环
<?php
$start = microtime(true);
if (!isset($_COOKIE['count']) && !is_integer($_COOKIE['count'])){
setcookie('count', 0);
header("Location: http://my.loc/Myclass.php");
exit;
}
$count = $_COOKIE['count'];
$arr = range($count, 5000000);
$handle = fopen('text.txt', 'a+');
foreach ($arr as $item){
fwrite($handle, $item . ',');
if ($item%1000000 == 999999 ){
setcookie('count', ++$item);
header("Location: http://my.loc/Myclass.php");
exit;
}elseif($item == 5000000){
setcookie('count', 0);
$end = microtime(true);
setcookie('time1', $end - $start);
exit;
}
}
另一种不使用cookies来拆分循环的解决方案
<?php
$start = microtime(true);
if (!isset($_GET['count'])){
$count = 1;
header("Location: http://my.loc/Myclass1.php?count=$count");
exit;
}
$count = $_GET['count'];
$arr = range($count, 500000);
$handle = fopen('text.txt', 'a+');
foreach ($arr as $item){
fwrite($handle, $item . ',');
if ($item%100000 == 99999){
++$item;
header("Location: http://my.loc/Myclass1.php?count=$item");
exit;
}elseif($item == 500000){
$end = microtime(true);
setcookie('time1', $end - $start);
exit;
}
}
TA贡献1852条经验 获得超7个赞
我知道您不允许对ini_set
. 因此,如果您更改命令行的设置,它不会影响 Web 请求的最大执行时间。
当您说这ini_set
不起作用时,我认为您没有意识到这不是特定问题的具体问题,因此我必须假设您的情况下不起作用意味着什么。我认为这意味着即使您设置了更大的限制,循环仍然会超时。但是,如果您运行
ini_set('max_execution_time', 0);
然后脚本将运行到最后。如果它是由操作系统发出的,例如作为 cron 作业而不是来自 Web 请求,那么 Web 请求的上限执行时间将保持不变,即使您运行ini_set
.
尽管这对于解决方案来说应该足够了,但值得一提的是,如果由于某些奇怪的原因您ini_set
甚至不允许为 cli php.ini调用,那么您将不得不在超时之前向同一页面发送请求,传递您的索引,因此下一个请求将知道从哪里继续。不要把它分成几个文件,这是一种反模式。
无论您选择哪种解决方案,请尝试优化您的代码。如果代码没有浪费时间,那么执行时间可能不会有任何问题。
- 2 回答
- 0 关注
- 166 浏览
添加回答
举报