Magento Способ доставки Скорость загрузки

На моем сайте электронной коммерции я настроил доставку FedEx с API доставки. В методах я выбрал только 1 метод «Разрешить», который называется «Международная экономика». Несмотря на то, что у меня есть только 1 метод, проверяя журналы FedEx, кажется, что API запрашивает все методы и возвращает результат. Из-за этого на возврат тарифов на доставку ушло как минимум почти минуту.

Это нормально для Magento? Или есть ли способ ускорить скорость запроса или есть ли какая-либо модификация или хак, который я могу сделать, чтобы запрашивать только метод разрешения?

Добрый совет.

Спасибо.


person knightrider    schedule 07.04.2014    source источник


Ответы (2)


Я недавно видел несколько вопросов о FedEx Magento и скорости.

Я не уверен, что задержка вызвана запросом FedEx, но чтобы помочь нам разобраться (и ответить на ваши вопросы):

Код, который отправляет запросы:

//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

to

//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, но для того, чтобы это стоило, я записываю эти тайминги в файл журнала:

    //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, поэтому, если вы тестируете эту вещь, обратите внимание на это.

person Malachy    schedule 09.04.2014
comment
спасибо за усилия и время, чтобы объяснить все в деталях вместе с бенчмаркингом. Я очень ценю это. Пожалуйста, позвольте мне протестировать, и я сообщу вам результаты моих тестов. Спасибо! - person knightrider; 10.04.2014
comment
Как проходит тестирование? - person Malachy; 15.04.2014
comment
Тестирование проходит хорошо. Разница между песочницей и производством в том, что производство возвращается быстрее. С вашими хакерскими кодами производство работает намного быстрее, чем стандартное magento. Большое тебе спасибо! - person knightrider; 21.05.2014

Я пытался отправить с Fedex для Индии Рейган. И я сталкиваюсь с некоторыми проблемами. Затем я пытаюсь решить это, и у меня есть какое-то решение. Если вашей страной происхождения является Индия, и вы также отправляете товар в Индию и другую страну.

Для этого вам необходимо загрузить RateService_v13.wsdl для fedex. ">эта ссылка

Загрузите его и сохраните

приложение\код\ядро\Mage\США\и т.д.\wsdl\FedEx\

Теперь перейдите к

приложение\код\ядро\Mage\Usa\Model\Shipping\Carrier\Fedex.php

и найти

защищенная функция _formRateRequest

Теперь измените тело функции с помощью

protected function _formRateRequest($purpose)
{
    $r = $this->_rawRequest;
    $ratesRequest = array(
        'WebAuthenticationDetail' => array(
            'UserCredential' => array(
                'Key'      => $r->getKey(),
                'Password' => $r->getPassword()
            )
        ),
        'ClientDetail' => array(
            'AccountNumber' => $r->getAccount(),
            'MeterNumber'   => $r->getMeterNumber()
        ),
        'Version' => $this->getVersionInfo(),
        'RequestedShipment' => array(                                
            'DropoffType'   => $r->getDropoffType(),
            'ShipTimestamp' => date('c'),                   
            'PackagingType' => $r->getPackaging(),
            'Shipper' => array(
                'AccountNumber' => $r->getAccount(),               
                'Address' => array(
                    'PostalCode'  => $r->getOrigPostal(),
                    'CountryCode' => $r->getOrigCountry()
                )
            ),
            'Recipient' => array(
                'AccountNumber' => $r->getAccount(),                 
                'Address' => array(
                    'PostalCode'  => $r->getDestPostal(),
                    'CountryCode' => $r->getDestCountry(),
                    'Residential' => (bool)$this->getConfigData('residence_delivery')
                )
            )
            )
        );

    if($r->getDestCountry()=='IN'){
        $ratesRequest['RequestedShipment']['ServiceType'] = 'STANDARD_OVERNIGHT';
        $ratesRequest['RequestedShipment']['CustomsClearanceDetail'] = array(
                        'DutiesPayment' => array(
                            'PaymentType' => 'SENDER',
                            'Payor' => array(
                                'ResponsibleParty' => array(
                                'AccountNumber' => $r->getAccount(),
                                'Contact' =>array(
                                    'ContactId' => 'sender Contact Id',
                                    'PersonName' => 'Sender Name',
                                    'Title' => 'ABC',
                                    'CompanyName' => 'Sender Company Name',
                                    'PhoneNumber' => '1234567890',
                                    'PhoneExtension' => '91',
                                    'PagerNumber' =>'12', 
                                    'FaxNumber' => '1234567890',
                                    'EMailAddress' => '[email protected]'),
                                'Address' => array('StreetLines' => 'Test Sender Address Line',                                                 
                                                'PostalCode' => $r->getOrigPostal(),
                                                'CountryCode' => $r->getOrigCountry())
                                 )                                          
                                        ),

                            ),
                        'DocumentContent' => 'NON_DOCUMENTS',
                        'CustomsValue' => array('Currency' => 'INR',
                                                'Amount' => '100'),
                        'CommercialInvoice' => array('Purpose' => 'SOLD')

                    );
        $ratesRequest['RequestedShipment']['RequestedPackageLineItems'] = array(
                                'SequenceNumber'=>1,
                                'GroupNumber'=>1,
                                'GroupPackageCount'=>1,
                                'Weight' => array(
                                    'Value' => 1.0,
                                    'Units' => 'KG'
                                ),
                                'Dimensions' => array(
                                    'Length' => 12,
                                    'Width' => 12,
                                    'Height' => 12,
                                    'Units' => 'IN'
                                )
                            );
    }else{
        $ratesRequest['RequestedShipment']['CustomsClearanceDetail'] = array(
                'CustomsValue' => array(
                    'Amount' => $r->getValue(),
                    'Currency' => $this->getCurrencyCode()
                )
            );
        $ratesRequest['RequestedShipment']['TotalInsuredValue'] = array(
                'Amount'  => $r->getValue(),
                'Currency' => $this->getCurrencyCode()
            );
        $ratesRequest['RequestedShipment']['ShippingChargesPayment'] = array(
                'PaymentType' => 'SENDER',
                'Payor' => array(
                    'AccountNumber' => $r->getAccount(),
                    'CountryCode'   => $r->getOrigCountry()
                )
            );
        $ratesRequest['RequestedShipment']['RateRequestTypes'] = 'LIST';
        $ratesRequest['RequestedShipment']['PackageCount']     = '1';
        $ratesRequest['RequestedShipment']['PackageDetail']    = 'INDIVIDUAL_PACKAGES';
        $ratesRequest['RequestedShipment']['RequestedPackageLineItems'] = array(
                '0' => array(
                    'Weight' => array(
                        'Value' => (float)$r->getWeight(),
                        'Units' => $this->getConfigData('unit_of_measure')
                    ),
                    'GroupPackageCount' => 1,
                )
            );               

        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')
            );
        }
    }

    return $ratesRequest;
}
person Sapnandu    schedule 21.10.2014