Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   AMFPHP NetConnection.Call.Failed (http://www.flasher.ru/forum/showthread.php?t=157293)

Arigama 03.06.2011 11:50

AMFPHP NetConnection.Call.Failed
 
Используем связку AS3 и AMFPHP с LAMP сервером.

На двух разных nix серверах с разной конфигурацией (апач, nginx и разные версии php) периодически возникает следующая ошибка:
AMFGateway: Net status: (Object)#0
code = "NetConnection.Call.Failed"
description = "HTTP: Failed" (и всё, никакого кода ошибки)
details = "http://.../server/gateway.php"

На одном сервере нагрузка постоянная, на другом (dev) очень низкая.

Проблема проявляется в разных браузерах (Опера, Хром в меньшей степени, Firefox), не зависимо от скорости интернета. Возникает не стабильно, то есть то нету. На своем компьютере могу воспроизвести просто открыв игру в Опере. На других Опера не гарантирует возникновение ошибки.

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

wvxvw 03.06.2011 12:29

Включите все ошибки, и, очень важно, предупреждения. Было когда-то что-то похожее изза того, что где-то в AMFPHP делался foreach на пустом массиве. За это летело предупреждение, ну и соответственно, оно летело в аутпут, и на этом вся сериализация заканчивалась. Ну а кроме этого вариантов может быть сколько угодно... например, соединение с базой не произошло, заняло много времени и сервер решил не ждать ответа, любая необработанная ошибка в PHP по-сути может в это вылиться, если она привела к тому, что AMF сервер что-то не то записал в аутпут. Элементарно кто-то где-то поставил echo 'foo'. И если эта строчка выполняется, то ответ уже не прийдет.

Arigama 03.06.2011 13:11

Спасибо, попробуем!

Сейчас вместо gateway.php подставить обычный скрипт с echo.
На прямую из оперы открывается без проблем, всегда четко независимо от частоты запросов.
Но из флеша запросы валятся периодически также, ответа тупо нет (вообще).
Создается впечатление что ошибка всё-таки на клиенте и запросы до сервера просто не доходят. Либо в амфхпхп есть хитрый параметр таймаута отправки запроса...

Добавлено через 16 минут
Проверил access.log - похоже при ошибке запрос просто не доходит до сервера =(
То есть проблема 99% на клиенте. И запрос 1 единственный проходит, точнее не проходит...

Добавлено через 7 часов 7 минут
В общем сделали голое совершенно приложение со следующим содержанием:
Код AS3:

package {
        import flash.display.Graphics;
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.events.NetStatusEvent;
        import flash.net.NetConnection;
        import flash.net.Responder;
        import flash.text.TextField;
 
        /**
        * ...
        * @author Gene Pavlovsky
        */

        public class Main extends Sprite {
                private var btnLogin:MovieClip;
                private var txtResponse:TextField;
 
                private var connection:NetConnection;
                private var responder:Responder;
                private var responder2:Responder;
 
                public function Main():void {
                        if (this.stage)
                                this.init();
                        else
                                this.addEventListener(Event.ADDED_TO_STAGE, this.init);
                }
 
                private function init(e:Event = null):void {
                        this.removeEventListener(Event.ADDED_TO_STAGE, this.init);
 
                        this.btnLogin = new MovieClip();
                        this.btnLogin.buttonMode = true;
                        var g:Graphics = this.btnLogin.graphics;
                        g.beginFill(0xff0000);
                        g.moveTo(0, 0);
                        g.lineTo(100, 0);
                        g.lineTo(100, 20);
                        g.lineTo(0, 20);
                        g.lineTo(0, 0);
                        g.endFill();
                        this.addChild(this.btnLogin);
 
                        this.txtResponse = new TextField();
                        this.txtResponse.multiline = true;
                        this.txtResponse.width = 400;
                        this.txtResponse.height = 600;
                        this.txtResponse.y = 30;
                        this.addChild(this.txtResponse);
 
                        this.btnLogin.addEventListener(MouseEvent.CLICK, onLoginClick);
 
                        this.responder = new Responder(onResult, onFault);
                        this.connection = new NetConnection();
                        this.connection.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
                        this.connection.connect('http://dev.arigama.ru/test/test.php');
                        this.onLoginClick();
                }
 
                private function onNetStatus(e:NetStatusEvent):void {
                        this.txtResponse.appendText('\nNet status:' +
                                '\ncode=' + e.info.code +
                                '\nlevel=' + e.info.level);
                        this.txtResponse.scrollV = this.txtResponse.maxScrollV;
                }
 
                public function onLoginClick(e:MouseEvent = null):void {
                        this.txtResponse.appendText('\nlogin() ');
                        this.txtResponse.scrollV = this.txtResponse.maxScrollV;
                        this.connection.call('AuthService.login', this.responder, 'user', 'pass');
                }
 
                private function onResult(result:Object):void {
                        var message:String = 'success';
                        this.txtResponse.appendText(message);
                        this.txtResponse.scrollV = this.txtResponse.maxScrollV;
                }
 
                private function onFault(status:Object):void {
                        var message:String = ('description' in status) ? status.description : status.toString();
                        this.txtResponse.appendText('\nFault: ' + message);
                        this.txtResponse.scrollV = this.txtResponse.maxScrollV;
                }
        }
}

При многократном клике 1 из 20 запросов в среднем выдает Failed в Опере (на остальные - BadVersion, это норм тк подключение идет не к amfphp). Первый запрос проходит как правило нормально (бывает и фейлится, но очень редко).
Протестить можно тут http://dev.arigama.ru/test/test.swf, кликая на красную кнопку (но ошибка есть не на всех компах). Обычно будет выдавать BadVersion и иногда Failed.

Есть идеи как это вылечить и в чем может быть дело?

Добавлено через 19 часов 34 минуты
$100 на кошелек - тому, кто поможет решить проблему ;)

Добавлено через 67 часов 30 минут
Неужели никто не сталкивался с подобным? (

Arigama 10.06.2011 09:41

Разобрались. Всё дело в антивирусах.


Часовой пояс GMT +4, время: 06:19.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.