Форум программистов, компьютерный форум, киберфорум
PHP: сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873

Не падающий сервер

14.01.2015, 14:40. Показов 4813. Ответов 84
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собираюсь писать сервер, который должен выдерживать ~100 запросов в секунду
Каждый запрос будет обращаться к бд раза 3-4, писать в файл и отдавать небольшой(пару строк) ответ.
Писал однажды маленький чатик по технологии comet, когда скрипт висел в памяти, пока в бд не произойдет изменение. И получалось, если больше 2 человек пользовались этим чатом, то сайт падал.
Он у меня был на бесплатном хосте radyx, но меня все равно это насторожило.
Прошу объяснить технологию, как написать не падающий сервер.

И несколько вопросов
Возможно ли хранить массив в памяти, который будет доступен каждый раз, при выполнении скрипта? Что бы уменьшить количество обращений в бд.
Какие примерно нужны параметры у хостинга, под мои запросы? и сколько такой хостинг может стоить? обращаться к серверу будут только из СПб. Есть ли смысл искать хостинг, расположенный в СПб, чтобы ускорить процесс доступа?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.01.2015, 14:40
Ответы с готовыми решениями:

падающий снег
помогите мне нарисовать в делфи падающий снег.я не особо шарю в делфи т.к. юзаю си.кто может помогите.заранее спасибо.

Падающий снег
Помогите нарисовать падающий снег . У меня на форме нарисованый домик, ёлка.... нада только падающий снег.... я пробовал нарисовать...

падающий мяч
допустим бросили мячь с высоты 100пикселей написать задачу используя формулы S=v*t, H =100-9.81* t * t/2 после падения мячь должен...

84
Native x86
Эксперт Hardware
 Аватар для quwy
6857 / 3790 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
15.01.2015, 20:05
Студворк — интернет-сервис помощи студентам
root, так это обычный биндинг к системной разделяемой памяти. Живет до завершения последнего использующего ее процесса, что в случае того же CGI просто неизбежно.
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
15.01.2015, 20:29
Цитата Сообщение от quwy Посмотреть сообщение
Но если php работает как CGI
а какая разница как он запущен?

Я чего то не знаю
Цитата Сообщение от root Посмотреть сообщение
а зачем искать виндовые решения?
ну я не искал, я когда писал статью для примера лонг пулинг чатика, делал под виндовсом, и оно работало, просто вспомнил, и решил проверить, оно работает, вот и запостил, может кому пригодиться

Цитата Сообщение от quwy Посмотреть сообщение
Существует, кто ж спорит. Но между разными запросами ее поюзать в общем случае невозможно.
Ну так можно пример, когда её не возможно поюзать? даже на фри хостинге работало...
0
Заблокирован
15.01.2015, 20:40
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
а какая разница как он запущен?
, думаю что разница есть. если запуск php-скрипта идет как cgi скрипта, то пых сразу становится бестолковой тормознутейшей прослойкой в приложении.. т.е. вопрос может быть спокойно перенесен из раздела php в раздел любого приличного ЯП...
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
15.01.2015, 20:50
Цитата Сообщение от root Посмотреть сообщение
если запуск php-скрипта идет как cgi скрипта, то пых сразу становится бестолковой тормознутейшей прослойкой в приложении
я не думаю что это как то повлияет на работу функций shmop
0
Заблокирован
15.01.2015, 20:55
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
я не думаю что это как то повлияет на работу функций shmop
конечно, на логику приложения не повлияет. А на быстродействие может. И настолько сильно, что надобность использования php может начать вызывать вопросы. конечно это уже вопрос проектирования.. щас меня в тролинге обвинят.. и поделом потому что от темы я пытался всех увести
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
15.01.2015, 20:58
Цитата Сообщение от root Посмотреть сообщение
на логику приложения не повлияет. А на быстродействие может
ну так а разговор и был про то, можно или нельзя, а не про то на сколько это быстро
то что не быстро, это уже отдельный спор)) я на пхп не стал бы такого делать и вообще никакой сервер не стал бы делать на пхп
1
15.01.2015, 21:39

Не по теме:

Интересно, есть вариант убедить quwy что не нужно запускать (не cgi, ни fast_cgi) php от веб-сервера, если пишешь свой сервер?

Тупо в крон по правилу @reboot запускать, а еще лучше через supervisord...

0
Native x86
Эксперт Hardware
 Аватар для quwy
6857 / 3790 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
16.01.2015, 13:19
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
я не думаю что это как то повлияет на работу функций shmop
На логику не повлияет. Но при работе в качестве CGI, весть процесс интерпретатора запускается по запросу пользователя и завершается после обработки. То есть клиент запрашивает страницу, сервер запускает процесс php, процесс отрабатывает, завершается, результат его работы отправляется клиенту. И так каждый раз.

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

И да, используется этот режим не так редко, как многие думают.
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
16.01.2015, 13:27
Если рассуждать так как Вы, то я могу сказать, что если написать на нод.жс - не на каждом бесплатном хостинге оно заработает, или если написать на пхп, то может пхп интерпретатора то и нет на сервере, опять же не заработает.

Не по теме:

А самое важное, что если в омлет не добавить яйца, то это будет не омлет :)

0
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
16.01.2015, 13:39  [ТС]
Сейчас приведу код, который написал в том чатике. Прошу объяснить, в чем моя ошибка.

Сначала клиент.
Привожу основные 3 функции.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
function getXmlHttp(){
  var xmlhttp;
  try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
      xmlhttp = false;
    }
  }
  if (!xmlhttp && typeof XMLHttpRequest!="undefined") {
    xmlhttp = new XMLHttpRequest();
  }
  return xmlhttp;
}
function send(f){
   var req=getXmlHttp(); 
   var param = "n="+f+"&text="+document.getElementById("text").value+"&name="+document.getElementById("user_Name").value;
   req.open("POST", "../../uses/php/msgAdd.php", true);
   req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   req.onreadystatechange = function() { 
        if (req.readyState==4 && req.status==200) {
            alert("Сообщение добавлено");
        }
   }      
 
    req.send(encodeURI(param)); 
    document.getElementById("text").value="";   
  }
 
function refresh(f) {
      var req=getXmlHttp();
      var param = "pass="+f+"&count="+document.getElementById("msg_all").value;
      req.open("POST", "uses/php/msgUpload.php", true);
      req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      req.timeout = 360000;
    //  req.ontimeout = alert("6 минут никто не пишет. Обновление отключено");
      req.onreadystatechange = function() { 
           if (req.readyState==4 && req.status==200) {  
               msg = JSON.parse(req.responseText);
               //обрабатываю то, что пришло
               setTimeout("document.getElementById(s).click();", 500);    // тыкаю на кнопку обновления, что бы опять повесить запрос на сервере
               
              
           }
      }   
      req.send(encodeURI(param));
  }
Теперь сервер.
msgAdd.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
$link = mysql_connect('***', '***','***') or die(mysql_error());
mysql_select_db('***') or die(mysql_error());
 
/*--------Готовим текст для записи-----------
--------------------------------------------*/
 
$n=iconv('UTF-8', 'windows-1251',$_POST['n']);
$name=iconv('UTF-8', 'windows-1251',$_POST['name']);
$text=iconv('UTF-8', 'windows-1251',$_POST['text']);
strip_tags($n);
strip_tags($name);
strip_tags($text,  "<br><img>");
 
if (empty($text)) exit;
if (empty($name)==true) $name="Аноним";
$text=str_replace("\n",'<br>',$text);
 
/*--------Работаем с базой данных-----------
--------------------------------------------*/
$req="CREATE TABLE IF NOT EXISTS `".$n."` (
     `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
     `name` TINYTEXT NOT NULL ,
     `text` LONGTEXT NOT NULL ,
     PRIMARY KEY  (`id`) 
     ) ENGINE = MYISAM CHARACTER SET cp1251 COLLATE cp1251_bin;";
mysql_query($req);
 
   
mysql_query("INSERT INTO `".$n."` SET `name`='".$name."', `text`='".$text."'");
 
mysql_close($link)
?>
msgUpload.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
// number of second the script allowed to run. setting to 30 minutes
$limit = 900;
$time = time();
set_time_limit($limit+3);
 
$link = mysql_connect('***', '***','***') or die(mysql_error());
mysql_select_db('***') or die(mysql_error());
 
$n=iconv('UTF-8', 'windows-1251',$_POST['pass']);
$coun=iconv('UTF-8', 'windows-1251',$_POST['count']);
// цикл, проверяющий сообщения каждые 3 секунды
while (time()-$time<$limit) {
    // checking if something new was added to my test tabl
 
    $resu = mysql_query("SELECT `name`, `text` FROM `".$n."` WHERE `id` > '".$coun."'",$link);
    $kolvo=mysql_num_rows($resu);
    $jArr=array(); 
      
   // if ($kolvo==$coun || $kolvo==0) {
    if ( $kolvo==0) {
         // если данных нет,ждем 3 секунды
         sleep(3);
         continue;
    } else { 
         $jArr['v']=$kolvo;
         $cc=0;  
         while($row = mysql_fetch_assoc($resu)) {
               $jArr['msg'][$cc]['name']=iconv('windows-1251', 'utf-8',$row['name']);
               $jArr['msg'][$cc]['text']=iconv('windows-1251', 'utf-8',$row['text']);
               $user_exists = mysql_result(
               mysql_query("SELECT count(1) FROM `".$n."_statys` WHERE `name`='{$row['name']}'"),0);
               if ($user_exists!=0) {
               $jArr['msg'][$cc]['s']=1;
               } else  {
               $jArr['msg'][$cc]['s']=0;
               }
 
             $cc++;
         }
         $jArr['cc']=$cc;
          
           // выбрасываем все данные и выходим,чтоб клиент мог их обработать
           echo json_encode($jArr);
           flush();
           mysql_close($link);
           exit;           
      }  
}
 
 
?>
0
16.01.2015, 13:41

Не по теме:

Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
Если рассуждать так как Вы, то я могу сказать, что если написать на нод.жс - не на каждом бесплатном хостинге оно заработает, или если написать на пхп, то может пхп интерпретатора то и нет на сервере, опять же не заработает.
Именно поэтому я изначально и написал про общий случай. И, повторю, этот режим не так уж и редок.

0
F́́́́́́́ŕ́́́́́́́é́́́ ́ak
 Аватар для Tatikoma
260 / 224 / 109
Регистрация: 07.07.2014
Сообщений: 965
16.01.2015, 13:42
quwy, поздравляю, вы ничего не знаете еще и про разделяемую память в *nix (потому что вы всего лишь форумный тролль).

PHP
1
2
3
4
5
6
7
8
9
10
<?php
$shmid = shmop_open(0x0002, "c", 0644, 3);
$result = shmop_read($shmid, 0, 3);
if($result == "\x00\x00\x00"){
        shmop_write($shmid, "abc", 0);
        print "Memory written\n";
}
else{
        print "Memory read: $result\n";
}
По вашей логике, - если выполнить этот скрипт несколько раз из консоли, то мы получим каждый раз "Memory written", т.к. память очищается. Только вот никто не очищает разделяемую память, поэтому второй запуск приведет к выводу на экран записанной в первом запуске информации. И оно будет её выводить до тех пор, пока вы её принудительно не очистите или не перезагрузите компьютер.
0
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
16.01.2015, 13:44  [ТС]
вообще, изначально хотела написать сервер на java, но не смог найти подходящий vps по приемлемой цене
может быть вы сможете подсказать такой vps?
вообще, на java было бы для меня идеально
0
F́́́́́́́ŕ́́́́́́́é́́́ ́ak
 Аватар для Tatikoma
260 / 224 / 109
Регистрация: 07.07.2014
Сообщений: 965
16.01.2015, 13:44
spydark91, VPS будет стоить одинаково, вне зависимости от того, на каком языке вы будете писать код. Пишите на Java, это хорошая идея.
0
Native x86
Эксперт Hardware
 Аватар для quwy
6857 / 3790 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
16.01.2015, 13:47
Цитата Сообщение от spydark91 Посмотреть сообщение
вообще, изначально хотела написать сервер на java, но не смог найти подходящий vps по приемлемой цене
Жаба и VPS довольно плохо совместимы. Жабка к памяти дюже охоча, а на VPS с этим как правило хуже чем с чем-либо другим.

Цитата Сообщение от spydark91 Посмотреть сообщение
может быть вы сможете подсказать такой vps?
Ищите с максимальным объемом RAM в пределах своего бюджета.
0
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
16.01.2015, 13:54  [ТС]
Как думаете, этого достаточно?
На сколько я знаю, а знаю я мало, на vpn надо будет ставить jvm? Надо чтобы данный vpn это разрешал. Или как это вообще происходит?
Миниатюры
Не падающий сервер  
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
16.01.2015, 13:55
Собственно я поясню к чему этоquwy, c 2003 года занимаюсь пхп, ни разу не видел
Спор пошел потому что вы написали просто
Цитата Сообщение от quwy Посмотреть сообщение
Нельзя.
И можно было бы не спорить, если бы в 99% случаев это было бы так, но на сколько мне нужно была шаред мем, так в 100% случаях она работала

Ну даже если как цги, чатик как сделан? память нужна только для 1го действия, сообщить всем юзерам которые висят в ожидании, что пришло новое сообщение.
То есть пхп скрипты для них запущены. А по Вашим словам если хоть 1 запущен, то память не очиститься
Так что для чатика этот способ будет работать.

Что же касается кода чатика, там не весь код, и по этому сложно разобраться в том коде, что там может падать.
Например что в msg_all ? Где идёт обновление после получения новых сообщений?
Но глядя на точ то там просто каждые 3 секнуды поверка бд я бы всё равно так не делал.
Чуть выше на странице я показал пример как раз такого чатика как вы хотели, но с разделяемой памятью и без лишних запросов к бд. Там просто набросок, показывающий общий принцип что нужно, можете доработать под себя

Вообщем после всех обсуждений, я склоняюсь к написанию чатиков на node.js ну или как вариант python(tornado от фейсбука)
0
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
16.01.2015, 14:00  [ТС]
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
Где идёт обновление после получения новых сообщений?
в js функции refresh()
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
Чуть выше на странице я показал пример как раз такого чатика как вы хотели
Просто хочется понять свои ошибки

Добавлено через 40 секунд
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
Например что в msg_all ?
сколько всего сообщений загружено
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
16.01.2015, 14:02
Цитата Сообщение от spydark91 Посмотреть сообщение
сервер на java
имхо не самый удачный выбор.
Цитата Сообщение от quwy Посмотреть сообщение
vps по приемлемой цене
http://fastvps.ru/vds/ 3 евро не так и много
но если хотите яву, то я не знаю сколько ресурсов нужно
на нод жс том де + сокет ио минимум кода, минимум затрат времени и вам отличная кросбраузерность и скорость работы, к тому же движок нод жс от гугла, оч бытсрый, и мало жрёт ресурсов, для впс отличное решение
0
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
16.01.2015, 14:04  [ТС]
там только то, что отвечает за добавление и загрузку сообщений. Это, по сути, основной код.

Добавлено через 34 секунды
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
имхо не самый удачный выбор.
а почему нет?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.01.2015, 14:04
Помогаю со студенческими работами здесь

Падающий снег
Здравствуйте! При загрузке скрипта снежинки появляются по высоте окна браузера, потом летят до конца страницы. Хочу переделать, чтобы...

Падающий снег
Подскажите, пожалуйста, где я ошиблась. На форме программе должен отображаться падающий снег, как на рисунке. Почему-то у меня вообще...

Падающий текст
Добрый день! Как сделать падающий текст и изменение его скорости по нажатию на стрелку? Движение и позиция текста: void...

падающий квадрат
Помогите сделать падающий квадрат ) самый простой InitializeComponent(); public struct Size for (i = 0; i...

Падающий снег
Делаю падающий снег поверх картины. Как сделать так, что бы снежинки не оставляли за собой след?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru