Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要帮助分解PHP脚本/超出最大执行时间_Php_Mysql_Linux_Apache - Fatal编程技术网

需要帮助分解PHP脚本/超出最大执行时间

需要帮助分解PHP脚本/超出最大执行时间,php,mysql,linux,apache,Php,Mysql,Linux,Apache,我有一个PHP脚本,它可以更新我网站上最流行和最流行的图片。这个脚本应该由cron job每天运行一次,但我认为由于每个图像的每日统计数据都存储在流量数据库(它主要依赖于流量数据库)中,所以脚本太大,会超时。我使用的是hostgator共享主机,无法增加最大执行时间,不幸的是,VPS或专用服务器目前不可行。如果有人对我如何使用以下脚本或数据库(目前超过100mb)使其顺利运行有任何建议,我将不胜感激。你认为截断数据库是一个好主意,还是会把图像数据的重要方面搞得一团糟 当前脚本如下所示: <

我有一个PHP脚本,它可以更新我网站上最流行和最流行的图片。这个脚本应该由cron job每天运行一次,但我认为由于每个图像的每日统计数据都存储在流量数据库(它主要依赖于流量数据库)中,所以脚本太大,会超时。我使用的是hostgator共享主机,无法增加最大执行时间,不幸的是,VPS或专用服务器目前不可行。如果有人对我如何使用以下脚本或数据库(目前超过100mb)使其顺利运行有任何建议,我将不胜感激。你认为截断数据库是一个好主意,还是会把图像数据的重要方面搞得一团糟

当前脚本如下所示:

<?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` FROM `$database1`.`memes`");
        while($row=mysql_fetch_assoc($query)) {
            $query_b = mysql_query("SELECT `views` FROM `$database2`.`daily_meme_stats` WHERE `meme_id` = '$row[meme_id]' ORDER BY `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' WHERE `meme_id` = '$row[meme_id]' LIMIT 1");
            mysql_query("INSERT INTO `$database2`.`daily_meme_stats` SET `meme_id` = '$row[meme_id]', `date` = '$date'");
        }

        $query = mysql_query("SELECT `character_id` FROM `$database1`.`characters`");
        while($row=mysql_fetch_assoc($query)) {
            $query_b = mysql_query("SELECT `images` FROM `$database2`.`daily_char_stats` WHERE `char_id` = '$row[character_id]' ORDER BY `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' WHERE `character_id` = '$row[character_id]' LIMIT 1");
            mysql_query("INSERT INTO `$database2`.`daily_char_stats` SET `char_id` = '$row[character_id]', `date` = '$date'");
        }

//  }
我的想法:

  • 我想到的第一件事是:尝试将两个主要查询拆分为它们自己的文件。
    • 更新memes.php
      更新chars.php
  • 可能会将
    max\u execution\u time
    提高一位或禁用
    set\u time\u limit(0)
    
  • 可能会将功能转移到MySQL存储函数
  • 将所有统计数据(重新)计算移动到任务/作业队列中,如Gearman
    • 这将在后台持续工作并进行更新

您是否有推荐的文件结构,包括每个文件的打开和关闭标记

分割文件时遇到问题?我们开始:

更新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` FROM `$database1`.`memes`");

    while($row=mysql_fetch_assoc($query)) {

        $query_b = mysql_query("SELECT `views` FROM `$database2`.`daily_meme_stats` WHERE `meme_id` = '$row[meme_id]' ORDER BY `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' WHERE `meme_id` = '$row[meme_id]' LIMIT 1");

        mysql_query("INSERT INTO `$database2`.`daily_meme_stats` SET `meme_id` = '$row[meme_id]', `date` = '$date'");
    }
?>
<?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` FROM `$database1`.`characters`");

    while($row=mysql_fetch_assoc($query)) {

        $query_b = mysql_query("SELECT `images` FROM `$database2`.`daily_char_stats` WHERE `char_id` = '$row[character_id]' ORDER BY `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' WHERE `character_id` = '$row[character_id]' LIMIT 1");

        mysql_query("INSERT INTO `$database2`.`daily_char_stats` SET `char_id` = '$row[character_id]', `date` = '$date'");
    }
?>
顺便说一句:我放弃了
$minute=date(“我”);//如果($minute='00'){
。如果你真的需要它,就不知道了

Cron

将以下行添加到cronjobs(调整路径):


您是否将照片保存在数据库中,因为100mb的数据库相当大。请尝试将两个sql查询分开运行。将它们保存在两个不同的文件中,并将它们作为cron作业一个接一个地运行。我怀疑while循环中的二次查询。根据第一次查询的结果,这些查询可能正在运行XXXXXX times.@GideonAppoh谢谢,数据库中不保存图像,只保存视图等统计信息。今天、视图周、视图月等@Vishwa您是否有建议的文件结构,包括每个文件的打开和关闭标记。也许我可以试试。谢谢您的建议,我已尝试按照上面的建议将文件拆分为两个but尝试运行其中一个会返回网关超时错误。我也尝试读取删除的行,但仍然没有帮助。RegardsA网关超时错误?您尝试通过Web服务器运行此操作,对吗?除非您可以修改超时值,否则这将无法通过Web服务器运行。您是否尝试将这两个脚本作为cronjobs运行:
00***/usr/local/bin/php/home/somewhere/update chars.php
?cronjobs在CLI模式下执行php,不涉及任何网关。感谢您的详细建议和想法,我对延迟响应表示歉意,因为我给了它一些时间运行cron并查看是否进行了任何更新。我已经尝试了该命令行,但没有成功似乎路径中的/local/不起作用。根据HG支持,我应该使用没有/local/的相同路径,或者使用/opt53路径(我将cron文件夹的php版本设置为5.3)。我不相信opt53作为错误日志的时间线只在使用/usr/bin pathBtw时出现。我正在为旧的计算cron作业和新的拆分文件运行cron,以查看是否可以通过。新文件没有返回任何错误,但旧的cron.php文件似乎返回了相同的错误[2015年6月20日03:41:33美国/芝加哥]PHP致命错误:第12行的/home4/awidaa/mh2/cron/cron.PHP中超过了30秒的最长执行时间。它们似乎都没有更新流行图像。我在上面的评论中添加了更多信息。非常感谢您的建议。很抱歉,我使用的opt路径是/opt/php53/bin/PHP/path
# 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