LINUX.ORG.RU

[глобально и надежно][ненависть] За что еще я ненавижу PHP

 


0

0

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

Есть задача. Надо, чтобы напичканная аяксом клиентская страничка моментально реагировала на события, происходящие на сервере. Иногда события бывают по пару раз в минуту, иногда по разу в день. Дергать запросы ежесекундно нельзя — неэффективно и будет тормозить, да и мусорный траффик будет ого-го. Опять-таки, дергать раз в день или по запросу — плохо, возможно, придется иметь дело с устаревшими данными.

У нормальных ребят с нормальными инструментами дело решается довольно-таки просто. Аяксом клиент делает conduit request к серверу, и тот держит соединение до тех пор, пока не придет событие. С помощью keep-alive'ов, например (или идет пересоединение после таймаута, если HTTP/1.0). Когда приходит событие, сервер отдает его и закрывает соединение. Клиентский скрипт дергает обработчики событий, но перед этим сразу же запускает следующий conduit request.

Так, например, работает Google talk в вебовском исполнении.

Но так как PHP рассчитан на модель «дернули-отдал контент-пшел вон», а persistence в нем сделан через то место, о котором вы только что не подумали, то такие вот conduit-request'ы там нереализуемы в принципе.

Это говорит о том, что как только они понадобятся, придется проект переделывать с PHP+Symfony на Python+Twisted.

Гы... Как там гласит один из основополагающих принципов — Don't Repeat Yourself, да?

★★★★★

на пыхе делается всё то же самое, ты просто не умеешь его готовить, наверное. только вот куча активных соединений - возможно это не то, чего хочешь ты.

anonymous
()
Ответ на: комментарий от marsijanin

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

Вот почему .NET sucks, кроме того, что его кроссплатформенность мнимая на самом деле, я не знаю. Честно. Потому как оно меня не касается.

shimon ★★★★★
() автор топика
Ответ на: комментарий от anonymous

> на пыхе делается всё то же самое, ты просто не умеешь его готовить, наверное. только вот куча активных соединений - возможно это не то, чего хочешь ты.

Видишь ли, на питоне это все делается в рамках одного треда и экономится куча памяти, так что количество соединений по TCP ВНЕЗАПНО перестает быть критичным...

shimon ★★★★★
() автор топика
Ответ на: комментарий от shimon

> Имею с ним дело каждый день.

Нет, это он с тобой имеет. И поэтому ты его ненавидишь, даже не пытаясь понять.

anonymous
()
Ответ на: комментарий от shimon

Чилаэк, ты бредишь. Каждое установленное соединение - это скушанные ресурсы. При чём тут рамки одного треда я вообще не понял.

anonymous
()
Ответ на: комментарий от anonymous

> Нет, это он с тобой имеет. И поэтому ты его ненавидишь, даже не пытаясь понять.

Сынок, я с ним уже пять лет как имею. Могу заявлять, что как раз понимаю.

shimon ★★★★★
() автор топика
Ответ на: комментарий от shimon

> Сынок, я с ним уже пять лет как имею. Могу заявлять, что как раз понимаю.

Папо, даже на закате своих дней ты-таки не понял главного - пых это такой же есык как и все остальные. И он делает то, что ты напрограммировал.

anonymous
()
Ответ на: комментарий от anonymous

> Чилаэк, ты бредишь. Каждое установленное соединение - это скушанные ресурсы. При чём тут рамки одного треда я вообще не понял.

При том, что с похапе:
1) да, на каждое соединение отфоркивается тяжеловес апач, отфоркивается тяжеловес mod_php;
2) в том месте и процессе, в котором у меня создается событие, я не могу увидеть другие скрипты, которые это событие ждут, и сообщить им его. Или придется задействовать лишнюю сущность в виде IPC. Ресурсы, мыши, плакать, кактус.

С питоном:
1) на каждое соединение создастся пара-тройка не слишком прожорливых объектов;
2) при возникновении события очередь ждущих соединений мне доступна, и достаточно будет попинать их по очереди.
3) Апач не нужен.

shimon ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Кроме языка программирования, сына, есть еще понятие о среде выполнения, модели выполнения и их ограничениях.

Вот для айфона нельзя написать программу так, чтобы она могла уходить в фон. Хотя язык — все тот же Objective C. Тоже такой, как остальные, делает ровно то, что напрограммируешь.

Но третьесторонняя программа для iPhone OS, написанная на вот этом самом языке, почему-то все равно не может уйти в фон и в нем работать.

shimon ★★★★★
() автор топика
Ответ на: комментарий от shimon

> да, на каждое соединение отфоркивается тяжеловес апач

Юзай префорки, или тредовый апач. Я вообще не это имел в виду.

> отфоркивается тяжеловес mod_php

Даааа?

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

кактус плакать ресурсы мыши у того, кто юзать такие запросы как ты опейсал. А вот от того, что ты байтик-другой через IPC перекинешь, волосы у тебя с лобка как раз не повыпадут.

> С питоном: > 3) Апач не нужен.

Ну ты и на пыхпе можешь сервер написать. Ты реши чо те надо-то, мужик.

anonymous
()
Ответ на: комментарий от anonymous

> Даааа?

Некорректно выразился. Инициализируется среда выполнения для нового скрипта.

shimon ★★★★★
() автор топика
Ответ на: комментарий от anonymous

> Юзай префорки, или тредовый апач.

Треды у нас нынче сильно дешёвые стали что ли?

Legioner ★★★★★
()

А не подскажешь конкретнее, чем это на питоне реализуется? Мне как раз в ближайшее время понадобится такая функциональность

temp
()
Ответ на: комментарий от shimon

> Некорректно выразился. Инициализируется среда выполнения для нового скрипта.

А под пятоном она не инициализируется?

anonymous
()
Ответ на: комментарий от Legioner

> Ещё Jetty (Java) как то хитро соединения держит, не тратя потоков. Как раз для таких случаев.

Ты можешь себе представить как такое можно сделать?

anonymous
()
Ответ на: комментарий от anonymous

> А под пятоном она не инициализируется?

Аж один раз на самом-самом старте. На каждом новом соединении питон-то не запускается вновь. Это тебе не CGI.

shimon ★★★★★
() автор топика
Ответ на: комментарий от temp

> А не подскажешь конкретнее, чем это на питоне реализуется? Мне как раз в ближайшее время понадобится такая функциональность

Лично я хочу наколбасить сервер приложений с помощью Divmod Nevow + Mantissa + ExtJS для клиентской части. Гугль в помощь.

shimon ★★★★★
() автор топика
Ответ на: комментарий от Legioner

Подробнее. Вот от броузера пришёл GET запрос какому-то джава-классу: classname.processingthread?command=tellMeWhenItWillHappen&eventid=10080023

Как сервер определит, что не надо создавать поток-обработчик этого запроса, а просто отложить его до наступления события о котором один только тот класс и знает что это за событие?

anonymous
()
Ответ на: комментарий от shimon

> На каждом новом соединении питон-то не запускается вновь.

Каждый новы запрос наследует данные, испорченные обработчегом предыдущего запроса?

anonymous
()
Ответ на: комментарий от anonymous

Не знаю точно, как в джаве, в питоне я могу полностью определить поведение сервера. Потому что это, гля, не апач. Соответственно, делаю субкласс HTTP-сервера с соответствующей обработкой вот таких GET'ов (создать респонс, добавить в очередь и т. д.), он и будет у меня слушать соединения.

shimon ★★★★★
() автор топика
Ответ на: комментарий от anonymous

> Каждый новы запрос наследует данные, испорченные обработчегом предыдущего запроса?

Чесслово, ты тупой какой-то.

О том, что можно иметь кастомный веб-сервер, который знает, как ему что обрабатывать, ты даже мысли не допускаешь? У тебя фантазия на Apache (на крайняк еще на nginx) оканчивается?

shimon ★★★★★
() автор топика
Ответ на: комментарий от shimon

> Чесслово, ты тупой какой-то.

Каждый новый запрос наследует данные, испорченные обработчегом предыдущего запроса или нет?

> О том, что можно иметь кастомный веб-сервер, который знает, как ему что обрабатывать, ты даже мысли не допускаешь? У тебя фантазия на Apache (на крайняк еще на nginx) оканчивается?

А это ты со своим сисадмином обсуди - вобуждает его идея обслуживать твои самиписнутые веб-сервера или он предпочёл бы обслуживать стандартное окружение.

anonymous
()
Ответ на: комментарий от shimon

> Это тебе не CGI.

mod_пых - это тоже не CGI.

anonymous
()
Ответ на: комментарий от anonymous

> Каждый новый запрос наследует данные, испорченные обработчегом предыдущего запроса или нет?

Приведи пример, как обработчик может испортить данные, что негативно воспримется следующим обработчиком (хотя здесь один обработчик, вообще-то, который через select в цикле все обрабатывает).

> А это ты со своим сисадмином обсуди - вобуждает его идея обслуживать твои самиписнутые веб-сервера или он предпочёл бы обслуживать стандартное окружение.


А сисадмин не должен вообще этим перениматься, если приложение в интранете (он ставит некоторую нужную аппликуху, у аппликухи среди прочих морд есть веб-морда, если у него с этим половые проблемы — его увольняют), и тем более, если я его ставлю на интернет-сайт (тогда у меня VPS/dedicated/co-lo, а я в нем царь и бог).

shimon ★★★★★
() автор топика
Ответ на: комментарий от shimon

> Не знаю точно, как в джаве

Еснно. Поэтому вопрос был не к тебе, а кэтому пустобрёху по кличке Legionner

anonymous
()

Держать открытое соединение - это ужос. Я, тут, который год изо всех сил только и стараюсь как можно скорее отпнуть клиента, пусть он меня будет 500 раз дёргать, чем держать одно открытое постоянное соединение... :D

Пусть у тебя Ajax дёргает сервер хоть раз в секунду - нагрузка будет меньше, чем постоянный коннекшн.

Заодно автоматом защитишься от проблемы потери соединения.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

посчитай сколько траффика уйдет на одни только заголовки, если клеинт будет пинать раз в секунду. не дело это.

temp
()
Ответ на: комментарий от shimon

> Приведи пример, как обработчик может испортить данные, что негативно воспримется следующим обработчиком (хотя здесь один обработчик, вообще-то, который через select в цикле все обрабатывает).

Да как угодно. Установит например переменную в окружении процесса.

> А сисадмин не должен вообще этим перениматься, если приложение в интранете (он ставит некоторую нужную аппликуху, у аппликухи среди прочих морд есть веб-морда, если у него с этим половые проблемы — его увольняют), и тем более, если я его ставлю на интернет-сайт (тогда у меня VPS/dedicated/co-lo, а я в нем царь и бог).

У сисадмина есть политики, следовать которым он тебя заставит. Или тебя увольняют. То, что делают всякие девелоперы - должно быть в первую очередь контролируемо. Иначе такие разработчики, которые делают какую-то бессистемную хрень, которой управлять невозможно - нахрен предприятию не нужны. Ни в интранете, ни в интернете. Это ты в путяге у себя для курсовика можешь выпендриваться, а индустрия не нуждается в таких как ты.

anonymous
()
Ответ на: комментарий от temp

> сколько траффика уйдет на одни только заголовки,

А ты прикиь на скольких OSI-уровнях будет резервироваться системная память под каждое соединение.

anonymous
()
Ответ на: комментарий от anonymous

А где ты OSI увидел? Его реализовали один раз, и то для порядку. Сейчас больше TCP/IP популярно. Или крутые сисадмины ещё не прослушали лекции по сетям?

Legioner ★★★★★
()

Вот задачка, которую предлагается решить с помощью пыха недалекому троллю.

Проводится онлайн-игра. Участники загружают некоторый HTML. В некоторый час «Ч», никому не известный заранее, участникам будет отображен некоторый код. Кто скопипастит его в форму и отправит первый, получит какой-то приз (дом на Багамах и бабу рыжую, например).

Требования. Страничка не должна перезагружаться. В реальном (максимально близком к таковому) времени на страничке должна отображаться информация о том, сколько человек присоединилось к игре (и сколько ушло из игры — окошко браузера захлопнули, скажем). Код находится в текстовом файле, который админ кладет в заранее известную директорию. Сервер должен следить за изменениями в директории и отдать всем участникам содержимое первого появившегося там файла.

Клиентская часть должна использовать COMET, чтобы получать события, серверная — inotify для слежения за директорией. Периодический поллинг недопустим ни на одной стороне, события должны обрабатываться как можно быстрее по мере поступления.

У тролля есть Linux, Apache и PHP. Стандартное окружение, которое так любят сисадмины.

shimon ★★★★★
() автор топика
Ответ на: комментарий от temp

>посчитай сколько траффика уйдет на одни только заголовки

Ну, скажем, несколько десятков байт на запрос. Ну, пусть все 1500 байт одного TCP-пакета (скажем, у нас это домен с кучей куков (хотя нафига?))

1500 байт в секунду, 5Мб/час. У клиента dialup? GPRS? Так тогда ему постоянный коннект с сервером вообще противопоказан!

Ну, хорошо, вон, в первом сообщении автор готов до раза в сутки(!) дёргать. Будем дёргать раз в 10 секунд - 0,5Мб/час - это как? Неужели даже такое не потянем? :D

KRoN73 ★★★★★
()
Ответ на: комментарий от Legioner

> Подробнее здесь: http://docs.codehaus.org/display/JETTY/Suspendable+Requests

> Я особо не разбирался, как оно точно сделано.

Прочитал страницу на которую ты сослался. Какой-то маркетинговый бред, не дающий ответа на поставленный вопрос.

anonymous
()
Ответ на: комментарий от shimon

>Требования.

Автоматически отпадают сразу почти все пользователи из-за proxy и многие - за NAT'ом.

А вот периодический опрос сервера позволит хоть по GPRS сидеть и ждать.

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

> У сисадмина есть политики, следовать которым он тебя заставит. Или тебя увольняют.

Ты не путай. Здесь два варианта.

1) я босс, сисадмин админит то, что нужно мне, либо идет нах#$
2) я плачу деньги за то, чтобы админили то, что нужно мне, либо я шлю их нах#$
3) мне заплатили за разработку аппликации, если админ заказчика откажется проапдейтить политику и с ней работать — его пошлют нах#$.

Если следовать твоим правилам, то напрашиваются такие выводы:

1) анонимусу неизвестны никакие предприятия, кроме быдло-шаред-хостинговых;
2) анонимус работал в конторе, где админ пытался причесать всех под гребенку shared hosting;
3) в идеальной конторе анонимуса на серверах стоит девственно чистая OpenBSD, которая ничего не делает вообще, кроме почты, прокси и DNS.

shimon ★★★★★
() автор топика
Ответ на: комментарий от Legioner

> А где ты OSI увидел? Его реализовали один раз, и то для порядку. Сейчас больше TCP/IP популярно.

TCP/IP - это четвёртый уровень абстракции в модели OSI.

> Или крутые сисадмины ещё не прослушали лекции по сетям?

Уходи туда: http://en.wikipedia.org/wiki/TCP/IP

..и не возвращайся пока дурь из тебя не выйдет :)

anonymous
()
Ответ на: комментарий от KRoN73

> Автоматически отпадают сразу почти все пользователи из-за proxy и многие - за NAT'ом.

Как это повлияет?

Как работает вебовский Google talk? А он, сцуко, работает, за NAT'ом работает, за проксями работает, с жопорезом работает, на события реагирует моментально, да еще и трафик очень умеренно потребляет. Чудеса, да и только.

shimon ★★★★★
() автор топика
Ответ на: комментарий от Legioner

> Ну ты по ссылкам походи, скачай пример, изучи, что же ты сразу сдаёшься.

Спасибо, дорогой. Ща всё брошу и пойду по ссылкам бродить только потому, что какой-то тролль тут фигни напердел

anonymous
()
Ответ на: комментарий от shimon

> Как работает вебовский Google talk? А он, сцуко, работает, за NAT'ом работает, за проксями работает, с жопорезом работает, на события реагирует моментально, да еще и трафик очень умеренно потребляет. Чудеса, да и только.

Ну и как он по-твоему работает? :)

anonymous
()
Ответ на: комментарий от anonymous

> Да как угодно. Установит например переменную в окружении процесса.

Ну и что? Процесс не имеет права сам себе переменную окружения установить, потому что он же, малахольный, на следующей итерации о ней забудет?

shimon ★★★★★
() автор топика
Ответ на: комментарий от shimon

> он же, малахольный, на следующей итерации о ней забудет?

А почему он о ней забудет, идиот? Потому, что будет переинициализирован.

anonymous
()
Ответ на: комментарий от shimon

> Я уже описал в самом-самом верхнем посте.

Ты там пейсал: "Аяксом клиент делает conduit request к серверу, и тот держит соединение до тех пор, пока не придет событие"

Это и есть та модель, про которую тут все тебе и говорят.

anonymous
()
Ответ на: комментарий от anonymous

> А почему он о ней забудет, идиот? Потому, что будет переинициализирован.

А вот с какой стати он будет переинициализирован?
У тебя в простом цикле for, в котором ты, например, вычисляешь число пи или построчно читаешь файл, на каждой итерации программа переинициализируется?

shimon ★★★★★
() автор топика
Ответ на: комментарий от shimon

>Как это повлияет?

Элементарно. Почти все прокси и некоторые NAT рвут долгоживущие TCP-соединения. Даже при keepalive.

>Как работает вебовский Google talk?

Чудес не бывает :)

watch 'netstat -p|grep google'

У меня хорошо видно, что раз в несколько секунд он обновляет соединение.

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.