0

我正在尝试创建一个脚本来创建唯一代码并将它们写入文本文件。我已经设法生成代码,并将它们写入文件。

现在我的问题是我的循环一直在运行,导致在服务器超时之前将超过 92 000 个代码写入文件。

我做了一些日志记录,似乎一切正常,只是在几秒钟后,我的所有变量都被重置,一切都从头开始。发生这种情况的时间间隔不时变化。

我已经ini_set('memory_limit', '200M'); ini_set('max_execution_time',0);在我的脚本顶部设置了。也许我缺少一个 php 超时设置?

该脚本是控制器中的一个函数。我在这个函数的开头设置了 ini_set。这是我正在经历的循环:

public function generateAction() { 
    ini_set('memory_limit', '200M');
    ini_set('max_execution_time',0);

    $codeArray = array();
    $numberOfCodes = 78000;
    $codeLength = 8;

    $totaalAantal = 0;

    $file = fopen("codes.txt","a+");

    while(count($codeArray)<$numberOfCodes){
        $code = self::newCode($codeLength);
        if(!in_array($code,$codeArray))
        {
            $totaalAantal++;
            $codeArray[] = $code;
            fwrite($file,'total: '.$totaalAantal."\r\n");
        }
    }
    fclose($file);
}

在文件中,这将给出如下内容:

total: 1
total: 2
total: ...
total: 41999
total: 42000
total: 1
total: 2
total: ...
total: 41999
total: 42000

谢谢。

编辑:到目前为止,我们已经确定 generateAction() 被调用 2 或 3 次,在脚本结束之前,它应该只被调用一次。

4

2 回答 2

1

我已经找到了解决这个问题的方法。主机的脚本限制设置为 90 秒,因为这个脚本必须运行更长时间,我不得不通过命令行运行它。

于 2012-04-30T09:54:59.087 回答
0

考虑到 uniqid() 的测试,我们可以说变量没有被重置,但是方法 generateAction() 被调用了几次。

由于您的代码可能是同步的,我们可以说 generateAction() 被多次调用,因为主脚本被多次调用。

详细会发生什么?

由于您的算法的性质,循环中的每一次通过都比前一次慢。所以执行 generateAction() 的时间可能会很长。

您可能不会等待结束,而是停止该过程,甚至从新页面开始该过程。尽管如此,该过程并没有真正停止这么快,而是继续在后端运行。我在本地 WAMP/LAMP 安装中观察到了这样的行为:即使我停止页面、关闭页面、关闭导航器或重新启动 Apache,脚本实际上也没有停止。

所以你碰巧有几个脚本进程同时在codes.txt文件中写入。

为了避免这种情况,您可以例如在循环期间使用函数flock()锁定文件。

于 2012-04-27T14:39:11.000 回答