Как работают потоки.

Redjik

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

Не ясно как выделяется память.
И как обрабатывается сам поток.
 

Redjik

Джедай-мастер
все, что ресурс...

- вытащили инфу с бд - получили поток, который потом через различные fetch_row распарсили
- открыли поток файла через fopen
- открыли соединение через соккет
- открыли поток типа "php://input" http://php.net/manual/en/wrappers.php.php через тот же fopen

С последним примером как раз большинство вопросов... не совсем понимаю как xml-pipe работает, когда файл отправляю с браузера...
Я так понимаю открывается соединение, и браузер держит открытым соединение и видит что поток считывается, когда скрипт начинает обработку ($handler = fopen("php://input", "r"))
 

MiksIr

miksir@home:~$
Браузер соединяется с веб-сервером, плюет ему данные, тот соединяется с php (например, в случае с fastcgi) плюет ему данные, php ассоциирует это соединение с внутренними именами.
Это так, для затравки, на самом деле не понятно чего ты хочешь. Изучай tcp/ip - все поймешь ;)
 

Redjik

Джедай-мастер
Ага, буду osi еще раз штудировать.

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

Вот примеры, которые за гранью моего понимания + инфу не могу найти касательно механизмов работы - вообще.

1) Отправка файла по xmlhttprequest. На момент отрабатывания скрипта весь ли файл находиться на сервере... или скрипт запускается при коннекте и поток парсится по ходу скрипта.
2) Работа с бд, query возвращает поток, опять же - у нас уже все данные или нет? или во время fetch_row бд продолжает отправлять данные

Возможно очень косоязычно объясняю - извиняюсь за это.

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

MiksIr

miksir@home:~$
1) Зависит от прослойки - веб-сервера. Прослойка может принять POST, и только после этого сделать коннект в PHP и передать POST ему. Или сразу сделать коннект в PHP и передавать что пришло сразу дальше. Разницы для PHP - никакой. PHP в свою очередь сначала примет весь POST (все файлы), проанализирует, разложит по полочкам и только после этого перейдет к исполнению команд скрипта. Т.е. да, в момент срабатывания _скрипта_ - весь файл уже на диске.
2) Честно тут не знаю, нужно смотреть драйвера. Теоретически могут быть оба варианта.
 

Ragazzo

TDD interested
Redjik
Смысл тебе штудировать osi? php там работает наверное на уровне прикладных программ, или какой там последний.
MiksIr
вроде php запускается тогда, когда сервер весь файл принял.
 

Redjik

Джедай-мастер
Ragazzo
да давно не пересматривал, может что-то новое откроется =)
 

MiksIr

miksir@home:~$
Redjik
Смысл тебе штудировать osi? php там работает наверное на уровне прикладных программ, или какой там последний.
MiksIr
вроде php запускается тогда, когда сервер весь файл принял.
PHP запускается тогда, когда его запустили =) Т.е. по сути к PHP отношения не имеет - вопрос к тому, кто его запускает.
Но с точки зрения эффективности, защиты от DOS и т.п. - лучше, конечно, когда веб-сервер принимает все, и только потом подсоединяется к PHP. nginx так и поступает, да.
 

Redjik

Джедай-мастер
ну nginx поэтому и юзают как реверс сервер, по крайней мере я юзаю только статику отдавать + как реверс сервер
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
ресурс и поток - это разные вещи
тема звучит бессмысленно, задай вопрос - какое именно выражение в документации тебе непонятно
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
MiksIr проблема в том, что понятие "tcp соединение" тоже не определено.
речь о tcp-сессии? между какими узлами?

вытащили инфу с бд - получили поток
соединение открывается еще до запроса, а когда "вытащили" - соединение уже не нужно
открыли поток типа "php://input"
а это вообще никак не относится к tcp
 

A1x

Новичок
Он "потоком" называет tcp соединение ;)
может быть стандартные потоки ввода/вывода - stdin, etdout, stderr?

по традиции тело POST запроса веб сервер передает скрипту на stdin
при обычном аплоаде файлов они передаются в теле POST запроса как multipart-form-data
xmlhttprequest еще может передавать файл POST запросом просто в бинарном виде, тогда его можно получить в пхп как file_get_contents('php://input')

2) Работа с бд, query возвращает поток, опять же - у нас уже все данные или нет? или во время fetch_row бд продолжает отправлять данные
см. mysql_unbuffered_query, к потокам не имеет отношения

кроме стандартных еще есть пользовательские потоки, которые регистрируются stream_wrapper_register

еще есть потоки которые threads - но это из совсем другой оперы :)
 
  • Like
Реакции: WMix

Redjik

Джедай-мастер
A1x
дак когда мы получаем xmlhttprequest ... файл уже таки полностью на сервере? =)

+ ага threads для форков, я вопрос задавал именно по инпутам.
 

A1x

Новичок
A1x
дак когда мы получаем xmlhttprequest ... файл уже таки полностью на сервере? =)
в общем случае нет, но
php://input is not available with enctype="multipart/form-data".
в этом случае да, пхп получит управление только после того как весь ввод принят, разобран, сохранены временные файлы
и соответственно инициализирована переменная $_FILES

если в POST передается не multipart/form-data то это можно читать через fopen("php://input", "r")

заодно спрошу (вдруг кто знает) какой был смысл делать отдельно php://stdin и php://input и какая между ними разница?
то же самое - php://stdout и php://output
 

Redjik

Джедай-мастер
A1x
Не я как раз спрашивал про xmlhttprequest, значит работает по тому же принципу, что соккеты?

Остался последний невыясненный вопрос - сам проверю его, но все же пускай он в этой ветке прозвучит.
При открытии файла через fopen - файла в памяти нет - есть только положение handler в файле... и при считывании строк мы получаем ТОЛЬКО строку?

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

A1x

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

Redjik

Джедай-мастер
Ragazzo
я в сях не очень, сейчас яву смотрю, но наверное уже стОит заняться, ага =)
 
Сверху