【问题标题】:Simple PHP Script Makes Heavy Server Load简单的 PHP 脚本使服务器负载过重
【发布时间】:2013-08-01 14:44:17
【问题描述】:

我有一个简单的 PHP 脚本,一旦运行,我就无法访问服务器上的任何其他页面。

脚本就这么简单:

for($league=11387; $league<=11407; $league++){
 for($i=1; $i<9; $i++){

    //gets the team object here from external resource
    $team = $HT->getYouthTeam($HT->getTeam($HT->getLeague($league)->getTeam($i)->getTeamId())->getYouthTeamId()); 

    if($team->getId() != 2286094){
        $youthTeams[] = $team;
    }

    set_time_limit(10);
 }
}

显然,我应该在这里获得数千个“团队”(除了一个 ID 为 2286094 的团队),但是一旦我运行此脚本,我将无法打开服务器上的任何其他页面,直到结束,这需要很多时间脚本将结果提取到 $youthTeams 数组之前的时间。

我的意图是制作一个进度条,可以准确地(以 % 表示)脚本所在的位置,但我不能,因为这个脚本使服务器无法显示任何其他页面(你会得到任何其他页面)加载”,但由于此脚本在服务器上运行,它永远不会加载)。

另外,附加子问题:一旦获取了所有这些数据,在一个查询中将它们全部插入到 mysql 数据库中是否明智?

我真的很想了解这方面的更多信息,并希望完成这项工作,所以请帮我解决这个问题。

【问题讨论】:

  • 您可能正在使用基于文件的会话,这意味着您的脚本在执行 ->getTeam 操作时会锁定会话。尝试在循环之前添加session_write_close() 以释放会话锁。这样您就可以访问网站的其他部分。
  • 非常感谢好人!我已经做了一个解决方法,所以即使没有启动会话,我也可以实际运行文件(它是 cron 作业)并且它不会“冻结”服务器的其余部分。它现在正在运行,但如果您愿意分享,我想更多地了解幕后发生的事情。 :-)

标签: php for-loop server-load


【解决方案1】:

也许您可以通过检查时间来确定哪一个查找占用的时间最多?

$t0=microtime(1);
$teamid=$HT->getLeague($league)->getTeam($i)->getTeamId();
echo "lookup teamid:  ".(($t1=microtime(1))-$t0)."<br>";
if (if($team->getId() != 2286094) {
  $youthteamid=$HT->getTeam($teamid)->getYouthTeamId();
  echo "lookup youthteamid:  ".(($t2=microtime(1))-$t1)."<br>";
  $youthteam = $HT->getYouthTeam($youthteamid);
  echo "lookup youthteam:  ".(($t3=microtime(1))-$t2)."<br>total time:  ".($t3-$t0)."<br>";
}

【讨论】:

  • 它们都需要或多或少相等的时间来返回结果。尽管如此,我仍然遇到无法打开服务器上的其他页面的问题。你还能想出什么其他的想法吗?
猜你喜欢
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 2015-08-18
  • 2012-01-26
  • 1970-01-01
  • 2014-06-06
相关资源
最近更新 更多