php - Magento 运输方式加载速度

标签 php magento fedex

在我的电子商务网站中,我使用 Shipping API 配置了 FedEx shipping。在方法中,我只选择了一种允许方法,即“国际经济”。尽管我只允许使用 1 种方法,但通过检查 FedEx 的日志,API 似乎查询了所有方法并返回了结果。因此,至少需要将近一分钟的时间才能返回运费。

Magento 正常吗?或者有没有加快查询速度的方法,或者有什么修改或破解方法可以让它只查询允许的方法?

请指教。

谢谢。

最佳答案

我最近看到一些关于 FedEx Magento 和速度的问题。

我不相信是 FedEx express 的要求导致了延误,但为了帮助我们弄清楚(并回答您的问题):-

发出请求的代码是:

//file: app/code/core/Mage/Usa/Modell/Shipping/Carrier/Fedex.php
//class: Mage_Usa_Model_Shipping_Carrier_Fedex
//function: _getQuotes()
    protected function _getQuotes()
    {
        $this->_result = Mage::getModel('shipping/rate_result');
        // make separate request for Smart Post method
        $allowedMethods = explode(',', $this->getConfigData('allowed_methods'));
        if (in_array(self::RATE_REQUEST_SMARTPOST, $allowedMethods)) {
            $response = $this->_doRatesRequest(self::RATE_REQUEST_SMARTPOST);
            $preparedSmartpost = $this->_prepareRateResponse($response);
            if (!$preparedSmartpost->getError()) {
                $this->_result->append($preparedSmartpost);
            }
        }
        // make general request for all methods
        $response = $this->_doRatesRequest(self::RATE_REQUEST_GENERAL);
        $preparedGeneral = $this->_prepareRateResponse($response);
        if (!$preparedGeneral->getError() || ($this->_result->getError() && $preparedGeneral->getError())) {
            $this->_result->append($preparedGeneral);
        }
        return $this->_result;
    }

所以答案 1:是的,Magento 会收集所有方法,无论您通过管理员允许使用哪种方法。它在两个请求中执行此操作,一个用于 SMARTPOST,一个用于所有其他方法。

答案 2:如果您想请求单一服务类型,那么您正在寻求设置,例如,

$ratesRequest['RequestedShipment']['ServiceType'] = 'INTERNATIONAL_ECONOMY';

为了测试*,您可以从以下位置复制文件

//file: app/code/core/Mage/Usa/Modell/Shipping/Carrier/Fedex.php

//file: app/code/local/Mage/Usa/Modell/Shipping/Carrier/Fedex.php

然后将代码更改为:

//file: app/code/local/Mage/Usa/Modell/Shipping/Carrier/Fedex.php
//class: Mage_Usa_Model_Shipping_Carrier_Fedex
//function: _getQuotes()
    protected function _getQuotes()
    {
        $this->_result = Mage::getModel('shipping/rate_result');
        // make separate request for Smart Post method
        $allowedMethods = explode(',', $this->getConfigData('allowed_methods'));

        //a little test code for me; you can omit it
        //echo(nl2br(print_r($allowedMethods,true)));
        //exit();
        /*
        Array<br />
(<br />
    [0] => EUROPE_FIRST_INTERNATIONAL_PRIORITY<br />
    [1] => FEDEX_1_DAY_FREIGHT<br />
    [2] => FEDEX_2_DAY_FREIGHT<br />
    [3] => FEDEX_2_DAY<br />
    [4] => FEDEX_2_DAY_AM<br />
    [5] => FEDEX_3_DAY_FREIGHT<br />
    [6] => FEDEX_EXPRESS_SAVER<br />
    [7] => FEDEX_GROUND<br />
    [8] => FIRST_OVERNIGHT<br />
    [9] => GROUND_HOME_DELIVERY<br />
    [10] => INTERNATIONAL_ECONOMY<br />
    [11] => INTERNATIONAL_ECONOMY_FREIGHT<br />
    [12] => INTERNATIONAL_FIRST<br />
    [13] => INTERNATIONAL_GROUND<br />
    [14] => INTERNATIONAL_PRIORITY<br />
    [15] => INTERNATIONAL_PRIORITY_FREIGHT<br />
    [16] => PRIORITY_OVERNIGHT<br />
    [17] => SMART_POST<br />
    [18] => STANDARD_OVERNIGHT<br />
    [19] => FEDEX_FREIGHT<br />
    [20] => FEDEX_NATIONAL_FREIGHT<br />
)<br />
*/
    //THIS IS THE NEW BIT (non core)
if(count($allowedMethods)==1){
      //then there is only one method so use it
        $response = $this->_doRatesRequest($allowedMethods[0]);
        $preparedSingleRate = $this->_prepareRateResponse($response);
        if (!$preparedSingleRate->getError() || ($this->_result->getError() && $preparedSingleRate->getError())) {
            $this->_result->append($preparedSingleRate);
        }
}else{
      //revert to default treatment:
            if (in_array(self::RATE_REQUEST_SMARTPOST, $allowedMethods)) {
            $response = $this->_doRatesRequest(self::RATE_REQUEST_SMARTPOST);
            $preparedSmartpost = $this->_prepareRateResponse($response);
            if (!$preparedSmartpost->getError()) {
                $this->_result->append($preparedSmartpost);
            }
        }

        // make general request for all methods
        $response = $this->_doRatesRequest(self::RATE_REQUEST_GENERAL);
        $preparedGeneral = $this->_prepareRateResponse($response);
        if (!$preparedGeneral->getError() || ($this->_result->getError() && $preparedGeneral->getError())) {
            $this->_result->append($preparedGeneral);
        }
}
          return $this->_result;
    }

并在同一文件中编辑函数_formRateRequest的末尾以应对特定的费率请求目的:

//file: app/code/local/Mage/Usa/Modell/Shipping/Carrier/Fedex.php
//class: Mage_Usa_Model_Shipping_Carrier_Fedex
//function: formRateRequest()
protected function _formRateRequest($purpose)
{
    $r = $this->_rawRequest;
    //...
    //...
    if ($purpose == self::RATE_REQUEST_GENERAL) {
        $ratesRequest['RequestedShipment']['RequestedPackageLineItems'][0]['InsuredValue'] = array(
            'Amount'  => $r->getValue(),
            'Currency' => $this->getCurrencyCode()
        );
    } else if ($purpose == self::RATE_REQUEST_SMARTPOST) {
        $ratesRequest['RequestedShipment']['ServiceType'] = self::RATE_REQUEST_SMARTPOST;
        $ratesRequest['RequestedShipment']['SmartPostDetail'] = array(
            'Indicia' => ((float)$r->getWeight() >= 1) ? 'PARCEL_SELECT' : 'PRESORTED_STANDARD',
            'HubId' => $this->getConfigData('smartpost_hubid')
        );
    } else {  //THIS IS THE NEW BIT (non core)
        $ratesRequest['RequestedShipment']['RequestedPackageLineItems'][0]['InsuredValue'] = array(
            'Amount'  => $r->getValue(),
            'Currency' => $this->getCurrencyCode()
        );          
        $ratesRequest['RequestedShipment']['ServiceType'] = $purpose;
    }

    return $ratesRequest;
}//end function _formRateRequest    

那应该只获取您想要的速率。 但这可能无法解决您的速度问题

您可以通过添加一些计时器和一些日志记录(到 var/log/shipping_fedex.log)来运行计时测试,如下所示:

//file: app/code/local/Mage/Usa/Modell/Shipping/Carrier/Fedex.php
//class: Mage_Usa_Model_Shipping_Carrier_Fedex
//function: 
    protected function _getQuotes()
    {
        $this->_result = Mage::getModel('shipping/rate_result');
        // make separate request for Smart Post method
        $allowedMethods = explode(',', $this->getConfigData('allowed_methods'));
    //THIS IS THE NEW BIT (non core)
if(count($allowedMethods)==1){
                //then there is only one method so use it
        $time_start = microtime(true);
        $response = $this->_doRatesRequest($allowedMethods[0]);
        $preparedSingleRate = $this->_prepareRateResponse($response);
        if (!$preparedSingleRate->getError() || ($this->_result->getError() && $preparedSingleRate->getError())) {
            $this->_result->append($preparedSingleRate);
        }
        $time_end = microtime(true);
        $time = $time_end - $time_start;        
        $this->_debug('Polled '.$allowedMethods[0].' in '.$time.' seconds');
}else{
    //revert to default treatment:

        $time_start = microtime(true);       
        if (in_array(self::RATE_REQUEST_SMARTPOST, $allowedMethods)) {
            $response = $this->_doRatesRequest(self::RATE_REQUEST_SMARTPOST);
            $preparedSmartpost = $this->_prepareRateResponse($response);
            if (!$preparedSmartpost->getError()) {
                $this->_result->append($preparedSmartpost);
            }
        }
    $time_end = microtime(true);
    $time = $time_end - $time_start;        
    $this->_debug('Polled SMART_POST in '.$time.' seconds');

        // make general request for all methods
        $time_start = microtime(true);       
        $response = $this->_doRatesRequest(self::RATE_REQUEST_GENERAL);
        $preparedGeneral = $this->_prepareRateResponse($response);
        if (!$preparedGeneral->getError() || ($this->_result->getError() && $preparedGeneral->getError())) {
            $this->_result->append($preparedGeneral);
        }
        $time_end = microtime(true);
        $time = $time_end - $time_start;        
        $this->_debug('Polled all methods in '.$time.' seconds');
}

          return $this->_result;
    }

我正在使用 FedEx 沙箱,但为了它的值(value),我在日志文件中记录了这些时间:

    //file: var/log/shipping_fedex.log

    Polled SMART_POST in 1.1807501316071 seconds
    Polled SMART_POST in 1.3307409286499 seconds
    Polled all methods in 0.78275394439697 seconds  //returns warning 556 [Message] => There are no valid services available.
    Polled all methods in 2.0135650634766 seconds  //returns 8 valid shipping methods
    Polled all methods in 1.3563330173492 seconds  //returns INTERNATIONAL_ECONOMY and INTERNATIONAL_PRIORITY
//single service request results
    Polled FEDEX_2_DAY in 3.1365180015564 seconds
    Polled FEDEX_2_DAY in 3.6471431255341 seconds
    Polled FEDEX_2_DAY in 2.1428818702698 seconds
    Polled INTERNATIONAL_ECONOMY in 2.2340540885925 seconds
    Polled INTERNATIONAL_ECONOMY in 2.9664940834045 seconds

因此,使用计时器加载您的文件,让我们知道您得到了什么。

*对于生产,当然习惯在这里说“制作您自己的模块,扩展类 Mage_Usa_Model_Shipping_Carrier_Fedex”。

**注意:我不得不将请求中发送的货币代码强制发送到“USD”,以使 FedEx 返回 SMART_POST 以外的服务类型的任何运费,所以如果您测试这个东西要小心。

关于php - Magento 运输方式加载速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22902987/

相关文章:

php - 为什么 WAMP 中的 Apache 2.1.7 不会将 PHP 错误记录到 PHP 错误日志中?

magento - 从子 SKU 获取父 SKU(可配置或捆绑)

java - 跟踪号码的 Fedex 校验和算法?

printing - 将原始数据发送到 FedEx 标签打印机

php - 从数据库中随机选择

php - 在 Vagrant 盒子之外连接到 MySQL

带有 SSL + Varnish 的 Magento

magento - 移动到本地主机后无法登录 Magento 管理页面

.net - 服务类型优先于运营商代码;用于评估错误的服务类型

javascript - 在php中的表中添加onclick事件