За последние 24 часа нас посетили 18666 программистов и 1599 роботов. Сейчас ищут 974 программиста ...

Один сайт на нескольких серверах.

Тема в разделе "Прочие вопросы по PHP", создана пользователем Fel1ks, 4 мар 2010.

  1. Fel1ks

    Fel1ks Активный пользователь

    С нами с:
    24 фев 2010
    Сообщения:
    33
    Симпатии:
    0
    Всем добрый вечер! Недавно столкнулся с такой проблемой.
    Я работаю с MS SQL сервером, не все хостинги поддерживают его,
    поэтому приходится изобретать велосипед. Я с формы, которая находится на хостинге
    отправляю запрос на веб сервер, который находится непосредственно там же, где и MS SQL.

    У меня есть форма, допустим она выглядит так(находится на хостинге):
    HTML:
    1. <form id="form1" name="form1" method="post" action="http://удалённый сервер/script.php">
    2.   <p>
    3.     Логин:
    4.     <input type="text" name="login" />
    5. </p>
    6.   <p>
    7.     Пароль:
    8.     <input type="text" name="password" />
    9. </p>
    10.   <p>
    11.     Подтверждение пароля:
    12.     <input type="text" name="password2" />
    13.   </p>
    14.   <p>
    15.     E-mail:
    16.     <input type="text" name="email" />
    17.   </p>
    18.   <p>
    19.     <input type="submit" name="Submit" value="Отправить!" />
    20.   </p>
    21. </form>
    Вот код script.php(находится на удалённом сервере):
    PHP:
    1. <?php
    2. mssql_connect("localhost", "логин", "пароль") or die ("Error!");
    3. mssql_select_db("db") or die ("Error!");
    4. // Тут идёт куча проверок перменных $_POST[...]
    5. // Потом проверки на оригинальность отправленных запросов.
    6. // Далее идёт запрос INSERT или SELECT в зависмости от того, что нам нужно
    7. $sql = mssql_query("INSERT INTO table (field1, field2....) VALUES ('$_POST['login'] .....)");
    8. // потом идёт допустим проверка $sql
    9. if($sql) {
    10. $result = "Запись успешно добавлена в SQL";
    11. }else{
    12. $result = "Ошибка!";
    13. }
    14. // Потом ключевой момент нам нужно отправить результат обратно на хостинг.
    15. // Я делаю это так:
    16. Header("Location: http://хостинг.ру/?result=$result"); // В этой строчке мы отправляем результат запроса на
    17.                                                                                // хостинг методом GET. Переменную $result отправляем.
    18. ?>
    Вопрос в следующем: Если мы в заголовке отправляем короткий результат, например: "Запись успешно добавлена...", то этот метод вполне подходит. Но если мы делаем не INSERT, а SELECT и в результате нам нужно отправить огромный кучок html кода, полученный например с помощью while(), то тут возникают проблемы, так как GET имеет ограничение на кол-во символов и отсекает html теги.

    Может быть есть какой-нибудь альтернативный способ?
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Ты не так сделай, если у тебя два сервера - на более мощном размести статику и скрипты, а на другом - БД. А то щас у тебя на одном только статика, а на другом - скрипты и БД.
    Т.е. делай mssql_connect(ip_сервера_бд...
     
  3. Fel1ks

    Fel1ks Активный пользователь

    С нами с:
    24 фев 2010
    Сообщения:
    33
    Симпатии:
    0
    В том то и дело, что мне нужно статику оставить там где она есть, т.е. на хостинге, желательно и скрипты конечно туда запихнуть, но это невозможно, т.к. хостинг это не поддерживает. Нужен альтернативный способ передачи большого кол-ва информации с сервера MS SQL на хостинг.
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Погоди-погоди, хостинг не поддерживает php? А CGI какие поддерживает?
     
  5. Fel1ks

    Fel1ks Активный пользователь

    С нами с:
    24 фев 2010
    Сообщения:
    33
    Симпатии:
    0
    PHP он поддерживает, но он не поддерживает подключение с Microsoft SQL Server.
    Т.е. Он при использовании функции mssql_connect, пишет, что такая функция не найдена. Нужны соответствующие модули, но хостеры на эту тему даже разговаривать не хотят.
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Ммм, тогда лучше всего делать так:
    1. Скрипт с хостинга делает запрос скрипта на втором сервере, с помошью cURL, передавая данные методом POST
    2. Скрипт на втором сервере разбирает запрос, выполняет, и получает результат в массив. Потом сериализует массив с результатом запроса (serialize или json_encode, первый вариант должен работать быстрее) и выводит результат (echo).
    3. Скрипт на хостинге забирает этот результат (опять же с помощью cURL, все в пределах одного соединения), десериализирует и таким образом получает исходный массив с результатом :)
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Но следует учесть, что тут на производительность будет сильно влиять качество соединения между хостингом и сервером с MS SQL. И хотя сервер БД кеширует результаты идущих подряд одинаковых запросов, толку от этого будет немного, т.к. намного больше времени уйдет на общение между серверами. Может быть, лучше поискать хостинг с MS SQL.
     
  8. Fel1ks

    Fel1ks Активный пользователь

    С нами с:
    24 фев 2010
    Сообщения:
    33
    Симпатии:
    0
    Так, теперь по порядку.
    1-й пункт это я так понимаю моя форма на хостинге.
    2-й пункт не совсем понятен. Выполняем запрос, результат запихиваем в массив, допустим:
    PHP:
    1. <?php
    2. // Выполняем запрос, далее выводим его
    3. if(mssql_num_rows($sq)>0) {
    4. while($field=mssql_fetch_array($sql)) {
    5. echo $field['field1']."<br />";
    6. }
    7. }else{
    8. echo "В базе ничего не найдено!";
    9. }
    10. ?>
    И вот дальше мне не совсем понятно, что нужно делать и как использовать выше представленные функции.

    Нсчёт 3-го пункта тоже не понятно, как форма может забрать полученный результат?
     
  9. Fel1ks

    Fel1ks Активный пользователь

    С нами с:
    24 фев 2010
    Сообщения:
    33
    Симпатии:
    0
    Мне производительность не так Важна гигабайтов информации там всё равно не будет, речь идёт о передаче 2-3 Кб информации.
     
  10. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    тупой вопрос: а что мешает на том сервере, где стоит MS SQL держать и сам сайт? веб-сервер там есть, php, видимо тоже. Зачем эти танцы с бубнами?

    и тупой вопрос №2: а что, держать 2 сервака дешевле, чем 1 нормальный с нужными настройками?
     
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    А - сервер хостинга, Б - сервер с mysql.
    action у формы - http://A/script.php.
    script.php:
    PHP:
    1. <?php
    2. if (isset($_POST['form']))
    3. {
    4.      $ch = curl_init('http://'.Б.'/dbscript.php');
    5.      /*
    6.             Передача POST-запрса - не помню функции cURL ))
    7.      */
    8.       $result = unserialize(curl_exec());
    9.      echo 'Ваш id '.$result['id']; // :-)
    10. }
    dbscript.php:
    PHP:
    1.  
    2. <?php
    3. if (isset($_POST['login']))
    4. {
    5.      mssql_connect(...);
    6.      $res = mssql_query('SELECT `id` FROM `users` WHERE `login`="'.$_POST['login'].'"');
    7.      echo serialize(mssql_fetch_array($res));
    8. }
    9.  
     
  12. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    интересно, если я предложу слать запросы на сервер с БД тем же постом, контролировать откуда запросы пришли и отдавать в ответ нормальный xml, то меня ногами не запинают? :D

    а вообще, вышезаданные вопросы ещё в силе.
    зы. третий вопрос. если так дорога система из двух серверов, то почему бы не поискать такие, где можно нормально организовать запросы к удалённой базе?
     
  13. Fel1ks

    Fel1ks Активный пользователь

    С нами с:
    24 фев 2010
    Сообщения:
    33
    Симпатии:
    0
    Я бы так и сделал и не парился бы, но мне нужно сделать именно так, как я описал. Причин много, одна из них: "начальство".
     
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    А чем сериализация хуже?
     
  15. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    в таком применении практически ни чем :)

    а вообще, можно нехилую систему кэширования запросов замутить… хотя, пофиг. Начальство же.
     
  16. Fel1ks

    Fel1ks Активный пользователь

    С нами с:
    24 фев 2010
    Сообщения:
    33
    Симпатии:
    0
    Сериализация работает именно так как нужно. Есть правда небольшая потеря в производительности, но не критично. При результате в 700 строк из БД, весь процесс длиться около 2-х секнду - это приемлимо.

    Спасибо за помощь такой способ пока подходит. Если возникнет проблема в производительности, буду продолжать танцевать с бубнами над кешеированием запросов).
     
  17. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    кстати, на тему сериализации

    так что аккуратней там с приёмом-отправкой :)
     
  18. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Зато - это быстрее разбора xml и json! :p