很久没有搞 OpenCart 了,昨天在群里面看到一个人反应,OpenCart 后台(Dashboard)首页打开很慢,大约 9 秒,其他任何页面都很快。不知道什么原因,于是我帮他解决了这个问题,这里随便记录一下问题解决的经过和思路。

首先我让它开启 mysql 的慢查询记录,因为后台首页有一个图表统计,以及订单和用户的等统计数据。可是结果他说并没有查询超过 2 秒的记录。看来不是 mysql 查询的问题。

然后我又让他用 firebug 看一下,哪个 http 请求的时间线最长,本来以为有外部请求的原因,结果发现就是 route=common/home&token= 返回的一个 ajax 超时状态。于是我就去查看了admin/controller/common/home.php 的源码,也没有发现有什么外部的请求。一个个查看 ControllerCommonHome 中 index 方法中所有的$this->load->model,后来发现下面这段代码:

if ($this->config->get('config_currency_auto')) {
            $this->load->model('localisation/currency');

            $this->model_localisation_currency->updateCurrencies();
        }

admin/model/localisation/current.php看了一下源代码,果然里面有一段 curl 请求外部链接的代码:

public function updateCurrencies($force = false) {
		if (extension_loaded('curl')) {
			$data = array();

			if ($force) {
				$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "currency WHERE code != '" . $this->db->escape($this->config->get('config_currency')) . "'");
			} else {
				$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "currency WHERE code != '" . $this->db->escape($this->config->get('config_currency')) . "' AND date_modified < '" .  $this->db->escape(date('Y-m-d H:i:s', strtotime('-1 day'))) . "'");
			}

			foreach ($query->rows as $result) {
				$data[] = $this->config->get('config_currency') . $result['code'] . '=X';
			}

			$curl = curl_init();
			//就是这里了,看到木有
			curl_setopt($curl, CURLOPT_URL, 'http://download.finance.yahoo.com/d/quotes.csv?s=' . implode(',', $data) . '&f=sl1&e=.csv');
			curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

			$content = curl_exec($curl);

			curl_close($curl);

			$lines = explode("\n", trim($content));

			foreach ($lines as $line) {
				$currency = utf8_substr($line, 4, 3);
				$value = utf8_substr($line, 11, 6);

				if ((float)$value) {
					$this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '" . (float)$value . "', date_modified = '" .  $this->db->escape(date('Y-m-d H:i:s')) . "' WHERE code = '" . $this->db->escape($currency) . "'");
				}
			}

			$this->db->query("UPDATE " . DB_PREFIX . "currency SET value = '1.00000', date_modified = '" .  $this->db->escape(date('Y-m-d H:i:s')) . "' WHERE code = '" . $this->db->escape($this->config->get('config_currency')) . "'");

			$this->cache->delete('currency');
		}
	}

看到了吧,它用 curl 抓取了 yahoo 的关于汇率的数据,结合这 2 段代码可以看出,其实它的功能就是打开这个页面的时候自动更新数据库中汇率数据。 到此问题找到原因了,那么解决的方法总结一下:

  1. 服务器 PHP 是否支持 CURL 扩展
  2. 服务器空间是否允许访问外部链接
  3. 可以关闭自动更新汇率(Dashboard>System>Setting>Your Store>edit>local>Auto Update Currency 选择No

转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记

如果觉得本篇文章对您十分有益,何不 打赏一下

谢谢打赏

本文链接地址: 关于 OpenCart 后台(Dashboard)首页打开很慢的问题

知识共享许可协议 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可