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

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

Я внимательно слушаю, как это _эффективно_ замутить с вебсервером общего назначения и скриптовым языком поверх оного. Особенно учитывая тот момент, что событие придет хрен знает откуда, хрен знает когда.

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

> А вот с какой стати он будет переинициализирован?

Что бы не было того, о чём мы говорим.

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

>Я внимательно слушаю, как это _эффективно_ замутить с вебсервером общего назначения и скриптовым языком поверх оного.

Тебе уже сказали - раз в секунду (если слишком накладно - раз в 10 секунд) поллить сервер.

Средней паршивости Celeron в таком режиме (будучи выделенными, естественно) непринуждённо потянет несколько тысяч клиентов.

А вот с постоянными соединениями - редко какой Apache хотя бы несколько сот клиентов вытянет :) А уж сколько он памяти сожрёт на эти сотни соединений...

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

Что значит _эффективно_? То, что ты затеял - нельзя реализовать эффективно. О чём тебе опять же все тут говорят.

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

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

Чо там, вон мой домашний dlink - и тот, похоже, невыносит большого количества одновременных соединений.

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

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

Какой-то у тебя жестокий NAT ;-) Проверь, постоянно ли он пересоединяется или сервер ему кипэлайвы шлет (которые в любом случае поменьше).

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

> А вот с постоянными соединениями - редко какой Apache хотя бы несколько сот клиентов вытянет :) А уж сколько он памяти сожрёт на эти сотни соединений...

Так и я о чем — без спецсредств ты на LAMP'е этого не сделаешь. Но сделаешь со спецсредствами. Коими может быть не вебсервер с примочкой в виде приложения, а приложение с примочкой в виде веб-интерфейса.

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

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

> Что значит _эффективно_? То, что ты затеял - нельзя реализовать эффективно. О чём тебе опять же все тут говорят.

Это не ты тут во втором или третьем посте говорил, что можно, просто я пых не умею готовить?

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

> Это не ты тут во втором или третьем посте говорил, что можно, просто я пых не умею готовить?

Да, я говорил. Настрой поддержку keep-alive в апаче. На стороне пыха крути max_execution_time в php.ini и вот это почитай: http://php.net/manual/en/function.set-time-limit.php

.. но делать так всё равно лучше не надо :)

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

>Какой-то у тебя жестокий NAT ;-)

Не у меня, а у некоторых провайдеров. Особенно - у опсосов. Читай внимательнее, что я пишу, не додумывай.

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

>Так и я о чем — без спецсредств ты на LAMP'е этого не сделаешь.

Да. При чём не важно, P == PHP, или Perl, или Python.

>Но сделаешь со спецсредствами.

Сделай. Я посмотрю :)

>Как только начинают становиться нужными спецсредства, PHP уходит в пешее эротическое.

Угу. Шурупы лучше закручивать отвёрткой, а не забивать молотком. Для этой твоей цели уже лучше Erlang привлекать, например.

Или ты по наивности своей считал, что PHP - это затычка в каждую бочку? :)

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

>чииво?

А что, есть кто-то более ориентированный на держание открытыми десятков тысяч коннектов, да ещё каждого в отдельном легковесном треде? Да ещё с возможностью прозрачного масштабирования в кластер, если ресурсов одной машины не хватит? :)

Это же баян же :) - http://www.sics.se/~joe/apachevsyaws.html

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

> Или ты по наивности своей считал, что PHP - это затычка в каждую бочку? :)

Не считал. Но коль скоро он такой вебистый, так почему на нем comet так хреново делать? Ну и shared/persistent objects, как на то пошло, там не очень эффективно реализовываются.

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

>Но коль скоро он такой вебистый, так почему на нем comet так хреново делать?

Потому что идеология Web - отсутствие постоянных соединений.

>Ну и shared/persistent objects, как на то пошло, там не очень эффективно реализовываются.

shared/persistent - у меня во фреймворке используются очень активно. Сериализация и memcached рулят :) Производительность реально на порядок повышается.

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

> shared/persistent objects, как на то пошло, там не очень эффективно реализовываются.

Вот нравится тебе термин "эффективно", хотя смысла этого слова ты не понимаешь..

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

Ды мне Шиму с панталыку не сбивай. Есык - это не веб-сервер всё-ж. А то с него станется какой-нить mod_erland к опачу прикрутить :)

anonymous
()

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

ты на питончике как делать то собрался, а? писать свой веб-сервер. с помощью готовых классов. так ведь, а?

ну так вот. а теперь man PEAR, man HTTP_Server и man php-cli.

садись, двойка.

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

Учить язык бесполезно. Надо пытаться понимать что ты делаешь. Я просто тащусь с этих регистратов - они любого анонимуса готовы троллем обозвать за то, что недостатки линукс системы упомянул, а как до практики доходит - оказывается они просто вообще ни в зуб ногой.. Линукс-хакеры ептыть.

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

>Я просто тащусь с этих регистратов - они любого анонимуса готовы троллем обозвать за то, что недостатки линукс системы упомянул

Кто-то из нас что-то невнимательно читал. И кажется мне, что это был не я. Ткните пальцем, где тут речь шла о недостатках Linux-систем? Или это такой толстый, да-да, троллинг?

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

> где тут речь шла о недостатках Linux-систем?

Это обобщение. Не будете же вы утверждать, что подобным образом регистраты ведут себя только в отношении бедного PHP.

anonymous
()

все предложенное в этом треде естественно гавно, я бы предложил начать обсуждение не с пхп, а насколько лисп превосходит пхп для веба, вы сами только подумайте, какие возможности он вам предоставляет :)

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

Нормальное. Мы же не предлагаем расстреливать каждого регистрата за это. Просто надо иметь в виду особенности их психики.

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

При чём тут ЛИСП? Веб невозможен без сильверлайта, а лисп - это какой-то недоязык, который даже микрософт не имплементировал за ненужностью.

anonymous
()

пхп генерирует события и отдает инфу демону, использующему orbited, который отдает клиентам, ну скажем, по STOMP. на клиенте - orbited.js и js.io. профит?

volh ★★
()

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

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

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

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

И ещё. Уж не на 80-й ли порт ты собираешься повесить этот свой чудо-сервер?

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

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

Че ты им жабу тычешь? Я им уже 4 года ее пиарю, по барабану, они боятся ее как огня, как бабки суеверные второго пришествия и женщины с пустым ведром навстречу. Они думают, что при одновременной обработке 10000 запросов жаба сожрет больше памяти чем их скрипты на PHP. Вообщем плюнь на этих суеверных уродов, все бес толку

anonymous
()

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

Сам аякс по определению прдставляет возможность слать ассинхронные запросы к серверу. Это значит, что отправив запрос клиент может заниматься своими делами, пока не придет событие от сервера иницированное аякс запросом.

Все выглядит логично, кроме таймаута запроса или завершения сессии (в случае "авторизованного запроса")

Здесь ничего не остается как за N-ое время до тайм аута возвращать сервером набор данных с флагом состояния запроса. Если событие произошло флаг=евент + данные, если нет флаг=скоро-таймаут|запроси-снова Клиентская часть принимает ассинхронно этот ответ и реагирует по флагам...

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

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

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

У меня анальное рабство сегодня заканчивается. :)

Речь идет о совершенно другом проекте, который написан намного лучше, с которого есть небольшой, но хороший профит и который мне не западло развивать. Это интранетный проект, сбор данных-статистика-анализ.

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

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

Э... Первый вопрос — ты себе как организационную структуру в данном случае представляешь? Что конторе что-то стало нужно, и они программиста наняли в штат? Гы.
Второй — а что, кастомные сервера приложений с веб-мордами вообще не имеют права на жизнь, «потому что не опач»? (ну да, Ntop идет лесом, нагиос, че там еще с вебмордой — SWAT был когда-то, Webmin, MS Exchange Web Access, GNUe через веб... всего и не упомнишь.)

> И ещё. Уж не на 80-й ли порт ты собираешься повесить этот свой чудо-сервер?


На какой сконфигурячится, на таком и висеть будет.

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

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

Ну, сервер «понимает», что клиент регулярно будет выпадать из-за NAT'а, прокся (который, сцуко, только HTTP/1.0), из-за жопореза, но пока не пройдет неприлично долгое время либо клиент не скажет «бай-бай», для него будет зарезервирован слот, куда события будут помещаться в очередь. Если клиент переконнектится, и события не устареют — он их получит пачкой. Think Jabber: ты перелогиниваешься и получаешь одной большой порцией то, что тебе написали в твое отсутствие.

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

>Если клиент переконнектится, и события не устареют — он их получит пачкой.

Интересно, каким образом?

>Think Jabber: ты перелогиниваешься и получаешь одной большой порцией то, что тебе написали в твое отсутствие.

Т.е. ты предлагаешь HTTP ещё и по другому протоколу пускать? А на web-клиенте проткол этот на JavaScript будешь реализовывать? :)

(Кстати, тогда тем более отпадают все запроксевые офисные клиенты :D)

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

>> А не http://en.wikipedia.org/wiki/Comet_(programming) ли вы тут обсуждаете, братцы?

> Один наконец догадался, это прогрэсс, прогрэсс!

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

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

>> Если клиент переконнектится, и события не устареют — он их получит пачкой.

> Интересно, каким образом?

Да это-то как раз просто. Звонишь на сервер реквестом pleaseReturnMeEverythingHappenedAfter?lastEventId=xxx - и он тебе вернёт все обновления.

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

> Т.е. ты предлагаешь HTTP ещё и по другому протоколу пускать?

Кстати непонятно почему мы всё ещё обсуждаем эту тему. Он уже должен был реализовать приложение за это время.

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

>Он уже должен был реализовать приложение за это время.

Ему интереснее потрепаться, а не реализовать функционал :)

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

> Кстати непонятно почему мы всё ещё обсуждаем эту тему. Он уже должен был реализовать приложение за это время.

В воскресенье реализовывать? С дубу рухнул?

shimon ★★★★★
() автор топика

Ну наконец то флеймотема в веб-девелопменте, а то уже скучно стало.

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

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

ну эта... клиент посылает запрос на mycoolscript.php?time=timeinseconds крипт в цикле ожидает появления файла, если появился - выплевывает клиенту, если до истечения таймаута не появился - идет редирект на mycoolscript.php?time=newtimeinseconds

а ругать php тут бессмысленно, поскольку вина всему протокол HTTP

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

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

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

А ранги важности строятся так: Законодательство->Босс->Юзер->Разработчик->Сисадмин. Стрелки указывают направление раздачи задач. Или направление вставляние первичного полового признака в физиологические отверстия, в зависимости от напряженности ситуации.

no-dashi ★★★★★
()

> Но так как PHP рассчитан на модель «дернули-отдал контент-пшел вон»

А что, в php уже нельзя повисеть 5 минут (половину от таймаута по умолчанию) в ожидании прихода notify, и по его завершении отдать клиенту уведомление "сорри, нчиего не нашел, попробуй еще", а клиент получив такой ответ отправит следующий запрос. Делов-то на пять час с перекурами, на два если без...

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

>А ранги важности строятся так: Законодательство->Босс->Юзер->Разработчик->Сисадмин. Стрелки указывают направление раздачи задач. Или направление вставляние первичного полового признака в физиологические отверстия, в зависимости от напряженности ситуации.

на лицо явное неумение решать задачи подручными средствами, что если завтра быдлокодер придет и скажет: "Чтобы мое поделие не тормозило, его нужно запускать на HP SuperDome"? Босса выгонять, да?

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

> что если завтра быдлокодер придет и скажет: "Чтобы мое поделие не тормозило, его нужно запускать на HP SuperDome"?

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

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

> А вот с постоянными соединениями - редко какой Apache хотя бы несколько сот клиентов вытянет :)

Про что тебе и толкуют. Апач плохо подходит под ajax, в то же время даже скриптоподобный питон в роли кастомарного веб-сервера апач переплевывает.

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от no-dashi

> А что, в php уже нельзя повисеть 5 минут

Посмотри, сколько памяти расходует типовой апач+пхп. Умножь на должное к-во одновременно висящих клиентов. Удивись.

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

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

У глобального и надежного РНР проблемы с тредовым апачем (точнее, у либ, ради которых РНР и юзают).

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