Возможные условия гонки PHP / Javascript - PullRequest
0 голосов
/ 08 февраля 2012

Я относительно новичок в веб-программировании. Я новичок в Javascript, PHP, Ajax и т. Д. Я уже некоторое время ищу в Google простое решение этой проблемы, но уже отказался. Я полагаю, что происходит состояние гонки, но все, что связано с условиями гонки и PHP и Javascript, похоже, имеет индивидуальное решение.

Вот настройки: У меня есть страница PHP, которая выводит таблицу. В одной из строк в одной из таблиц я заполняю ячейку дополнительной таблицей. Он имеет 5 ячеек, и я хотел бы изменить цвета ячеек, чтобы они отражали уровень сигнала Wi-Fi-карт на машине (в настоящее время есть только две карты). Поэтому после того, как таблица заполнена и идентификаторы ячеек установлены, я вызываю функцию javascript, которая отправляет другой фрагмент кода PHP в cat / proc / net / wireless, анализирует и возвращает уровень сигнала карты, которую я назвал .

Проблема: Javascript и PHP-код, который анализирует беспроводные карты, получает идентификаторы сот и устанавливает цвета, отлично работает для одной карты. Однако, когда я вызываю функцию Javascript из тега в PHP, только последний вызов делает что-либо. Первый, похоже, ничего не делает.

Я полностью озадачен и исчерпал все мои условия поиска Google ...

PHP код:

<code><?php include('assets/header.inc.php'); ?>
<script type="text/javascript" src="<?php echo _JS_?>/ajax_home_display.js"></script>
<div id="cm_body" onload="return false">
    <?php
        $ap_intf = rtrim(shell_exec("cat /tmp/config | grep AP_DEV | cut -d'=' -f2"));
        $mesh_intf = rtrim(shell_exec("cat /tmp/config | grep MESH_DEV | cut -d'=' -f2"));
        $uptime = rtrim(shell_exec("uptime | awk '{print $3}' | cut -d',' -f1"));

    function display_status_intf($intf, $name) 
    {   
        global $uptime;
        $packet_success = "100%";

        echo "
        <tr>
        <td style=\"font-size:14px; font-weight:bold;\"><pre>$intf [$name]
$uptime
 $ packet_success 
update_interface ( '$ INTF') «; } // Сделать таблицу echo "
Интерфейс Состояние сигнала Время безотказной работы Успешность пакета
"; ?> <? php include ('assets / footer.inc.php'); ?>

Javascript код:

    THRESH1 = -60;
    THRESH2 = -55;
    THRESH3 = -50;
    THRESH4 = -45;

    function update_interface(intf)
    {
        xmlhttpPost("run_interface_status.php","intf="+intf,interface_stat_response);
    }

    function interface_stat_response(strQuery,strResponse)
    {
        var sig_st = [];

        // Trim response
        var test_return = strResponse;
        var intface = strQuery.split("=");
        var intf = intface[1];

        // Get cell ID's, put in an array sig_st
        for (i=1;i<=5;i++)
             sig_st[i] = document.getElementById("sig_st_"+i+"_"+intf);
        // Reset all colors to default
        for (i=1;i<=2;i++)
            sig_st[i].setAttribute("style", "background-color:transparent");

        if (test_return != "err") {
            // Set all colors based on the wifi strength
            sig_st[1].setAttribute("style", "background-color:red");

            if (test_return > THRESH1)
                sig_st[2].setAttribute("style", "background-color:orange");
            if (test_return > THRESH2)
                sig_st[3].setAttribute("style", "background-color:yellow");
            if (test_return > THRESH3)
                sig_st[4].setAttribute("style", "background-color:green");
            if (test_return > THRESH4)
                sig_st[5].setAttribute("style", "background-color:green");
        }
    }

Тяжелый подъем Ajax (если это имеет значение)

    function xmlhttpPost(strURL,strQuery,responseFunc)
    {
        var xmlHttpReq = false;
        var self = this;
        // Mozilla/Safari
        if (window.XMLHttpRequest) {
            self.xmlHttpReq = new XMLHttpRequest();
        }
        // IE
        else if (window.ActiveXObject) {
            self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
        }
        self.xmlHttpReq.open('POST', strURL, true);
        self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        self.xmlHttpReq.onreadystatechange = function() {
            if (self.xmlHttpReq.readyState == 4) {
                responseFunc(strQuery,self.xmlHttpReq.responseText);
            }
        }
        self.xmlHttpReq.send(strQuery);
    }

    function trim(s)
    {
        s = s.replace(/(^\s*)|(\s*$)/gi,"");
        s = s.replace(/[ ]{2,}/gi," ");
        s = s.replace(/\n /,"\n");
        return s;
    }

Некоторая дополнительная информация: я считаю, что это условие гонки, поскольку Firebug показывает, что были запущены два сообщения, каждое из которых возвращает правильные значения, но когда я ставлю точку останова в начале функции ответа (interface_stat_response ()), Firebug падает только один раз с последними переменными $ intf и $ сила (вещи wifi1).

Также были бы хороши любые общие указатели. Я знаю, что код не очень красивый, но я хочу поправиться: 3

Ответы [ 2 ]

0 голосов
/ 08 февраля 2012

Я вижу, вы не используете jquery .В Jquery есть прекрасный метод .live () , который позволяет вам легче обновлять вещи.Причина, по которой я это упоминаю, заключается в том, что я вижу:

document.getElementById("sig_st_"+i+"_"+intf)

, что является просто плохой практикой.Используйте css классы , чтобы определить ваши различные настройки и подключить их на основе другого значения.

Я предполагаю, что вы правы относительно состояния гонки.У меня нет возможности проверить ваш код в данный момент.Если вы хотите делать что-то без jquery, вам нужно будет убедиться, что ваш js ждет завершения загрузки php.Если вы действительно хотите делать что-то таким образом, что, на мой взгляд, является худшим способом сделать это, вам понадобится цикл while.Проверьте наличие элементов в цикле while до тех пор, пока они не существуют, затем обойдите все вокруг и установите вещи.

Если вы поменяете это местами для класса, а не раскрашиваете по ID, ваш результат будет намного проще и намногоSmooth.

** не собирался публиковать это, но люди попросили разъяснений

0 голосов
/ 08 февраля 2012

После просмотра всего, лучшее, что я могу предложить, это ...

Попробуйте заменить тяжелый груз AJAX методом jQuery post http://api.jquery.com/jQuery.post/

Это потребует jQuery, но должнодостаточно просто попробовать, и это может исправить это.

jQuery - очень полезный инструмент для работы с AJAX / JS в целом.

Если проблема в тяжелом подъёме AJAX, это следует исправить.

...