Если вам нужна легкая альтернатива Tornado, я бы предложил порождение . Он очень хорош при перезагрузке кода и, кажется, имеет хорошую производительность - хотя, конечно, лучше всего попробовать это самостоятельно.
Я также рекомендовал бы supervisord, независимо от ОС, для поддержания Tornado или создания экземпляров в рабочем состоянии, а также для любых других важных сервисов.
Однако в 9 случаях из 10 узким местом является база данных, и выбор веб-сервера на самом деле не повлияет на производительность и масштабируемость сайта.
Лично я считаю, что одна из систем BSD намного превосходит дистрибутивы Linux для задач, связанных с сервером. Дайте шанс OpenBSD или, возможно, FreeBSD. Как только вы это сделаете, вы никогда не вернетесь.
$msg =
chr(0x20) // Size = 32 (4+1*28)
. chr(0x1) // Type = 1
. chr(0x0) // ReqI=0
. chr(0x1) // NumC=1
. chr(0x1) . chr(0x0) // node=1
. chr(0x2) . chr(0x0) // lap=2
. chr(0x3) // puid=3
. chr(0x5) // pos=5
. chr(0x10) // info=16
. chr(0x0) //sp3=0
. chr(0x0) . chr(0x0) . chr(0x1) . chr(0x0) // x=65536
. chr(0x0) . chr(0x0) . chr(0x2) . chr(0x0) // y=65536*2
. chr(0x0) . chr(0x0) . chr(0x3) . chr(0x0) // z=65536*3
. chr(0x0) . chr(0x20) // speed=8192
. chr(0x0) . chr(0x10) // dir=4096
. chr(0x0) . chr(0x8) // heading=2048
. chr(0x0) . chr(0x4) // AngVel=1024
;
$IS_MCI = unpack('CSize', $msg);
if ( strlen($msg) < $IS_MCI['Size'] ) {
die("not enough data");
}
$IS_MCI += unpack('CType/CReqI/CNumC', substr($msg, 1));
$IS_MCI['Info'] = array();
for($i=0; $i<$IS_MCI['NumC']; $i++) {
$data = substr($msg, 4+($i*28), 28);
$IS_MCI['Info'][] = unpack('vNode/vLap/CPLID/CPosition/CInfo/CSp3/lX/lY/lZ/vSpeed/vDirection/vHeading/sAngVel', $data);
}
print_r($IS_MCI);
Печать
Array
(
[Size] => 32
[Type] => 1
[ReqI] => 0
[NumC] => 1
[Info] => Array
(
[0] => Array
(
[Node] => 1
[Lap] => 2
[PLID] => 3
[Position] => 5
[Info] => 16
[Sp3] => 0
[X] => 65536
[Y] => 131072
[Z] => 196608
[Speed] => 8192
[Direction] => 4096
[Heading] => 2048
[AngVel] => 1024
)
)
)
Теперь этот код делает некоторые предположения, которые, возможно, не следует воспринимать как само собой разумеющиеся (т.е. добавить гораздо больше обработки ошибок/данных для чтения).
Размер
должен быть между 0... 228, NumC должен быть между 0... 8 и оба значения должны соответствовать друг другу и так далее. слова
я использовал v
, которое означает "беззнаковый короткий (всегда 16 бит, маленький порядковый номер байта ). Но для int
я использовал l
: «signed long (always 32 bit, machine byte order )». Это нормально на моей машине. Но найдите в документации протокола полноту данных. Данные теста в $ msg взяты из результата
__declspec(align(1)) struct CompCar // Car info in 28 bytes - there is an array of these in the MCI (below)
{
word Node; // current path node
word Lap; // current lap
byte PLID; // player's unique id
byte Position; // current race position : 0 = unknown, 1 = leader, etc...
byte Info; // flags and other info - see below
byte Sp3;
int X; // X map (65536 = 1 metre)
int Y; // Y map (65536 = 1 metre)
int Z; // Z alt (65536 = 1 metre)
word Speed; // speed (32768 = 100 m/s)
word Direction; // direction of car's motion : 0 = world y direction, 32768 = 180 deg
word Heading; // direction of forward axis : 0 = world y direction, 32768 = 180 deg
short AngVel; // signed, rate of change of heading : (16384 = 360 deg/s)
};
__declspec(align(1)) struct IS_MCI // Multi Car Info - if more than 8 in race then more than one of these is sent
{
byte Size; // 4 + NumC * 28
byte Type; // ISP_MCI
byte ReqI; // 0 unless this is a reply to an TINY_MCI request
byte NumC; // number of valid CompCar structs in this packet
CompCar Info[1]; // example: one element, fixed
};
int _tmain(int argc, _TCHAR* argv[])
{
struct IS_MCI mci = {
32, 1, 0, 1,
{ 1, 2, 3, 5, 16, 0, 65536, 65536*2, 65536*3, 8192, 4096, 2048, 1024 }
};
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD( 2, 2 );
int err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
return 1;
}
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
addr.sin_port = htons( 8081 );
if ( 0!=connect( s, (SOCKADDR*) &addr, sizeof(addr) ) ) {
printf("%X ", WSAGetLastError());
return 0;
}
send(s, (const char*)&mci, sizeof(mci), 0);
shutdown(s, SD_BOTH);
closesocket(s);
return 0;
}
-121--4460150- Проверьте заголовок HTTP-запроса Ссылка
ваших посетителей ( $ _ SERVER ['HTTP _ REFERER']
на ph Это, в 90% всех случаев, даст вам страницу, с которой пришел ваш посетитель. Если это страница поисковой системы, то необходимо декодировать строку запроса ссылки и анализировать данные из нее (обратите внимание, что формат последовательности запроса может измениться).
Это больше работы, чем Google Analytics, и простой пример, который я привел, не дает вам столько данных; но может быть сделано, если вы не комфортно с Google делает сбор данных для вас.
-121--1885284-Обновите свой вопрос, чтобы удалить неиспользуемые варианты. Если у него есть Python 2,4, и установка - это головная боль, просто уберите его из списка и обновите вопрос, чтобы перечислить реальных кандидатов. Перечислите только те, которые действительно соответствуют вашим требованиям. (Вы не говорите, каковы ваши требования , но минимальные модернизации представляются важными.)
Бросьте монету.
Выбор между двумя платформами, удовлетворяющими вашим требованиям (которые вы не определили), бросание монеты является абсолютным лучшим способом выбора.
Если вы не уверены, соответствует ли что-то вашим требованиям, часто полезно перечислить то, что вы цените. Пока единственное в вопросе, который вы, похоже, цените, - «никаких установок». Кроме того, я могу только догадываться, какие требования у вас на самом деле есть.
Определив набор функций, которые вы ищете, не стесняйтесь подбрасывать монету.
Обратите внимание, что все дистрибутивы Linux имеют более или менее одинаковую базу открытого исходного кода. Выбор среди них - предпочтение упаковке, поддержке и выбору предварительно интегрированных элементов существующей кодовой базы Linux. Просто бросай монету.
Выбор веб-фронтэндов полностью зависит от требуемых функций. Найдите все веб-фронтэнды, которые соответствуют вашим требованиям и подбросите монету, чтобы выбрать среди них.
Ни одно из этих решений не является решением о блокировке. Если вам не нравится дистрибутив Linux, который вы выбрали изначально, вы можете просто выбрать другой. Все они имеют одинаковый базовый номер люкс приложений и одинаковые API. Выбор является лишь вопросом предпочтения.
Вам не нравится выбранный веб-сервер? В конце mod _ wsgi
pipe все они отображаются одинаково для вашего приложения Django (плюс или минус несколько изменений конфигурации). Не нравится Лайттпд? Переключитесь на nginx или Apache - ваше приложение Django не изменится. Так что нет никакого захвата и никаких негативных последствий, чтобы сделать неоптимальный выбор.
Когда нет риска, просто бросай монету.
На месте I арендовать сервер, они сократили образы Ubuntu до минимума. Предположительно потому, что им все равно пришлось создать специальный образ с правильными драйверами и тому подобным, но я точно не знаю. Они даже удалили wget и nano. Таким образом, вы получаете всю полезную информацию, а не целую кучу «печенькорезных» ОС.
Просто говорю это, потому что я могу представить, что так делают почти везде, и поэтому эксперименты с обычной установкой Ubuntu-сервера не предоставят вам нужной информации для принятия решения.
В остальном, я согласен с остальными, что это не так уж и сложно, так что вы можете просто попробовать что-нибудь.
На стороне веб-сервера я бы посоветовал взглянуть на чероки, если еще не сделал этого. Может, это и не ваша чашка джо, но попробовать ее не причинит вреда. {{1 }} Я предпочитаю простую настройку как Ubuntu, так и Cherokee. Хотя я играю со многими вещами для развлечения, я предпочитаю это для своего бизнеса. У меня есть другие дела, кроме управления серверами, поэтому любое решение, которое помогает мне делать это быстрее, просто хорошо. Если эти проекты предназначены в основном для развлечения, то это, скорее всего, неприменимо, поскольку вы не получите много опыта с помощью этих простых-установочных-с-красивым-графическим интерфейсом и-очень-полезными-мастерами
{{1 }}