PHP foreach用户脚本似乎使apache挂起
我制作了一个非常简单的脚本来循环遍历所有用户,每次执行的限制为500 它做了以下工作:PHP foreach用户脚本似乎使apache挂起,php,mysql,Php,Mysql,我制作了一个非常简单的脚本来循环遍历所有用户,每次执行的限制为500 它做了以下工作: 选择用户数据 插入一行 向用户发送电子邮件 更新一行 下一个用户 它按预期工作并成功完成。 但是,当我运行它时,我不能在另一个窗口中使用该网站,因为它只是“加载”,直到该脚本完成执行 这就像脚本在运行时锁定用户表一样,但这不应该发生,因为我们只是使用保存到$result的数据 但我可以在网站冻结时通过sqlyog查询数据库,所以不会是这样吗?它可能只是使用了太多的资源吗 脚本-示例 <? set_tim
$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
:
(如果您在那里看不到它,或者它已经关闭,但您正在使用某种框架,那么框架可能正在为您启动会话;如果是这样,则转到下一个解决方案比尝试对抗框架更简单。)
如果您在某些页面上使用会话,但不是在此长时间运行的进程上,则解决方案是在脚本开始时关闭会话,方法是:
Callsession\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;
....