如何为大量5000个用户连续运行cron作业

时间:2017-11-24 11:36:36

标签: php cron

我有5000个用户的数据库。已经有一周一次的cron作业运行。 最初,当用户和100个用户一起工作正常时。现在,当用户达到5000时,发生的事情是Cron作业开始为大约500-600个用户运行并发生故障。我对它进行了研究并得出结论,由于HTTP遵循无状态协议,因此每当有任何新请求出现时,cron作业就会中断。现在我的问题是如何能够为所有5000个用户运行Cron作业而不会出现故障。请帮帮我。

1 个答案:

答案 0 :(得分:1)

我会首先检查您的PHP错误日志,因为您可能会遇到时间和内存限制。如果您正在执行数据库查询,我还会检查日志以查看是否有任何限制。

PHP内存限制增加

增加内存限制将允许脚本在当前内存不足时运行更长时间。

选项一

更新您的php.ini文件。改变256以满足您的要求。

php_value memory_limit 256MB

选项二

添加ini_set('memory_limit', nM)以增加内存限制,再次更改256以满足您的要求:

ini_set('memory_limit','256M');

PHP执行限制增加

set_time_limit(n)添加到PHP文件中以增加当前执行超时(更改300以满足您的要求):

ini_set('max_execution_time', 300); //300 seconds = 5 minutes

拆分数据库结果(批次)

如果您正在执行返回大量行的查询,则可能会超时。您可以尝试实现以下示例逻辑,该逻辑使用limit和offset将大查询拆分为较小的块。

// Get total rows count
$total_rows = SELECT count(id) FROM users;

// Set a block size
$block_size   = 300;

// Init starting offset
$block_offset = 0;

for($block = $block_offset; $block < $total_rows; $block = $block + $block_size) {

  // Query
  $data = SELECT * FROM table LIMIT $block_size OFFSET $block_offset;

  // Loop through each row and process here
  foreach($data as $row) {
    .. code here

    // You can also echo out something here so script is returning some data. Sometimes if nothing is sent back for a while it can cause issues (not generally for a cron though) e.g.
    echo 'Done block ' . $block;
  }

  // Update block offset, so offset increments by block size (300)  
  $block_offset = $block_offset + $block_size ;

}