директива php include из файлов fifo (именованный канал) - PullRequest
3 голосов
/ 03 сентября 2011

Я искал способ использовать оператор "include", используя файл fifo (именованный канал), созданный с помощью posix_mkfifo. Поскольку мои ожидания были высоки, я очень расстроился, увидев, что страница заблокирована, ожидая действия, которое, я уверен, никогда не произойдет.

Итак ... моя логика продиктовала, что в качестве "include" обязательно используется какая-то функция "fopen" -семейства, и fifo можно открыть таким образом, единственное, что мне нужно было сделать: создать один, а затем написать в нем , возможно, сохранить ресурс живым, пока он не будет включен, включить файл, закрыть обработчик, удалить файл. Но, конечно, ничего подобного не было. Я полагаю, что include открывает файл блокирующим образом, и это является причиной моей проблемы. Поработав с fifos в c, я заметил, что в неблокирующем открытом методе информация в fifo сохраняется до тех пор, пока читатель не решит ее прочитать. Я надеялся на такое же поведение.

Несмотря на то, что я пытался открыть другую страницу для записи в тот же fifo, чтобы читатель мог продолжить, это тоже должно было произойти. Кроме того, не только страница больше не отвечала, но и не могла ответить на прерывание пользователя, а также потому, что мои сеансы были заблокированы на несколько минут, так как session_start () сообщит мне, что не может использоваться двумя процессами в один раз (я могу ошибаться в сообщении об ошибке, хорошо помню, и я удалил тестовые файлы.)

У меня вопрос, есть ли способ достичь этого эффекта: включая использование fifo.

В конце концов, Отвечая на все вопросы о том, почему, черт возьми, я это делаю, я скажу, что моя система ставит себя между реальным кодом и его обработкой с целью его динамического изменения по необходимости, полностью обратимым. И для этого ему нужно прочитать исходный файл, проверить код, изменить его, когда он кажется, а затем записать его в файл, в новую «корневую» папку, сохранить иерархию папок и файлов и затем «включить» файл , На данный момент я заменил использование fifo на использование реальных файлов, но мне нужно отфильтровать много кода. И eval, хотя и чрезмерно используемый в моих функциях, не является решением, так как он не сохраняет текущий каталог и имя скрипта, или что-то специфическое для реального файла, кроме того, что он очень чувствителен ко многим вещам, особенно с относительными путями, и странное использование синтаксиса PHP. Так что я все еще застрял с записью в файлах.

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

С уважением, Пол

1 Ответ

0 голосов
/ 03 сентября 2011

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

stream_wrapper_register("myfilter", "WrapCode");

include('myfilter://path-to-include');

# or

include('myfilter://file://path-to-include');

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

В руководстве по PHP приведен пример с простым потокомкласс оболочки , который показывает, как это работает.

...