mysql - Need Help Breaking Up PHP Script / max_execution_time exceeded -


i have php script updates popular , trending images on website. script meant run cron job once day believe due traffic database (on relies) in daily statistics each image stored, being large, script times out. on hostgator shared hosting , there no way increase max_execution_time , unfortunately vps or dedicated server not feasible @ time. appreciate if has suggestions on can following script, or database (currently on 100mb) make run smoothly. think truncating databse idea, or mess important aspects on image data?

the current script follows:

<?php      $minute = date("i");  //  if($minute=='00') {         include("../config/config.inc.php");          include("../includes/meme-function.php");          $date = date("y-m-d");          $query = mysql_query("select `meme_id` `$database1`.`memes`");         while($row=mysql_fetch_assoc($query)) {             $query_b = mysql_query("select `views` `$database2`.`daily_meme_stats` `meme_id` = '$row[meme_id]' order `date` desc");             $c=0; $week=0; $month=0;             while($row_b=mysql_fetch_assoc($query_b)) {                  if($c<=5) {                     $week=$week+$row_b['views'];                 }                 $month=$month+$row_b['views'];             }             mysql_query("update `$database1`.`memes` set `views_day` = '0', `views_week` = '$week', `views_month` = '$month' `meme_id` = '$row[meme_id]' limit 1");             mysql_query("insert `$database2`.`daily_meme_stats` set `meme_id` = '$row[meme_id]', `date` = '$date'");         }          $query = mysql_query("select `character_id` `$database1`.`characters`");         while($row=mysql_fetch_assoc($query)) {             $query_b = mysql_query("select `images` `$database2`.`daily_char_stats` `char_id` = '$row[character_id]' order `date` desc");             $c=0; $week=0; $month=0;             while($row_b=mysql_fetch_assoc($query_b)) {                  if($c<=5) {                     $week=$week+$row_b['images'];                 }                 $month=$month+$row_b['images'];             }             mysql_query("update `$database1`.`characters` set `images_today` = '0', `images_week` = '$week', `images_month` = '$month' `character_id` = '$row[character_id]' limit 1");             mysql_query("insert `$database2`.`daily_char_stats` set `char_id` = '$row[character_id]', `date` = '$date'");         }  //  } 

i appreciate suggestions or ideas may have.

my ideas:

  • the first thing comes mind is: try split 2 main queries own files.
    • update-memes.php, update-chars.php
  • maybe raise max_execution_time bit or disable set_time_limit(0);
  • maybe move functionality on mysql stored function
  • move stats (re)calculations task/job queue, gearman
    • that work continously in background , updates

do have recommended file structure including opening , closing tags each of these files.

you have problems splitting file? here go:

update-memes.php

<?php      // set_time_limit(0);      include '../config/config.inc.php';      include '../includes/meme-function.php';      $date = date("y-m-d");      $query = mysql_query("select `meme_id` `$database1`.`memes`");      while($row=mysql_fetch_assoc($query)) {          $query_b = mysql_query("select `views` `$database2`.`daily_meme_stats` `meme_id` = '$row[meme_id]' order `date` desc");          $c=0; $week=0; $month=0;          while($row_b=mysql_fetch_assoc($query_b)) {              if($c<=5) {                 $week=$week+$row_b['views'];             }             $month=$month+$row_b['views'];         }          mysql_query("update `$database1`.`memes` set `views_day` = '0', `views_week` = '$week', `views_month` = '$month' `meme_id` = '$row[meme_id]' limit 1");          mysql_query("insert `$database2`.`daily_meme_stats` set `meme_id` = '$row[meme_id]', `date` = '$date'");     } ?> 

update-chars.php

<?php     // set_time_limit(0);      include '../config/config.inc.php';      include '../includes/meme-function.php';      $date = date("y-m-d");      $query = mysql_query("select `character_id` `$database1`.`characters`");      while($row=mysql_fetch_assoc($query)) {          $query_b = mysql_query("select `images` `$database2`.`daily_char_stats` `char_id` = '$row[character_id]' order `date` desc");          $c=0; $week=0; $month=0;             while($row_b=mysql_fetch_assoc($query_b)) {              if($c<=5) {                 $week=$week+$row_b['images'];             }             $month=$month+$row_b['images'];         }          mysql_query("update `$database1`.`characters` set `images_today` = '0', `images_week` = '$week', `images_month` = '$month' `character_id` = '$row[character_id]' limit 1");          mysql_query("insert `$database2`.`daily_char_stats` set `char_id` = '$row[character_id]', `date` = '$date'");     } ?> 

btw: dropped $minute = date("i"); // if($minute=='00') {. no clue, if need it.

cron

add these lines cronjobs (adjust paths):

# run stats scripts every hour 00 * * * * /usr/local/bin/php /home/somewhere/update-memes.php 00 * * * * /usr/local/bin/php /home/somewhere/update-chars.php 

Comments

Popular posts from this blog

PHP DOM loadHTML() method unusual warning -

python - How to create jsonb index using GIN on SQLAlchemy? -

c# - TransactionScope not rolling back although no complete() is called -