Pull to refresh

Comments 57

Радует, что PHP становится более универсален.
Подождите сейчас набегут рубисты скажут «похапе говно, я на нем писцал 5 лет назад, ничего не изменилось» :)
С точностью до наоборот.
Я не рубист. Похапэ не говно. Писал я на нем последний раз не 5, а 2,5 года назад.
И в нем все изменилось с того момента как я первый раз пытался разобраться со скриптом ( лет 7 назад, тогда еще php 4 был очень распространен). Раньше можно было подобрать десяток различных функций для выполнения одной операции с каким угодно порядком аргументов и любым методом именований функций. А теперь задачи можно решать еще и десятком различных парадигм и с помощью десятка способов записи.

p.s. прошу менч извинить тех, чьи религиозные чувства были задеты
Какие религиозные чувства? Здесь по-вашему фанатики PHP собрались? Тут сидят умные люди, работающие головой, и понимающие, что это просто инструмент… надеюсь.

Сейчас PHP действительно очень изменился. Я бы даже это назвал другим языком (PHP4 != PHP5 != PHP5.4 — это не булева алгебра:) ), настолько серьезные изменения в подходах.
>Какие религиозные чувства?
Не знаю какие, но народ оценил)) -17 за пост и -8 в карму

p.s. ухожу, ухожу, ухожу, а то совсем тухлыми помидорами закидают))
Кухонный комбайн со встроенной подводной лодкой на солнечных батареях
<sarcasm>Теперь на PHP можно написать ОС уровня Windows 3.11</sarcasm>
Товарищи, я сам пишу на PHP, если что, причём очень давно и считаю его неплохим языком :). Если кто-то вдруг не понял, корутины добавляют поддержку сохранения _состояния_ выполнения функции, что дает возможность написать что-то вроде ОС, как например Windows 3.11. Если правильно реализовать все блокирующие вызовы, то оно даже будет работать. Если кто-то не согласен, что PHP не годится для написания более сложных ОС, прошу привести аргументы :).
Ну, ОС можно написать и на JS, если суметь его скомпилировать (вместе с интерпретатором:) ) так, чтобы он ловил прерывания.
На самом деле генераторы действительно очень крутая штука, первый раз столкнулся с ними в питоне и сразу не совсем понял зачем они мне вообще нужны пока не научился ими пользоваться.
Кстати замечу что код (понимаю что это пример, но все-же):

$data = (yield $socket->read(8192));

может все-таки зависнуть. Сокет может получить менее 8192 байт и вернет ошибку.
Вроде как нет:

Reading stops as soon as one of the following conditions is met:
— length bytes have been read
— EOF (end of file) is reached
— a packet becomes available or the socket timeout occurs (for network streams)
— if the stream is read buffered and it does not represent a plain file, at most one read of up to a number of bytes equal to the chunk size (usually 8192) is made; depending on the previously buffered data, the size of the returned data may be larger than the chunk size.

fread()
Не зависнет, а вернёт меньше чем 8192 байт. Поэтому при работе с неблокирующими сокетами нужно проверять сколько данных считалось и если меньше, чем просили — снова вставать в очередь на чтение.
в настоящее время внедряю использование сопрограмм в разных своих сервисах (на Си)
спасибо, что показали нам эту возможность для РНР…

думаю пригодится
А кто-то может объяснить, зачем нужны (в практическом применении) корутины, ну помимо написания таскменеджера, который, почему-то видится в php как немного чуждая вещь?
Итератор в меньшее количество строк, например. И с двусторонней связью.
Это вы сейчас про корутины или генераторы? С генераторами-то всё понятно, я их сразу оценил. Не понятно с корутинами.
корутины применяются для псевдо-распараллеливания кода, так как пхп не поддерживает треды…
распараллеливание выгодно там, где есть операции в/в:
пока одна коротина занята приемом/отправлением данных — другая коротина может какие-то другие данные обработать.
один из вариантов использования — это мультиплексный асинхронный сервер

единственное, что хотелось бы увидеть от автора: это реализация двух серверов — один на libevent, воторй на коротинах и измерить их эффективность ( память, кол-во обработанных соединений за сек… )

я понимаю что это тема отдельной статьи, но све же может кто возмется???
Только в один момент времени работает только одна корутина, в нашем случае сокеты сами отрабатывали в буффер, а потом считывались.
Т.е., речь-таки не об обычном применении php, а об узкоспециализированном.
да, как и применение либэвент — чисто в узкоспециализированном применении
скажите мне, как можно организовать паралельность,
если в исходниках ни одной phtread функции.
Что-то плохо вы смотрели, есть они там, вот например.
нда… слона-то я и не увидел…
рад за многопоточность в РНР!
спасибо за подсказку использования этого расширения…
достоинство коротин (не в пхп) в том, что они позволяют распараллелить код, без накладных расходов в однопоточной модели. При этом всегда будет занято только одно ядро процессора, в отличие от тредовой модели. При реализации многотредовой модели появляются проблемы в синхронизации, затраты ресурсов на переключении контекста приложения между тредами и т.п…
считается что в ряде задач, решения на коротинах — эффективнее.
еще корутины могут быть нужны при распределение вычислений между несколькими серверами задач:
родили несколько коротин, которые отправили данные на разные сервера задач: например обработка машинный перевод или распределенный поиск… далее переключая контекст коротин мы смотрим статусы задач и отдаем уже результат
Один к одному yield из питона (даже api генераторов то же). Странно, что об этом не упомянули в статье.
Более того, отсутствует поддержка yield from, который позволяет не дублировать код, а выносить части генераторов в отдельные генераторы.
Как бы, генератор — это довольно общий концепт и он есть в крайне большом количестве языков. Да и весь implementation-specific апи тут — это метод send, не сильно много сходств.
Очень полезная статья. И в целом PHP движется в верном направлении :)
Надеюсь выход php5.5 сподвигнет к обновлению хостеров хотя бы до 5.4
Ленивые shared-хостеры, которым западло давать последнюю версию php клиентам в век тотальных облаков и VPS/VDS? Они там живы еще, что ли?
Ну справедливости ради стоит сказать, что многие сейчас боятся обновляться до 5.4, т.к. APC в ногу с трейтами любят падать сегфолтами.
У меня есть два вопроса:
Генератор обязательно должен быть глобальной функцией? Он может быть замыканием?
Когда релиз php 5.5? :)
Релиз обещали в феврале-марте, если сроки не сдвигались.
Нет, насколько я помню генератором может быть любая фукнция (метод, анонимная функция).
А я все жду нормальные getters & setters, текущее извращение с __* надоело :(
Что за «корутины»? «Сопрограммы» нормальный же перевод. Почему только в заголовке.
Я знаю, таких как я не любят, но я не люблю многие русские слова. Некоторые из них просто до смешного ужасно звучат и их очень неудобно использовать в тех-литературе, например «сопрограмма», «область видимости» (scope — куда проще), «поток исполнения» (нифига не понятно, что имеется ввиду), и т.д..
Ясно, что не удобно использовать русские термины, но если пользоваться английскими, то их можно уж и оригинально писать, а не делать транслитерацию.
Скакать с раскладки на раскладку очень не приятное занятие, а еще мне нравится слово «корутина», напоминает мне «аскорутин» — вкусные витаминки, которые я люблю.
«Сопрограмма» ужасно звучит? О_О
Странно. А «подпрограмма», «сопроцессор» как, нормально? Приступов паники не вызывают? :)
Адекватные аналоги на русском можно и нужно использовать, как бы ужасно, по чьему-либо мнению, они не звучали. Чего не стоит делать, так это мешать «coroutines», «сопрограммы» и «корутины» в одном месте.

Калькирование «корутины» уже плохо тем, что провоцирует лингвистически неискушенного человека на ошибки при склонении.

В остальном перевод читается довольно гладко. Спасибо.
ОМГ, да вы посмотрите на это. Парсер PHP исчерпал себя. Для объявления джоин поинтов был внедрён отдельный синтаксис. А что будем делать с клиентом? Ах да, давайте теперь функция, которая вроде бы функция вдруг станет специальным объектом со специальным интерфейсом.

Кто мешал заимплементить операторы <</>>? Ой, так они же уже используются для бинарного сдвига. А что делать? Так давай в лоб сделаем, как получается. Думать некогда.
Ради этого ранта я даже компьютер включил.
Кстати не в первый раз тебя вижу в треде, но, как и в прошлый раз, больше чем просто побросаться словами ты не можешь.

> Парсер PHP исчерпал себя
Открыл америку. Парсер пхп делает все на лету, конечно он паршивый до нельзя, но он никуда не исчерпывал себя, он всегда таким был. В будущем собираются сделать AST-based парсер.

> Для объявления джоин поинтов был внедрён отдельный синтаксис
Каких джоин поинтов? где отдельный синтаксис? Джоин поинты относятся к АОП, причем тут генераторы?

> Ах да, давайте теперь функция, которая вроде бы функция вдруг станет специальным объектом со специальным интерфейсом.
Функция — не объект. Функция при вызове возвращает объект. Также сделано, например, в шарпе. Это очень даже логично.

>> Кто мешал заимплементить операторы <</>>?
Для чего? Я бы не хотел, чтобы эти операторы использовались для чего-то другого, кроме сдвига. Впрочем да, перегрузки операторов в юзерлэнде пхп не хватает.
Не туда ответил. смотри комментарий ниже.
Каких джоин поинтов? где отдельный синтаксис? Джоин поинты относятся к АОП, причем тут генераторы?
А чем yeild не отдельный синтаксис, так же как echo к примеру? Уж не знал я как назвать точки приёма и отправки сообщений.
Для чего? Я бы не хотел, чтобы эти операторы использовались для чего-то другого, кроме сдвига.
Да, для того же для чего был реализован yeild. Целостность. А так с одной стороны получается один подход, а с другой — другой.
Планировщик, для которого был написан пример, может быть выполнен
при помощи расширения ev:

<?php
$w1 = new EvIdle(function ($w) {
	(--$w->data[0] <= 0) and $w->stop();
	
	echo "Task 1, i = ", $w->data[0], PHP_EOL;
}, array (10));

$w2 = new EvIdle(function ($w) {
	(--$w->data[0] <= 0) and $w->stop();
	
	echo "Task 2, i = ", $w->data[0], PHP_EOL;
}, array (5));

Ev::run();
?>


Небольшие примеры.

Слежение за доступностью сокета, файла или другого узла может быть выполнено с помощью
EvIo. Асинхронные файловые операции
можно также выполнять, например, через eio_read, eio_write, eio_sendfile и др.
Классно, на самом деле под пхп есть много хороших расширений, но многие обходятся вниманием. Видимо осадок у людей остался от шаред хостингов, мол расширения там не будет — не запустишь приложение.
UFO just landed and posted this here
Sign up to leave a comment.

Articles