【发布时间】:2012-09-18 07:41:56
【问题描述】:
对于我的网站,我每 30 分钟运行一次 Cron 作业,如果我尝试在这 30 分钟标记访问我的网站,我会收到 500 内部服务器错误,或者我会收到 5-10 秒的任何页面加载时间地点。
我正在使用 Php,而我的 cron 作业正在使用 Php 和 MySQL。
我怎样才能让它不落后于我的整个网站或让它更快,从而减少滞后?
Cron:
每 15 分钟运行一次的 crons 之一:
<?php
require('functions.php');
global $mysqli;
$select = $mysqli->prepare("SELECT `tkn` FROM `users` ORDER BY `dt` ASC LIMIT 0, 200");
$select->execute();
$select->bind_result($cur_token);
$tokens = array();
while($select->fetch())
{
array_push($tokens, $cur_token);
}
foreach($tokens as $token)
{
$api = Class::Instance($token);
$info = $api->Users->Info();
if(empty($info->error))
{
$info->data->token = $token;
updateUser($info->data);
} else if($info->error->code == 400) {
$update = $mysqli->prepare("UPDATE `users` SET `active` = 0 WHERE `tkn` = ?");
$update->bind_param('s', $token);
$update->execute();
}
}
?>
其他 Cron 作业:
<?php
require('functions.php');
global $mysqli;
$select = $mysqli->prepare("SELECT `email`, `username`, `id` FROM `users` WHERE `email` IS NOT NULL AND `email` <> '' AND `credits` < `credits_offered` AND `emailed_credits` = 0");
$select->execute();
$select->bind_result($email, $username, $id);
$users = array();
while($select->fetch())
{
$users[] = array("id" => $id, "email" => $email, "username" => $username);
}
foreach($users as $user)
{
$to = $user['email'];
$subject = '';
$message = "";
$headers = 'From: email@domain.com' . "\r\n" .
'Reply-To: reply@domain.com';
mail($to, $subject, $message, $headers);
$update = $mysqli->prepare("UPDATE `users` SET `emailed` = 1 WHERE `id` = ?");
$update->bind_param('i', &$user['id']);
$update->execute();
$update->close();
}
?>
我怎样才能减少这些滞后或根本不滞后?
【问题讨论】:
-
在没有任何进一步信息的情况下,您真的希望得到任何有用的答案吗?
-
如果您说出 cronjobs 的作用可能会有所帮助....
-
cron 作业在做什么?他们跑了多长时间?他们是否使用会话在您的网站上执行任何 http 请求?这些作业是否锁定了站点其余部分所需的任何资源?如果没有更多细节,您的问题将无法回答
-
同上,请编辑您的 cron 列表和您怀疑滞后的那些脚本的内容
-
Cron Jobs - 多少?请将您的 crontab 添加到问题中,如果它调用脚本,还有这些脚本。此外,您还可以在那段时间执行一些指标并记录负载和 i/o,这样实际上在这些高峰时服务器的压力会更加明显。
$ vmstat 1- 因为你有不止一个,如果你已经知道它们很慢,不要同时启动它们。与其一次全部 50 个用户,不如每分钟做两个用户,而不是在 30 分钟内做 60 个用户。