У меня очень странная проблема с веб-сайтом электронной коммерции: некоторые запросы, но не все, по обновлению статусов заказов по какой-то таинственной причине не выполняются.
При успешной оплате покупателем платежный шлюз вызывает в интернет-магазине php-скрипт, который должен обновить соответствующий статус заказа (с «ожидающий» до «подтвержденный»).
Это работает в некоторых случаях, но не в других. Я заметил, что шаблон order_status_update () работает, когда URL-адрес обратного вызова вызывается с определенного IP-адреса (и соответствующего порта), но не с другого.
Я просмотрел код и проинструктировал его кучей журналирования, и все проверили до уровня запроса, но в одном случае это работает, а в другом случае - нет.
Единственное отличие, которое я вижу:
1) IP-адрес сервера, вызывающего скрипт обратного вызова,
2) удаленный порт сервера, вызывающего скрипт обратного вызова.
Насколько я знаю, вызов $ _SERVER ['REMOTE_ADDR']] не должен иметь никакого значения для выполнения чего-либо (если, конечно, скрипт явно не делает что-то соответственно, а это не так), поэтому я ' Интересно, может ли $ _SERVER ['REMOTE_PORT'] повлиять на MySQL / базу данных, что может привести к сбою запроса?
При успешном выполнении скрипта / запроса значение REMOTE_PORT равно 18436, а при сбое REMOTE_PORT - 49495.
Я прикрепил регистрацию из двух заказов, первый успешно, а второй не удалось - вы можете видеть, что они фактически идентичны (за исключением order_id и mdate, как и ожидалось)
Когда это работает:
nab_notify - вызов order_status_update с помощью d [] =: Array \ n (\ n [order_id] => 2860 \ n [order_status] => C \ n [notify_customer] => Y \ n) \ n
ps_order :: order_status_update - d [] = Array \ n (\ n [order_id] => 2860 \ n [order_status] => C \ n [notify_customer] => Y \ n) \ n
ps_order :: order_status_update - curr_order_status: order_status: C notify_customer: 1
ps_order :: order_status_update - ОБНОВЛЕНИЕ vm_orders (1) w / fields [] = Массив \ n (\ n [order_status] => C \ n [mdate] => 1314093024 \ n) \ n
ps_order :: order_status_update - ОБНОВЛЕНИЕ vm_orders (2) order_id: [2860]
ps_order :: order_status_update - ОБНОВЛЕНИЕ vm_orders (3) ЗАПРОС: [ОБНОВЛЕНИЕ #__vm_orders
SET order_status
= 'C', \ n mdate
= '1314093024' \ nГДЕ order_id = '2860']
ps_order :: order_status_update - ОБНОВЛЕНИЕ vm_orders (4) qresult: [1]
Когда это не работает:
nab_notify - calling order_status_update with d[]=:Array\n(\n [order_id] => 2863\n [order_status] => C\n [notify_customer] => Y\n)\n
ps_order::order_status_update - d[]=Array\n(\n [order_id] => 2863\n [order_status] => C\n [notify_customer] => Y\n)\n
ps_order::order_status_update - curr_order_status: order_status:C notify_customer:1
ps_order::order_status_update - UPDATE vm_orders (1) w/fields[]=Array\n(\n [order_status] => C\n [mdate] => 1314137858\n)\n
ps_order::order_status_update - UPDATE vm_orders (2) order_id:[2863]
ps_order::order_status_update - UPDATE vm_orders (3) QUERY:[UPDATE `#__vm_orders` SET `order_status` = 'C',\n`mdate` = '1314137858'\nWHERE order_id='2863']
ps_order::order_status_update - UPDATE vm_orders (4) qresult:[0]
Учитывая "тот же" запрос, может ли кто-то пролить свет на то, почему один потерпит неудачу, тогда как другой преуспеет?
Спасибо,
Эрик
ОБНОВЛЕНИЕ 1: Я добавил протоколирование уровня запросов и обнаружил некоторые ошибки, журналы показывают:
ОШИБКА 2006 - Сервер MySQL пропал
... но, как ни странно, не для всех запросов в этом конкретном сеансе (угадайте, что обнадеживает?). Я оставил разрывы строк в следах на случай, если у них есть подшипник.
Я после пары поисков и других сообщений на форуме проверил настройки php и вижу
max_execution_time = 60
max_input_time = 60
какое время должно быть достаточно?
Что странно, так это то, что это происходит только тогда, когда запрос к определенному URL-адресу выполняется с определенного IP-адреса (на этот раз тот же IP-адрес, что и в случае, когда статусы других заказов не обновлялись).
2011-08-25 02:54:48 - JDatabaseMySQL::query - SQL=SELECT `order_number`, `user_id`, `order_subtotal`,
`order_total`, `order_currency`, `order_tax`, 'order_status',
`order_shipping_tax`, `coupon_discount`, `order_discount`
FROM `jos_vm_orders`
WHERE `order_id`='2868'
2011-08-25 02:54:48 - JDatabaseMySQL::query - !!!! ERROR !!!! 2006 - MySQL server has gone away SQL=SELECT `order_number`, `user_id`, `order_subtotal`,
`order_total`, `order_currency`, `order_tax`, 'order_status',
`order_shipping_tax`, `coupon_discount`, `order_discount`
FROM `jos_vm_orders`
WHERE `order_id`='2868'
2011-08-25 02:54:48 - JDatabaseMySQL::query - SQL=SELECT user_id,order_total,order_status FROM jos_vm_orders WHERE jos_vm_orders.order_id='2868'
2011-08-25 02:54:48 - JDatabaseMySQL::query - !!!! ERROR !!!! 2006 - MySQL server has gone away SQL=SELECT user_id,order_total,order_status FROM jos_vm_orders WHERE jos_vm_orders.order_id='2868'
2011-08-25 02:54:48 - JDatabaseMySQL::query - SQL=UPDATE `jos_vm_orders` SET `order_status` = 'C',
`mdate` = '1314240914'
WHERE order_id='2868'
2011-08-25 02:54:48 - JDatabaseMySQL::query - !!!! ERROR !!!! 2006 - MySQL server has gone away SQL=UPDATE `jos_vm_orders` SET `order_status` = 'C',
`mdate` = '1314240914'
WHERE order_id='2868'
2011-08-25 02:54:48 - JDatabaseMySQL::query - SQL=INSERT INTO `jos_vm_order_history` (`order_id`,
`order_status_code`,
`date_added`,
`customer_notified`,
`comments`) VALUES (
'2868'
,'C'
,'2011-08-25 12:25:14'
,'1'
,''
)
2011-08-25 02:54:48 - JDatabaseMySQL::query - !!!! ERROR !!!! 2006 - MySQL server has gone away SQL=INSERT INTO `jos_vm_order_history` (`order_id`,
`order_status_code`,
`date_added`,
`customer_notified`,
`comments`) VALUES (
'2868'
,'C'
,'2011-08-25 12:25:14'
,'1'
,''
)
2011-08-25 02:54:48 - JDatabaseMySQL::query - SQL=SELECT order_item_id, event_reg_id FROM jos_vm_order_item WHERE order_id=2868
2011-08-25 02:54:48 - JDatabaseMySQL::query - !!!! ERROR !!!! 2006 - MySQL server has gone away SQL=SELECT order_item_id, event_reg_id FROM jos_vm_order_item WHERE order_id=2868
2011-08-25 02:54:48 - JDatabaseMySQL::query - SQL=SELECT id FROM jos_menu WHERE link='index.php?option=com_virtuemart' AND published=1
2011-08-25 02:54:48 - JDatabaseMySQL::query - !!!! ERROR !!!! 2006 - MySQL server has gone away SQL=SELECT id FROM jos_menu WHERE link='index.php?option=com_virtuemart' AND published=1
2011-08-25 02:54:48 - JDatabaseMySQL::query - SQL=SELECT vendor_name,contact_email FROM jos_vm_vendor WHERE vendor_id='1'
2011-08-25 02:54:48 - JDatabaseMySQL::query - !!!! ERROR !!!! 2006 - MySQL server has gone away SQL=SELECT vendor_name,contact_email FROM jos_vm_vendor WHERE vendor_id='1'
2011-08-25 02:54:48 - JDatabaseMySQL::query - SQL=SELECT first_name,last_name,user_email,order_status_name,country,order_currency FROM jos_vm_order_user_info,jos_vm_orders,jos_vm_order_status WHERE jos_vm_orders.order_id = '2868' AND jos_vm_orders.user_id = jos_vm_order_user_info.user_id AND jos_vm_orders.order_id = jos_vm_order_user_info.order_id AND order_status = order_status_code
2011-08-25 02:54:48 - JDatabaseMySQL::query - !!!! ERROR !!!! 2006 - MySQL server has gone away SQL=SELECT first_name,last_name,user_email,order_status_name,country,order_currency FROM jos_vm_order_user_info,jos_vm_orders,jos_vm_order_status WHERE jos_vm_orders.order_id = '2868' AND jos_vm_orders.user_id = jos_vm_order_user_info.user_id AND jos_vm_orders.order_id = jos_vm_order_user_info.order_id AND order_status = order_status_code