在我的电子商务网站中,我使用 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/
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac
我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。