Чтобы определить, почему код PHP не работает в коде JavaScript , нам нужно понять, что такое клиентский и серверный язык и как они работают.
Серверные языки (PHP и т. д.) : они извлекают записи из баз данных, поддерживают состояние через HTTP-соединение без состояния и выполняют много вещи, требующие безопасности. Они находятся на сервере, эти программы никогда не имеют своего исходного кода для пользователя
[/g16] image attr
Хотя с другой стороны Клиентский язык на стороне клиента (например, JavaScript) находится в браузере и запускается в браузере, Сценарии на стороне клиента обычно относятся к классу компьютерных программ в Интернете, которые выполняются на стороне клиента, в веб-браузере пользователя, а не на стороне сервера .
JavaScript отображается пользователю и может быть легко изменен, поэтому для обеспечения безопасности мы не должны полагаться на JavaScript.
Итак, когда вы делаете запрос HTTP на сервере, чем сервер, сначала внимательно читает файл PHP, чтобы узнать, есть ли какие-либо задачи, которые необходимо выполнить, и отправлять ответ на клиентскую сторону и снова, как @deceze сказал * Как только PHP закончил вывод ответа, сценарий заканчивается, и на сервере ничего не произойдет, пока не появится новый запрос HTTP . *
[/g17]
Итак, что мне делать, если мне нужно вызвать PHP? Это зависит от того, как вам это нужно: либо перезагружая страницу, либо используя вызов AJAX.
- Вы можете выполнить перезагрузку страницы и отправить запрос HTTP
- вы можете сделать вызов AJAX с помощью JavaScript, и это не требует перезагрузки страницы
Хорошо Чтение:
mmap отлично, если у вас есть несколько процессов, которые получают доступ к данным в режиме только для чтения из того же файла, что является обычным явлением в типах серверных систем, которые я пишу. mmap позволяет всем этим процессам совместно использовать одни и те же страницы физической памяти, сохраняя большую память.
mmap также позволяет операционной системе оптимизировать операции подкачки. Например, рассмотрите две программы; программа A, которая считывает файл 1 МБ в буфер, создавая с помощью malloc, и программу B, которая копирует 1 МБ-файл в память. Если операционная система должна поменять часть памяти A, она должна записать содержимое буфера для свопинга, прежде чем он сможет повторно использовать память. В случае B любые немодифицированные страницы mmap'd могут быть повторно использованы сразу, потому что ОС знает, как их восстановить из существующего файла, из которого они были mmap'd. (ОС может определить, какие страницы не модифицированы, изначально отмечая записываемые mmap'd-страницы как только для чтения и ломая seg-ошибки, аналогичные стратегии Copy on Write).
mmap также полезен для взаимодействия между процессами. Вы можете mmap файл как чтение / запись в процессах, которые должны связываться, а затем использовать примитивы sychronization в области mmap'd (для этого используется флаг MAP_HASSEMAPHORE).
Одно место mmap может быть неудобно, если вам нужно работать с очень большими файлами на 32-битной машине. Это связано с тем, что mmap должен найти непрерывный блок адресов в адресном пространстве вашего процесса, который достаточно велик, чтобы соответствовать всему диапазону отображаемого файла. Это может стать проблемой, если ваше адресное пространство будет фрагментировано, где у вас может быть свободное место на 2 ГБ адресного пространства, но ни один отдельный диапазон его не может соответствовать отображению файла 1 ГБ. В этом случае вам может понадобиться сопоставить файл меньшими фрагментами, чем вы хотели бы сделать его пригодным.
Еще одна потенциальная неловкость с mmap в качестве замены для чтения / записи заключается в том, что вы должны начать свое отображение на смещения размера страницы. Если вы просто хотите получить некоторые данные со смещением X, вам нужно будет исправить это смещение, чтобы оно совместимо с mmap.
И, наконец, чтение / запись - это единственный способ работы с некоторыми типами файлов. mmap не может использоваться на таких вещах, как трубы и ttys.
Карта памяти имеет потенциал для огромного преимущества по сравнению с традиционным IO. Он позволяет операционной системе считывать данные из исходного файла, когда затрагиваются страницы в файле с отображением памяти. Это работает путем создания страниц с ошибками, которые ОС обнаруживает, а затем ОС автоматически загружает соответствующие данные из файла.
Это работает так же, как механизм пейджинга, и обычно оптимизируется для высокоскоростного ввода-вывода путем считывания данных о границах и размерах системной страницы (обычно 4K) - размер, для которого оптимизированы большинство кэшей файловой системы.
pread
. В Solaris 9 Sparc (V890) доступ к pread между 2 и 3 раза медленнее, чем memcpy
из mmap. Но вы правы, что последовательный доступ не обязательно быстрее.
– Patrick Schlüter
24 May 2010 в 09:25
Одна область, где я нашел mmap (), чтобы не быть преимуществом, - это чтение небольших файлов (до 16K). Накладные расходы на ошибку страницы для чтения всего файла были очень высокими по сравнению с простое выполнение одного системного вызова read (). Это связано с тем, что ядро иногда может усвоить прочитанное полностью в вашем временном фрагменте, то есть ваш код не отключается. С ошибкой страницы казалось более вероятным, что другая программа будет запланирована, что сделает операцию файла более высокой.
malloc
кусок памяти и делает 1 read
. Это позволяет иметь тот же код, который обрабатывает карты памяти, обрабатываемые malloc'ed.
– Patrick Schlüter
24 May 2010 в 09:18
read
были выше, чем накладные расходы на обработку виртуальной памяти.
– Patrick Schlüter
24 May 2010 в 09:36
mmap
должен обновить 4 записи в таблице страниц. Но использование read
для копирования в буфер 16K также включает в себя обновление записей в 4 страницы таблицы, не говоря уже о необходимости копирования 16K в пользовательское пространство addr. Не могли бы вы рассказать о различиях операций на странице таблицы и о том, как это дорого для mmap
?
– flow2k
24 August 2018 в 07:44
mmap
имеет преимущество, когда у вас есть случайный доступ к большим файлам. Другим преимуществом является то, что вы обращаетесь к нему с операциями памяти (memcpy, арифметикой указателей), не беспокоясь о буферизации. Обычный ввод-вывод иногда может быть довольно сложным при использовании буферов, когда у вас есть структуры, большие, чем ваш буфер. Код для обработки, который часто трудно получить, mmap обычно проще. Это говорит о том, что при работе с mmap
есть определенные ловушки. Как уже упоминалось, mmap
достаточно дорогостоящим, поэтому стоит использовать только для заданного размера (от машины к машине).
Для чистого последовательного доступа к файлу это также не всегда лучшее решение, хотя соответствующий вызов madvise
может уменьшить проблему.
Вы должны быть осторожны с ограничения на выравнивание вашей архитектуры (SPARC, itanium), с IO для чтения / записи, буферы часто правильно выравниваются и не ловутся при разыменовании литого указателя.
Вы также должны быть осторожны, чтобы не получить доступ вне карты. Это легко осуществить, если вы используете строковые функции на своей карте, и ваш файл не содержит \ 0 в конце. Он будет работать большую часть времени, когда размер вашего файла не будет кратным размеру страницы, так как последняя страница заполнена 0 (отображаемая область всегда имеет размер кратного размера вашей страницы).
В дополнение к другим приятным ответам цитата из системного программирования Linux , написанная экспертом Google Робертом Лав:
Преимущества
mmap( )
Манипулирование файлами через
mmap( )
имеет несколько преимуществ перед стандартными системными вызовамиread( )
иwrite( )
. Среди них:
- Чтение и запись в файл с отображением памяти позволяет избежать посторонней копии, которая возникает при использовании системных вызовов
read( )
илиwrite( )
, где данные должны быть скопированы в и из буфера пользовательского пространства.- Помимо любых возможных ошибок страницы, чтение и запись в файл с отображением памяти не несет каких-либо системных вызовов или служебных сообщений коммутатора контекста. Это так же просто, как доступ к памяти.
- Когда несколько процессов сопоставляют один и тот же объект в памяти, данные распределяются между всеми процессами. Сопоставления только для чтения и совместного доступа доступны для совместного использования; частные записи, доступные для записи, имеют свои страницы с не-пока-COW (копирование на запись).
- Поиск вокруг отображения включает тривиальные манипуляции с указателями. Системный вызов
lseek( )
не нужен.По этим причинам
mmap( )
является разумным выбором для многих приложений.Недостатки
mmap( )
При использовании
mmap( )
следует иметь в виду несколько моментов:
- Отображения памяти всегда представляют собой целое число страниц в размере. Таким образом, разница между размером файла резервной копии и целым числом страниц «потеряна» в качестве незаполненного пространства. Для небольших файлов значительная часть картирования может быть потрачена впустую. Например, с страницами 4 КБ, 7-байтовое отображение отходов составляет 4089 байт.
- Отображения памяти должны вписываться в адресное пространство процесса. С 32-разрядным адресным пространством очень большое количество отображений различного размера может привести к фрагментации адресного пространства, что затрудняет поиск больших свободных смежных областей. Эта проблема, конечно, гораздо менее очевидна с 64-разрядным адресным пространством.
- В создании и обслуживании сопоставлений памяти и связанных структур данных внутри ядра возникают накладные расходы. Эти служебные данные, как правило, устраняются устранением двойной копии, упомянутой в предыдущем разделе, особенно для файлов с большими и часто доступными файлами.
По этим причинам преимущества
blockquote>mmap( )
наиболее важны реализуется при большом размере сопоставленного файла (и, следовательно, любое потраченное впустую пространство является небольшим процентом от общего сопоставления) или когда общий размер отображаемого файла равномерно делится на размер страницы (и, следовательно, нет пробельного пространства).
MAP_HASSEMAPHORE
специфичен для BSD. – Patrick Schlüter 24 May 2010 в 09:13