Magento 1.5.0.1 Случайный «вызов функции-члена getId() для не-объекта»

Я использую Magento 1.5.0.1 и иногда получаю сообщение об ошибке «Вызов функции-члена getId() для необъекта» при оформлении заказа.

Клиент несколько раз попытается оформить заказ с одними и теми же данными, и ошибка «Вызов функции-члена getId() для не-объекта» будет продолжать появляться, но затем, через несколько секунд или несколько минут, ошибка исчезнет. остановитесь, и касса пройдет.

Это происходит не в 100% случаев.

Я проверил: 1) Журналы ошибок Apache чисты, у Apache много свободных системных ресурсов. Оптимизирован для Magento в соответствии с официальным руководством. 2) Журналы ошибок MySQL чисты, у mysql много свободных системных ресурсов. Оптимизирован для Magento в соответствии с официальным руководством. 3) Журналы ошибок PHP будут отображать только «Вызов функции-члена getId() для не-объекта», нет никаких указаний на то, что PHP исчерпал оперативную память, т.е. ошибка невыделенной памяти, типичная для нехватки оперативной памяти. 4) Выполнены все остальные оптимизации Magento: кеширование, компиляция, APC, ограничение PHP 256mb. 5) У APC много платы за системные ресурсы. 6) Загрузка ЦП никогда не превышала 25-50%, ОЗУ использовалось только на 40-50%, более 50% свободно!

Также можно получить сообщение об ошибке «Вызов функции-члена getStoreId() для сообщения об ошибке, не относящегося к объекту».

Я рву на себе волосы, пытаясь сделать еще что-нибудь! Из 50 заказов он облажается примерно для 2-3 заказов, то есть покупатель пытается оформить заказ около 5-10 раз в течение 5-10 минут.

Что может запираться?


person cappuccino    schedule 21.04.2012    source источник
comment
Какое полное сообщение об ошибке? Он должен указывать, в каком файле/строке произошла ошибка.   -  person nachito    schedule 21.04.2012


Ответы (1)


Когда я проанализировал подобные ошибки в моей установке Magento (1.4.2), я смог понять, что это была попытка взлома сайта на основе поиска whois и nslookup. Люди (боты?) размещают заказы без должным образом инициализированного сеанса, поэтому не существует объекта магазина (или любого другого), установленного для получения идентификатора. Это должно быть помечено как ошибка, чтобы они могли правильно обработать этот случай и повторно инициализировать сеанс или выполнить какое-либо другое действие, чтобы лучше защититься от людей, пытающихся обойти логику форм.

Кроме того, в коде есть какая-то ошибка, из-за которой иногда покупатель может разместить заказ на товар стоимостью 0 долларов. В каждом случае это был обычный клиент, который, когда ему позвонили, был удивлен и дал нам реквизиты СС для ручной обработки платежа. В этом помогает очистка кеша и всего остального каждый день.

person Chris K    schedule 24.04.2012
comment
Интересно. Это не будет попыткой взлома, так как клиенты фактически связываются с нами, когда это происходит, сообщая нам, что они не могут оформить заказ. Кроме того, интересно отметить: когда это происходит, когда я сам пытаюсь оформить заказ, у меня возникает та же проблема. Таким образом, проблема не будет изолирована от одного сеанса пользователя. Это просто происходит снова и снова, где у нас есть период 10-20-30 минут, когда любые попытки оформить заказ приводят к ошибке. Несколько недель назад произошел массовый сбой, когда ошибка вообще не исчезала! Мне пришлось зайти в базу данных и сбросить номера приращений. - person cappuccino; 04.05.2012
comment
Это не случай добавления товаров за 0 долларов, потому что, как описано выше, когда возникает проблема, я на самом деле пытаюсь оформить заказ самостоятельно и могу гарантировать, что товар не стоит 0 долларов. Кроме того, во время простоя, когда ошибка getId() не прекращалась в течение нескольких часов, я сделал все: 1) очистил все кеши, 2) переиндексировал 3) очистил APC, 4) восстановил базу данных... все! Единственное, что остановило это, было, когда я сбросил счетчик приращений в базе данных magento. Но это не объясняет, почему бывают моменты, когда это происходит и исчезает через несколько минут, и время, когда оно не исчезает. - person cappuccino; 04.05.2012
comment
Кстати, ошибка возникает в файле onepagecontroller, у нас есть моды в нашем файле, поэтому номер строки не будет таким же (и никакие моды не будут вызывать это, и они являются расширениями для других вещей). На самом деле мы сделали тест, после того как заказ был сохранен с помощью -›save(); в контроллере ошибка возникает при вызове getId(), а также, когда это было закомментировано, она по-прежнему возникает при вызове getIncrementId(). ТАКЖЕ интересно, заказ НЕ был создан. ТАК, возможно, проблема не в getId() или getIncrementId(), возможно, объект не может быть вызван, потому что... - person cappuccino; 04.05.2012
comment
заказ на самом деле не создается и не сохраняется, но если это так, то почему заказ не сохраняется? мы не получаем никакого другого сообщения об ошибке. - person cappuccino; 04.05.2012
comment
Кстати, в это время мы не можем создавать заказы, счета-фактуры, кредит-ноты, доставку, в основном что-либо, связанное с заказами. Все останавливается. Котировки все еще могут быть созданы. - person cappuccino; 04.05.2012