#php
Пытаюсь понять многопоточность в PHP.
На одном сайте написано:
Итак, начнем. Для начала закроем потоки STDIN, STDOUT:
fclose(STDIN);
fclose(STDOUT);
fclose(STDOERR);
Вопрос что это такое и зачем его нужно вначале закрывать? И если запускаю скрипт
на локальной машине (денвер), то на эти строки ругается.
Ответы
Ответ 1
STDIN, STDOUT и STDERR - это три специальных файла, которые связываются с терминалом (на Windows - с консолью) в консольных приложениях. Файл STDIN (стандартный ввод) по умолчанию "связан" с клавиатурой - все что вы печатаете на клавиатуре, попадает туда. Файл STDOUT (стандартный вывод) по умолчанию "связан" с монитором - все, что вы запишите в него, вы увидите на экране. Файл STDERR (стандартный вывод ошибок) - это копия STDOUT. Используется для вывода сообщений об ошибках. Такое разделение сделано для того чтобы можно было перенаправлять их по-отдельности. Так, пайпы (конвейеры) командной строки не трогают STDERR - поэтому нормальный вывод идет дальше по конвейеру, а ошибки отображаются сразу на экране. Слово "связан" выше я брал в кавычки, потому что никакой прямой связи на самом деле нет. Формально, все три файла по умолчанию связаны с одним и тем же терминалом, а уже терминал как-то обрабатывает нажатия клавиш клавиатуры и выводит надписи на экран. Закрытие этих файлов в ОС Linux является частью так называемой процедуры демонизации (ухода в фоновой режим), это делается для того чтобы процесс перестал считаться ОС как запущенный на этом терминале. В многопоточных программах эти файлы часто закрываются для того, чтобы "на их месте" открыть новые. Иными словами, это такой способ для программы перенаправить потоки ввода-вывода самой себе. Смотрите пример далее - там обязательно с этими файлами должно что-то еще делаться. Теперь почему у вас пример не заработал. Причины две, и обе причины заключаются в слове "Денвер". Во-первых, как я уже говорил, эти файлы - признак консольного скрипта, а не веб-страницы. Скрипт не надо запускать через Денвер, его надо запускать из консоли: `php путь/к/скрипту.php параметры` Возможно, вам следует поискать главу про запуск php из консоли перед тем как браться за многопоточность. Во-вторых, большинство трюков с этими файлами специфичны для Unix-подобных ОС. Поэтому вам, скорее всего, придется учиться работать с Linux. Это можно сделать аж 4 путями: Самый радикальный вариант - просто взять и поставить себе Ubuntu. Ubuntu - это довольно популярный дистрибутив Linux для десктопов. Большинство веб-проектов делаются под Linux (можно сказать, Linux в вебе - ОС "по умолчанию"), поэтому такой радикальный шаг оправдан. Можно поднять виртуалку и поставить на нее Debian. Этот вариант приближен к тому, с чем придется столкнуться при попытке выложить результат работы на VDS. Debian - это наиболее стабильный дистрибутив Linux, хорошо подходит для серверов общего назначения. Особенно для учебных серверов. Можно получить аналог окружения linux, поставив себе cygwin. Хороший способ понять "что такое терминал в линуксе" без установки линукса. Наверное, самый простой вариант - ведь все файлы находятся на одном и том же компьютере. Если у вас стоит Windows 10 x64 - можно попробовать Windows Subsystem for Linux. Сам я с этим совместный творением Canonical и Microsoft не работал - так что сказать чем этот вариант отличается от варианта с cygwin не могу.Ответ 2
Потоки STDIN/OUT/ERR никакого отношения к понятию многопоточности не имеют. Под многопоточностью обычно понимают выполнение нескольких потоков команд одного приложения одновременно на разных процессорах (ядрах). А STD* потоки - это потоки данных STDIN - стандартный ввод программы (то что приходит при вводе с терминала или от браузера клиента). STDOUT - стандартый вывод - то, куда выводят данные команды echo/print, консоль или сокет отправляющий данные браузеру. STDERR - поток сообщений об ошибках. А вот зачем их закрывать - это надо посмотреть контекст (на том сайте, где вы это прочитали). Закрытие может потребоваться, например для того что бы отвязать программу от управляющего терминала и она стала фоновым процессом операционной системы (выполняется совместно с fork). Или, раз у вас речь про многопоточные приложения, что бы поток выполнения так же оказался независим от терминала операционной системы и, возможно, что бы потом переоткрыл ввод/вывод для общения с другими потоками или процессами.
Комментариев нет:
Отправить комментарий