Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP foreach用户脚本似乎使apache挂起_Php_Mysql - Fatal编程技术网

PHP foreach用户脚本似乎使apache挂起

PHP foreach用户脚本似乎使apache挂起,php,mysql,Php,Mysql,我制作了一个非常简单的脚本来循环遍历所有用户,每次执行的限制为500 它做了以下工作: 选择用户数据 插入一行 向用户发送电子邮件 更新一行 下一个用户 它按预期工作并成功完成。 但是,当我运行它时,我不能在另一个窗口中使用该网站,因为它只是“加载”,直到该脚本完成执行 这就像脚本在运行时锁定用户表一样,但这不应该发生,因为我们只是使用保存到$result的数据 但我可以在网站冻结时通过sqlyog查询数据库,所以不会是这样吗?它可能只是使用了太多的资源吗 脚本-示例 <? set_tim

我制作了一个非常简单的脚本来循环遍历所有用户,每次执行的限制为500

它做了以下工作:

  • 选择用户数据
  • 插入一行
  • 向用户发送电子邮件
  • 更新一行
  • 下一个用户
  • 它按预期工作并成功完成。

    但是,当我运行它时,我不能在另一个窗口中使用该网站,因为它只是“加载”,直到该脚本完成执行

    这就像脚本在运行时锁定用户表一样,但这不应该发生,因为我们只是使用保存到
    $result
    的数据

    但我可以在网站冻结时通过sqlyog查询数据库,所以不会是这样吗?它可能只是使用了太多的资源吗

    脚本-示例

    <?
    set_time_limit(0);
    
    require '../connect.php';
    require '../includes/ses.php';
    
    $i = 1;
    
    $ses = new simpleemailservice();
    
    $result = mysql_query("SELECT id, username, email FROM `user` WHERE thiscol = 0 LIMIT 500");
    
    while($row = mysql_fetch_row($result)){
    
        mysql_query("INSERT INTO table (data) VALUES (1)");
    
        $m = new SimpleEmailServiceMessage();
    
            $m->addTo($row[1]." <".$row[2].">");
            $m->setFrom("Emailer <no-reply@emailer.com>");
            $m->setSubject("Subject");
            $m->setMessageFromString("Email Text", "Email HTML");
    
        if($ses->sendEmail($m))
            mysql_query("UPDATE `user` SET thiscol = 1 WHERE id = ".$row[0]);
    
        $i++;
    }
    ?>
    

    这种行为听起来像是会话锁定。PHP会话的默认工作方式是锁定会话(以防止两个进程写入会话对象)。这通常适用于典型的短期PHP脚本,但当您有一些长期运行的东西时,它可能会对您不利

    如果应用程序根本不使用会话,则应在php.ini或.htaccess中关闭
    会话.auto_start
    : (如果您在那里看不到它,或者它已经关闭,但您正在使用某种框架,那么框架可能正在为您启动会话;如果是这样,则转到下一个解决方案比尝试对抗框架更简单。)

    如果您在某些页面上使用会话,但不是在此长时间运行的进程上,则解决方案是在脚本开始时关闭会话,方法是:


    Call
    session\u write\u close()如果您计划做一些需要更长时间的事情。其他
    会话\u start()
    的块,直到长时间运行的进程释放了对会话的锁定。更好的方法是:如果不需要会话,就不要启动它,在确定不会向其中写入任何数据时总是关闭它。@Wrikken Perfect,这是connect.php中的
    session\u start()
    ,从未遇到过before@Wrikken这是一个答案,不是评论。所以如果你不发,我会发;-)(你可以猜到,我同意,这听起来像是会话锁定。)@DarrenCook:说定了,现在是2:00,我真的不想再通过文档链接来制定一个好的答案,所以,继续吧&发布答案,我会在这里上交;)
    <?
    set_time_limit(0);
    
    require '../connect.php';
    require '../includes/ses.php';
    
    session_write_close();
    
    $i = 1;
    ....