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