@Simple91

Как правильно отдавать данные клиенту?

Привет друзья, программисты!

Давно пилю для себя всякие мобильные приложения на phonegap. Делаю серверную часть на php, клиентскую часть на jquery+js+html. Есть скрипт на php которые подключается к бд и ищет оттуда новые данные, отдает их клиентскому скрипту в json формате.
<?php header('Access-Control-Allow-Origin: *');  // Разрешение на кроссдоменные запросы ?> 

<?php

include_once "db_connect.php"; 

$select_row = " SELECT * FROM orders WHERE order_close = '0' AND order_owner = 'all' ORDER BY id DESC ";

$result = mysqli_query($mysqli, $select_row);

foreach ($result as $row) {

$arrayOrders = array( 
	                 'id' => $row[id],
	                 'client_tel' => $row[client_tel],
	                 'type' => $row[type],
	                 'order_place' => $row[order_place],
	                 'order_cost'=>$row[order_cost]
	               );  

               $arrayOrdersjson[]=$arrayOrders;

}


echo json_encode($arrayOrdersjson);


mysqli_close($mysqli);
 ?>


На клиентской стороне, скрипт каждые 10 секунд по таймуту делает запрос на сервер.

Но, каково было мое удивление, когда я увидел другой скрипт который создает "постоянное" соединение к этому самому php скрипту.
<?
// number of second the script allowed to run. setting to 6 minutes
$limit = 360;
$time = time();

// getting last loaded value
$last_id = (int)$_GET['id'];

// just to be sure that script will be killed
set_time_limit($limit+5);

mysql_connect('localhost','user','password');
mysql_select_db('database');

function escape($str) {
    return str_replace('"','\"',$str);
}

// цикл, проверяющий новые сообщения каждые 5 секунд
while (time()-$time<$limit) {
    // checking if something new was added to my test table
    $res = mysql_query('SELECT * FROM `comet` WHERE `id`>"'.$last_id.'" ORDER BY `id` ASC');
    if (mysql_num_rows($res)) {
        while ($item=mysql_fetch_array($res)) {
            // пишем js-скрипт, который выполнится у клиента
            echo 'self.putMessage("'.$item['id'].'","'.escape($item['name']).'","'.escape($item['text']).'");';
        }
        // выбрасываем все данные и выходим, чтобы клиент смог их обработать
        flush();
        exit;
    }
    // если данных нет - ждём 5 секунд
    sleep(5);
}

mysql_close();
?>


А теперь вопрос:
Насколько каждый из способов правильный, и как лучше?
  • Вопрос задан
  • 320 просмотров
Пригласить эксперта
Ответы на вопрос 1
@LiguidCool
Правильно использовать вебсокеты.
В принципе возможны все варианты, но ваш второй сопряжен с некоторыми проблемами: во первых его прибьет апатч по таймеру, во вторых PHP желательно умирать после выполнения, в третьих на клиенте надо отслеживать разрыв и ставить новый коннект.
При прочих равных - сокеты именно для этого.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы