Magento Метод на доставка Скорост на зареждане

В моя сайт за електронна търговия съм конфигурирал изпращане на FedEx с API за доставка. В методите съм избрал само 1 метод Allow, който е „Международна икономика“. Въпреки че имам само 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
Тестването върви добре. Разликата между Sandbox и Production е, че Production се връща по-бързо. С вашите хакерски кодове Производството е много по-бързо от магенто по подразбиране. Благодаря ти много! - person knightrider; 21.05.2014

Опитах се да изпратя с Fedex за Индия Рейгън. И се изправям пред някои предизвикателства. След това се опитвам да го реша и имам някакво решение. Ако вашата страна на произход е Индия и изпращате дестинация също в Индия и друга държава.

За целта трябва да изтеглите RateService_v13.wsdl за fedex, можете да получите този файл от тази връзка

Изтеглете го и го запазете

app\code\core\Mage\Usa\etc\wsdl\FedEx\

Сега отидете на

app\code\core\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