php - Cron Jobs 在运行时滞后于我的网站

标签 php mysql cron

<分区>

对于我的网站,我每 30 分钟运行一次 Cron 作业,如果我尝试在这 30 分钟标记访问我的网站,我要么会收到 500 内部服务器错误,要么会收到 5-10 秒的任何页面加载时间地点。

我正在使用 Php,我的 cron 作业正在使用 Php 和 MySQL。

我如何才能让它不滞后于我的整个网站或使其更快以减少滞后?

克隆:enter image description here

每 15 分钟运行一次的 cron 之一:

<?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();
}


?>

我怎样才能减少这些延迟或根本不延迟?

最佳答案

第一个建议是将准备调用移出循环。更新将锁定您的表一段时间,因此仅在完成操作后更新...缓存数组中需要更新的内容并启动事务,执行所有更新而不是提交。 更新了邮件脚本的代码示例

<?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);
}

$u = array();

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);
    $u[] = $user['id'];

}
$update = $mysqli->prepare("UPDATE `users` SET `emailed` = 1 WHERE `id` = ?");
$update->bind_param('i', &$i);
$mysqli->autocommit(false);
foreach($u as $i)
    $update->execute();
$update->close();
$mysqli->commit();

哦,差点忘了,大多数 mysql 存储引擎都非常愚蠢,确保你使用 InnoDB,它有事务支持。或者,如果您使用“愚蠢的”存储引擎,如果您的 users.id 是 int,您仍然可以通过执行

来欺骗它进行单个事务来更新多行
$update = $mysqli->prepare('UPDATE users SET emailed=1 WHERE id IN (' . implode(',', $u) . ')');
$update->execute();
$update->close();

在关闭 foreach($users as $user) 语句之后

关于php - Cron Jobs 在运行时滞后于我的网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12463614/

相关文章:

php - 在php中的一个查询中定义变量并运行查询

mysql - 在查询的第一行得到错误的结果

c# - 如何检查从数据库中转储的 xml 文件是否是最新的?

php - 如何在特定时间之前自动将邮件发送给各个用户?

PHP + MySql Cron Job,删除超过 1 小时的行

php - 调用存储过程

php - 如何从这样的3个表中查询

php - 无法使用 Lapack : Class 'Lapack' not found in

php - 我如何着手使用我现在拥有的创建关系数据库?

cron - mcelog : Cannot access bus threshold trigger `bus-error-trigger' : Permission denied